構内LANを挟む2つネットワークをIPsec拠点間接続し、片側からインターネットへ接続するネットワークの構築

f:id:Aqutam:20190922113133p:plain

図のようにネットワークがあるとする。ネットワークAは、LinuxルータAから構内LANへ接続されている。ネットワークBは、LinuxルータBから構内LANへ接続され、ルータ[192.168.20.1]によってインターネットに接続できる。ネットワークAからインターネットへ接続したい場合、LinuxルータA→LinuxルータB→ルータ→インターネットという経路をたどる。構内LANから直接ネットワークA、ネットワークBへの接続を許可していないとする。この場合、通常のルーティングの設定をしただけでは、Linuxルータ間のパケットはそのまま転送され、構内LANから通信内容を覗く事ができてしまう。そのため、構内LANに流れるLinuxルータ間の通信内容を暗号化する必要がある。そこで、IPsecによって拠点間接続VPNを構築する。

LinuxルータAにはDHCPサーバとDNSサーバの機能を加える。DNSサーバはネットワークBのルータへフォワーディングする。デフォルトゲートウェイは、LinuxルータBのLAN側[192.168.20.2]に設定する。
LinuxルータBは、デフォルトゲートウェイをルータ [192.168.20.1]に設定する。ネットワークBではルータでDHCPサーバとDNSサーバが稼働しているので、LinuxルータBでこれらのサービスを構築する必要はない。

LinuxルータのディストリビューションCentOS 5.4。

ネットワークインターフェイスの設定

LinuxルータA

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
HWADDR=00:00:00:00:00:00
ONBOOT=yes
BROADCAST=192.168.100.255
IPADDR=192.168.100.1
NETMASK=255.255.255.0
NETWORK=192.168.100.0
# vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=static
HWADDR=00:00:00:00:00:00
ONBOOT=yes
BROADCAST=192.168.10.255
IPADDR=192.168.10.1
NETMASK=255.255.255.0
NETWORK=192.168.10.0

LinuxルータB

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
HWADDR=00:00:00:00:00:00
ONBOOT=yes
BROADCAST=192.168.100.255
IPADDR=192.168.100.2
NETMASK=255.255.255.0
NETWORK=192.168.100.0
# vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=static
HWADDR=00:00:00:00:00:00
ONBOOT=yes
BROADCAST=192.168.20.255
IPADDR=192.168.20.2
NETMASK=255.255.255.0
NETWORK=192.168.20.0

IPsec toolsのインストールと設定

IPsecを実装するには、IPsec接続を行う全てのLinuxルータにIPsec toolsのインストールが必要である。
IPsec toolsをインストールすることによって、setkeyとracoonがインストールされる。
setkeyは、カーネル内のIPsecセキュリティポリシーデータベース(SPD)エントリの追加、設定を行う。racoonは、IKEキー管理デーモンで、自動鍵設定によるIPsec接続を行える。
IPsecの設定はIPsec設定ファイルを編集して行い、ネットワークインターフェイス起動時に自動的に接続が行われる。

# wget http://downloads.sourceforge.net/project/ipsec-tools/snapshots/0.8-alpha20090422/ipsec-tools-0.8-alpha20090422.tar.bz2?use_mirror=jaist

※最新版はココから

# tar xjvf ipsec-tools-0.8-alpha20090422.tar.bz2
# cd ipsec-tools-0.8-alpha20090422
# ./configure
# make
# make install

LinuxルータA

# vi /etc/sysconfig/network-scripts/ifcfg-ipsec0
TYPE=IPSEC
ONBOOT=yes
IKE_METHOD=PSK
SRCGW=192.168.10.1
DSTGW=192.168.20.2
SRCNET=192.168.10.0/24
DSTNET=0.0.0.0/0
SRC=192.168.100.1
DST=192.168.100.2

LinuxルータB

# vi /etc/sysconfig/network-scripts/ifcfg-ipsec1
TYPE=IPSEC
ONBOOT=yes
IKE_METHOD=PSK
SRCGW=192.168.20.2
DSTGW=192.168.10.1
SRCNET=0.0.0.0/0
DSTNET=192.168.10.0/24
SRC=192.168.100.2
DST=192.168.100.1

実ネットワークインターフェイスのように、IPsec接続用のifcfgファイルを設定する。ここでは、LinuxルータAの識別名をipsec0、LinuxルータBの識別名をipsec1と設定する。
IKE_METHOD=PSKによって事前共有鍵認証方法を使用する。SRCGWは、送信元Linuxルータの内部ネットワーク側IPアドレスを指定する。DSTGWは、宛先Linuxルータの内部ネットワーク側IPアドレスを指定する。SRCNETは、送信元ネットワークを指定する。DSTNETは、宛先ネットワークを指定する。LinuxルータAのDSTNETが0.0.0.0/0となっているのは、ネットワークAから、ネットワークBを経由して、インターネットへ接続するためである。0.0.0.0/0は全てのネットワークへという意味であり、インターネット向けの宛先IPアドレス不定であるため、このように記述する。ここでもし、LinuxルータAのDSTNETを192.168.20.0/24と書いた場合、ネットワークAからネットワークBに接続できるが、インターネットには接続できない。これは、セキュリティポリシーデータベースには、「送信元が192.168.10.0/24で、宛先が192.168.20.0/24に一致するパケット」として登録されるからである。インターネット向けパケットは宛先IPアドレスが192.168.20.0/24に一致せず不定で、セキュリティポリシーデータベースには不定IPアドレスに対するルールが存在しないため、IPsecカプセル化が適用されない。SRCは、送信元Linuxルータの外部ネットワーク側IPアドレスを指定する。DSTは、宛先LINUXルータの外部ネットワーク側IPアドレスを指定する。

事前共有鍵ファイルを設定する。IPsec接続する2つのLinuxルータでこのファイ ルの内容は同一でなければならない。また、このファイルは読み取り、書き込みができるユーザをrootだけにする必要がある。

# vi /etc/sysconfig/network-scripts/keys-ipsec* 
IKE_PSK=testIKEPreSharedKey

*:IPsec識別名

# chmod 600 /etc/sysconfig/network-scripts/keys-ipsec* 

Linuxルータのインターフェイス間をIPsecパケットが行来できるよう、IPフォワーディングをカーネルで有効にする必要がある。

# vi /etc/sysctl.conf
net.ipv4.ip_forward = 0
↓
net.ipv4.ip_forward = 1
# sysctl -p /etc/sysctl.conf

IKEフェーズ1にて、メインモードのみ使用する場合は以下を全てのLinuxルータに設定する。

# vi /etc/sysconfig/network-script/ifup-ipsec
exchange_mode aggressive, main;
↓
exchange_mode main;

ルータにネットワークAの経路を追加

ルータのルーティングテーブルに192.168.10.0のネットワークへの経路を追加する必要がある。LinuxルータBをネクストホップとして追加する。この設定をしないと、インターネットから帰ってきたネットワークA宛のパケットをルータは転送することができず、ネットワークA上のクライアントは正常な通信を行うことができない。

IPsec接続の開始

IPsec接続を開始するには、Linuxルータを再起動するか、ifupコマンドでipsecバイスを起動させるか、ネットワークをリスタートする。

ifupコマンド

# /sbin/ifup ipsec*

ネットワークリスタート

# /etc/rc.d/init.d/network restart

下記はまだ書きかけ。
iptablesの設定とかまだあるんだよな…。
あとAHとESPの有効化とか。
DNS,DHCP

参考サイト