カテゴリー別アーカイブ: ネットワーク

ネットワーク技術に関すること

openswan vs strongswan vs libreswan

IPsec の実装として、openswan / strongswan / libreswan どれを使えばいいの?というお話。

どの実装もかつてのFreeS/WAN IPsecの末裔であって、似た設定で動作するのだけど微妙に書式が違う、というやっかいなことになっている。

openswan:
もうメンテされていない古い実装。Ubuntu 16.04LTS も CentOS 7 もパッケージを用意していないので、あえて使う理由がない。
libreswan:
openswanのフォークで、現状メンテされている。RedHat/CentOS系は標準パッケージで用意されている。Debian/Ubuntu系にはパッケージなし。
strongswan:
ご先祖から大幅に書き直されたもの。Debian/Ubuntu系OSの場合は標準パッケージで用意されている。RedHat/CentOS系はepelレポジトリに入っている。

Fedora の場合は strongswan / libreswan どちらもパッケージが用意されている。

ということで、openswan は使わないものとして、あとは OS によってパッケージがある方を選んでおけば良いのではないか。

参考:
IPsec for Linux – strongSwan vs Openswan vs Libreswan vs other(?)

DNSSEC ルートゾーン KSK ロールオーバーについて

DNSSECのルートゾーンKSKロールオーバーについて、ロールオーバー前後でDNSの検索に支障が出ないよう、各所から通達が出ている。

ルートゾーンKSKロールオーバーによる影響とその確認方法について (JPRS)
KSKロールオーバーについて (JPNIC)

1. 管理下の DNS キャッシュは DNSSEC 検証をしているか

DNS キャッシュサーバーを管理している場合は、一応気を付けたほうが良い。管理下の DNS キャッシュサーバーに対して、dig コマンドでDNSSEC 対応済みドメイン (例: jprs.jp) の情報を検索したときに、回答に ad フラグが付いていたら「キャッシュサーバーでDNSSEC署名検証が有効になっている」状態なので、更新後の鍵を設定してやる必要があるかもしれない。

adフラグが付いている例:

$ dig jprs.jp. @mydns.example.com

; <<>> DiG 9.10.3-P4-Ubuntu <<>> jprs.jp.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26772
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 9
...

(参考: DNSSECチュートリアル~実践編~)

2. RHEL 7 / CentOS 7 + BIND の場合

named.confにデフォルトで以下の設定が入っていて、DNSSEC署名検証が有効になっている。

options {
...
        dnssec-enable yes;
        dnssec-validation yes;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";
...
};
...
include "/etc/named.root.key";

対処法1. パッケージアップデート

/etc/named.iscdlv.key と /etc/named.root.key に、ルートゾーンの鍵が入っている。パッケージバージョンがbind-9.9.4-38.4以降であれば、上記2ファイルに新しい鍵が追加されるので、bindのパッケージをアップデートしてしまうのが一番手っ取り早く安心できる方法ではある。

対処法2. 自動更新に任せる

9.9.4-38.3以前のパッケージを使っている場合でも、RFC5011 の自動更新に対応している。named を起動すると更新後の鍵は /var/named/dynamic/managed-keys.bind{,.jnl} として自動保存される。このため、特に何かをする必要はない。

# とはいえ、CVE-2017-3142、CVE-2017-3143への対処が9.9.4-38.5以降で行われているので、パッケージを更新した方が良い。

3. RHEL 7 / CentOS 7 + Unbound の場合

デフォルトの /var/lib/unbound/root.key には古い鍵しか入っていないが、/etc/unbound/unbound.conf に以下の記述があり、自動更新が有効になっている。

server:
...
        auto-trust-anchor-file: "/var/lib/unbound/root.key"
...

unbound のデーモンを起動すると、/var/lib/unbound/root.key に新しい鍵が追加される。

このため、これらの設定を変更していなければ、特に対処の必要はない。

4. 確認、その他

EDNS0を無効化していないこと、経路上でTCP53が通ること、フラグメントパケットが通ることも確認しておく。

大きなサイズの DNS 応答に対応できているかどうかは、DNS-OARCが確認用のレコードを用意してくれているので、以下の dig コマンドで確認できる。

$ dig +bufsize=4096 +short rs.dns-oarc.net txt

非対応のキャッシュサーバだと、以下のような回答が返ってくる。

rst.x476.rs.dns-oarc.net.
rst.x485.x476.rs.dns-oarc.net.
rst.x490.x485.x476.rs.dns-oarc.net.
"203.0.113.1 DNS reply size limit is at least 490"
"203.0.113.1 lacks EDNS, defaults to 512"
"Tested at 2017-08-31 01:19:47 UTC"

さくらのVPS上のUbuntuでIPv6

IPv6アドレスの設定方法 | さくらのVPS | さくらインターネット公式サポートサイト
CentOSをそのまま使っているなら上記の通りなんだけど、Ubuntuに入れ換えている場合のメモ。

1. VPSホームにログインして、自分のVPSに割り当てられたIPv6グローバルアドレスを調べる。

2. Ubuntuにログインして/etc/network/interfacesを編集。

iface eth0 inet6 static
	address 2001:db8:ffff:ffff:203:0:113:15
	netmask 64
	gateway fe80::1

3. ifdown; ifup で行けると思うけど、念のため再起動。

iOS/Android 端末からの L2TP/IPsec 接続 (strongswan+xl2tpd)

iOSやAndroid端末、あるいは Windows PC などからもリモートアクセスできるよう、VPS マシンに VPN 接続を設定しておく。

PPTPについては既に脆弱性が発見されており、OSによってはサポート対象外になっているため、VPN プロトコルとしては L2TP/IPsec を使う。

前提:
対象サーバはVPSのUbuntu 14.04。

IPsec 実装としては strongswan、L2TP 実装としては xl2tpd を利用する。

ネットワーク図は以下の通り。
05

1. インストール

myvps1:~$ sudo apt-get install strongswan xl2tpd

カーネルパラメータをパケット転送できるよう設定する。

myvps1:~$ sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1  #28行目のコメントを外す
# 以下、追記する
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.eth0.send_redirects=0
net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.lo.send_redirects=0
net.ipv6.conf.eth0.accept_redirects=0
net.ipv6.conf.lo.accept_redirects=0
myvps1:~$ sudo sysctl -p /etc/sysctl.conf

ファイアウォール(ufw)を閉じている場合は、ESP、UDP 500・4500 を空けておくこと。

2. ipsec.confの設定

myvps1:~$ sudo vi /etc/ipsec.conf

以下の内容を追記する。

conn L2TP-PSK
        authby=secret
        auto=add
        closeaction=clear
        dpdaction=clear
        type=transport
        rekey=no
        left=203.0.113.180
        leftprotoport=17/1701
        right=%any
        rightprotoport=17/%any

IPsec はトランスポートモードを使用する。ペイロードに L2TP を通すので、ルーティングはそちらに任せる。

再接続等はクライアント側に任せたいため、こちらからは何もしない設定である。接続が切れた場合はセッションをクリアする。

3. IPsecの事前共有鍵の設定

myvps1:~$ sudo vi /etc/ipsec.secrets

事前共有鍵を平文で記述する。

: PSK "mypresharedkey"

4. xl2tpd.conf の設定

myvps1:~$ sudo vi /etc/xl2tpd/xl2tpd.conf

以下の設定を追記する。

[global]
port = 1701

[lns default]
ip range = 172.16.1.11-172.16.1.30
local ip = 172.16.1.254
length bit = yes
require chap = yes
refuse pap = yes
require authentication = yes
name = myvps1.vpsnet.example.jp
ppp debug = no
pppoptfile = /etc/ppp/xl2tpd-options

接続クライアント側には、172.16.1.11 から 30 の間でアドレスが割り振られる。

5. xl2tpd-options の設定

myvps1:~$ sudo vi /etc/ppp/xl2tpd-options

L2TPの設定を記述する。

ipcp-accept-local
ipcp-accept-remote
ms-dns 172.16.1.254  (myvps1:172.16.1.254にキャッシュDNSサーバが立っている前提)
noccp
auth
crtscts
idle 1800
mtu 1300
mru 1300
nodefaultroute
lock
connect-delay 5000
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2

6. chap-secrets の設定

myvps1:~$ sudo vi /etc/ppp/chap-secrets
username	*	"l2tppassworddesu"	*

一般ユーザで読めない権限にしておく。

7. デーモンの起動

myvps1:~$ sudo service strongswan restart
myvps1:~$ sudo service xl2tpd restart

この状態で、iPhoneなどから接続してみる。
iPhoneであれば「設定」→「VPN」→「VPN構成を追加…」で「L2TP」を選択して設定を追加する。
サーバ欄にはVPSのホスト名(IPアドレス)、アカウントにはL2TPユーザ名、パスワードにはL2TPパスワード、シークレットにはIPsec事前共有鍵を設定する。

クライアント機器が、公衆無線LANなどのプライベートネットワーク中に居る状態も想定しなければならない。その場合は NAT-Traversal を使うことになるが、Ubuntu 14.04 の strongswan は標準でNAT-Traversal を自動検出してくれるようなので、特別な設定をしなくても接続できる (ただし、UDP 4500番ポートについてファイアウォールが空いている必要はある)。

自宅-VPS間でIPsec (strongswan X.509証明書認証)

IPsecトンネルの認証に証明書認証を導入する検証を実施してみたが、Ubuntu 14.04 標準パッケージの openswan では trusted_ca returning with failed というエラーが出てうまくいかなかった。

strongswan で試したところ成功したので、この設定を以下に説明する。(strongswanとopenswanの比較はこちら)

ネットワーク構成は前の記事と同じで、以下の図のようになる。
03

前提:
・両側のサーバはともに Ubuntu 14.04 LTS である。
・IPsec実装は strongswanを利用する。
・証明書作成にはOpenSSLを使い、PEMファイルの形で管理する。
・CAは自宅側のIPsec端点(ホスト名:myserver1)と同一のサーバに作成しておき、この上で両側の端点用の証明書を発行する。

1. strongswan インストール

myserver1:~$ sudo apt-get purge openswan
myserver1:~$ sudo apt-get install strongswan
myvps1:~$ sudo apt-get purge openswan
myvps1:~$ sudo apt-get install strongswan

カーネルパラメータは前々回の記事と同一の設定をしておく。

vpn1:~$ sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1  #28行目のコメントを外す
# 以下、追記する
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.eth0.send_redirects=0
net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.lo.send_redirects=0
net.ipv6.conf.eth0.accept_redirects=0
net.ipv6.conf.lo.accept_redirects=0
vpn1:~$ sudo sysctl -p /etc/sysctl.conf

ファイアウォール(ufw)を閉じている場合は、UDP 500 と 4500 を空けておくこと。

2. myserver1上にCAのためのディレクトリと設定を準備する

myserver1:~$ sudo mkdir /etc/ssl/CA
myserver1:~$ sudo mkdir /etc/ssl/newcerts
myserver1:~$ sudo sh -c "echo '01' > /etc/ssl/CA/serial"
myserver1:~$ sudo sh -c "echo '01' > /etc/ssl/CA/crlnumber"
myserver1:~$ sudo touch /etc/ssl/CA/index.txt
myserver1:~$ sudo vi /etc/ssl/openssl.cnf

/etc/ssl/openssl.cnfの抜粋:

dir		= /etc/ssl		# Where everything is kept
database	= $dir/CA/index.txt	# database index file.
certificate	= $dir/certs/ca1.crt 	# The CA certificate
serial		= $dir/CA/serial 		# The current serial number
crlnumber	= $dir/CA/crlnumber # the current crl number
                    # must be commented out to leave a V1 CRL
crl     = $dir/crl/crl.pem
private_key	= $dir/private/ca1.key

3. CAの証明書・鍵を作成する

myserver1:~$ sudo openssl req -new -x509 -extensions v3_ca -keyout /etc/ssl/private/ca1.key -out /etc/ssl/certs/ca1.crt -days 3652
(snip)
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Aichi
Locality Name (eg, city) []:Nagoya
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Home
Organizational Unit Name (eg, section) []:CA
Common Name (e.g. server FQDN or YOUR name) []:ca1.domain.local
Email Address []:

4. myserver1ホストの秘密鍵を作成する

myserver1:~$ openssl genrsa -aes256 -out myserver1.key 2048
Enter pass phrase for myserver1.key:********
(後でパスワードを削除するので、パスワードはここでは適当に決める)
Verifying - Enter pass phrase for myserver1.key:********

秘密鍵ファイルのパスワードを削除しておく

myserver1:~$ openssl rsa -in myserver1.key -out myserver1.key
Enter pass phrase for myserver1.key:********
writing RSA key

5. CSRを作成する

myserver1:~$ openssl req -new -days 1826 -key myserver1.key -out myserver1.csr
(snip)
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Aichi
Locality Name (eg, city) []:Nagoya
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Home
Organizational Unit Name (eg, section) []:Server
Common Name (e.g. server FQDN or YOUR name) []:myserver1.domain.local
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

6. CA鍵を使って署名する

myserver1:~$ sudo openssl ca -in myserver1.csr -config /etc/ssl/openssl.cnf
Enter pass phrase for /etc/ssl/private/ca.key:********
(snip)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
(snip)
Data Base Updated

7. CA証明書とホスト証明書・鍵を /etc/ipsec.d にコピーしておく

myserver1:~$ sudo cp -p /etc/ssl/certs/ca1.crt /etc/ipsec.d/cacerts/
myserver1:~$ sudo cp -p /etc/ssl/newcerts/01.pem /etc/ipsec.d/certs/myserver1.crt
myserver1:~$ sudo cp myserver1.key /etc/ipsec.d/private/

8. myvps1用の証明書も同様に作成する

myserver1:~$ openssl genrsa -aes256 -out myvps1.key 2048
myserver1:~$ openssl rsa -in myvps1.key -out myvps1.key
myserver1:~$ openssl req -new -days 1826 -key myvps1.key -out myvps1.csr
myserver1:~$ sudo openssl ca -in myvps1.csr -config /etc/ssl/openssl.cnf

9. myvps1 にホスト証明書・鍵、CA証明書をコピーする

myserver1:~$ cp /etc/ssl/certs/ca1.crt .
myserver1:~$ cp /etc/ssl/newcerts/02.pem ./myvps1.crt
myserver1:~$ scp ca1.crt myvps1.crt myvps1.key myvps1:

myvps1:~$ sudo cp ca1.crt /etc/ipsec.d/cacerts/
myvps1:~$ sudo cp myvps1.crt /etc/ipsec.d/certs/
myvps1:~$ sudo cp myvps1.key /etc/ipsec.d/private/
myvps1:~$ rm ca1.crt myvps1.crt myvps1.key
myserver1:~$ rm ca1.crt myvps1.crt myvps1.key

10. strongswan の設定 (myserver1側)

設定ファイルを編集する。

myserver1:~$ sudo vi /etc/ipsec.conf

config setup セクションの後に以下の内容を追加する。

conn myhome-to-vps
	authby=rsasig
	auto=start
	closeaction=restart
	dpdaction=restart
	left=192.168.100.240
	leftsubnet=192.168.100.0/24
	leftcert=myserver1.crt
	right=203.0.113.180
	rightsubnet=203.0.113.180/32
	rightid="C=JP, ST=Aichi, O=Home, OU=Server, CN=myvps1.vpsnet.example.jp"

こちら側から接続を開始するため、auto=start を記述する。また接続が切れたときにはこちら側から再接続を実行するため、closeaction=restart と dpdaction=restart を記述する。

パスワードファイルには秘密鍵のファイル名を記述する。

myserver1:~$ sudo vi /etc/ipsec.secrets

/etc/ipsec.secrets:

: RSA myserver1.key

11. strongswan の設定 (myvps1側)

こちらも設定ファイルを編集する。

myvps1:~$ sudo vi /etc/ipsec.conf

config setup セクションの後に以下の内容を追加する。

conn myhome-to-vps
	authby=rsasig
	auto=add
	closeaction=clear
	dpdaction=clear
	left=203.0.113.180
	leftsubnet=203.0.113.180/32
	leftcert=myvps1.crt
	right=%any
	rightsubnet=192.168.100.0/24
	rightid="C=JP, ST=Aichi, O=Home, OU=Server, CN=myserver1.domain.local"

パスワードファイルには秘密鍵のファイル名を記述する。

myvps1:~$ sudo vi /etc/ipsec.secrets

/etc/ipsec.secrets:

: RSA myvps1.key

12. サービス起動と確認

サービスを起動する。

myserver1:~$ sudo service strongswan start
myvps1:~$ sudo service strongswan start

接続できたかどうか、ip xfrm state と ip xfrm policy コマンドで確認する。

myserver1:~$ sudo ip xfrm state
src 192.168.100.240 dst 203.0.113.180
	proto esp spi 0xbaef12dc reqid 1 mode tunnel
	replay-window 32 flag af-unspec
	auth-trunc hmac(sha1) 0x6bde34f03f729b5a3c1d93c112ea6a40bf312742 96
	enc cbc(aes) 0x4f2fa3876e41e825be32a4e710a5f193
	encap type espinudp sport 4500 dport 4500 addr 0.0.0.0
src 203.0.113.180 dst 192.168.100.240
	proto esp spi 0xbb4b32e0 reqid 1 mode tunnel
	replay-window 32 flag af-unspec
	auth-trunc hmac(sha1) 0x44b52fad2bf912e10b61706add1337f823ec344e 96
	enc cbc(aes) 0xaf32405118ac467efb02f5f76e59aad1
	encap type espinudp sport 4500 dport 4500 addr 0.0.0.0

myserver1:~$ sudo ip xfrm policy
src 203.0.113.180/32 dst 192.168.100.0/24 
	dir fwd priority 1827 
	tmpl src 203.0.113.180 dst 192.168.100.240
		proto esp reqid 1 mode tunnel
src 203.0.113.180/32 dst 192.168.100.0/24 
	dir in priority 1827 
	tmpl src 203.0.113.180 dst 192.168.100.240
		proto esp reqid 1 mode tunnel
src 192.168.100.0/24 dst 203.0.113.180/32 
	dir out priority 1827 
	tmpl src 192.168.100.240 dst 203.0.113.180
		proto esp reqid 1 mode tunnel
(snip)

自宅-VPS間でIPsec (openswan)

自宅(動的IPアドレス)とVPS(固定IPアドレス)の間で、IPsecトンネルを常時接続してみる。これには、自宅のIPアドレスが変わっても、VPS経由で自宅に入れるというメリットがある。

ネットワーク図 (IPアドレスは例示用)
03

OS: Ubuntu 14.04 LTS
ソフトウェア: openswan

1. VPS側
ipsec.confを編集する。

myvps:~$ sudo vi /etc/ipsec.conf

/etc/ipsec.conf:

config setup
	protostack=netkey #autoから変更
(snip)
conn myhome-to-vps
    authby=secret
    auto=add
    left=203.0.113.180
    leftsubnet=203.0.113.180/32
    right=%any
    rightsubnet=192.168.24.0/24
    rightid=192.168.24.252

事前共有鍵を設定する。

myvps:~$ sudo vi /etc/ipsec.secrets

/etc/ipsec.secrets:

: PSK "mypresharedkey"

2. 自宅側
ipsec.confを編集する。

myvps:~$ sudo vi /etc/ipsec.conf

/etc/ipsec.conf:

config setup
	protostack=netkey #autoから変更
(snip)
conn myhome-to-vps
    authby=secret
    auto=start
    left=192.168.24.252
    leftsubnet=192.168.24.0/24
    right=203.0.113.180
    rightsubnet=203.0.113.180/32

VPS側と同じ事前共有鍵を設定する。

myvps:~$ sudo vi /etc/ipsec.secrets

/etc/ipsec.secrets:

: PSK "mypresharedkey"

以上の設定で接続できる。NAPTを越えることが自動的に検出されて、IPsecパケットはNAT-Traversalでカプセル化される。iptablesでUDP 4500が閉じている場合は、ACCEPTするように変更すること。

自宅グローバルIPアドレスは不定のため、IPsecのピアIDとしては適当な文字列(ここではプライベートIPアドレス)を使う。通常、片側の端点が動的IPアドレスの場合は Aggressive モードを使うものだが、上記の設定であれば Main モードでつながるようだ。このへんの仕組みがよくわからない…

また、上記は事前共有鍵による認証を使っているが、OpenSSLで生成したRSA証明書認証を設定しようとするとうまくいかない。このあたり試行錯誤が必要だ。
(※追記: openswanだとうまくいかないので、strongswanに切り替えました。strongswanとopenswanの比較はこちら)

Linux サーバ間 IPsec 接続 (openswan)

Linuxサーバ同士の間で通常のIPsecを接続したことが無かったので、検証してみた。

I. 前提

環境は以下の通り。
01

vpn1、vpn2、host1、host2、router1 OSは全てUbuntu 14.04である。

vpn1←→vpn2の間で、openswanでトンネルモードIPsec接続をする。10.0.1.0/24 から 10.0.2.0/24 へのパケット、またその逆方向のパケットはトンネルへ入るようにする。つまり、例えばhost1からhost2へpingを打つとトンネルを通ることになる。10.0.1.0/24や10.0.2.0/24へのスタティックルートはrouter1に追加しないようにしておくので、VPNトンネルが出来なければhost1からhost2へのpingは到達できない。

vpn2側に自動接続開始の設定を入れることで、VPNトンネルを自動的に張ることにする。

II. 設定

以下、設定を記述する(IPアドレス設定など基本的なところは省略)

1. router1 の設定:

router1:~$ sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1  #28行目のコメントを外す
router1:~$ sudo sysctl -p /etc/sysctl.conf

2. vpn1の設定:

デフォルトルートは router1 に向けておく。向いていなかったら /etc/network/interfaces などを編集して変更する。

vpn1$ ip route
default via 1.2.3.1 dev eth1
1.2.3.0/24 dev eth1  proto kernel  scope link  src 1.2.3.4
10.0.1.0/24 dev eth0  proto kernel  scope link  src 10.0.1.1

OpenSWANをインストールする。

vpn1:~$ sudo apt-get install openswan

カーネルパラメータを設定する。

vpn1:~$ sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1  #28行目のコメントを外す
# 以下、追記する
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.eth0.send_redirects=0
net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.lo.send_redirects=0
net.ipv6.conf.eth0.accept_redirects=0
net.ipv6.conf.lo.accept_redirects=0
vpn1:~$ sudo sysctl -p /etc/sysctl.conf

IPsecの事前共有鍵を設定する。

vpn1:~$ sudo vi /etc/ipsec.secrets
# 以下の行を追記
: PSK "passwordstring"

IPsecの接続設定を記述する。

vpn1:~$ sudo vi /etc/ipsec.conf
config setup	# protostack以外はデフォルトのまま
	dumpdir=/var/run/pluto/
	nat_traversal=yes
	virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v6:fd00::/8,%v6:fe80::/10
	oe=off
	protostack=netkey	# auto から変更
# 以下、追記
conn linux-to-linux
	authby=secret	# 共有鍵認証とする
	left=1.2.3.4	# 自ホストのIPアドレス
	leftsubnet=10.0.1.0/24	# 自分側のプライベートネットワーク
	right=5.6.7.8	# 対向側ホストのIPアドレス
	rightsubnet=10.0.2.0/24	# 対向側のプライベートネットワーク
	auto=add	# こちら側からはVPN接続を自動開始しない

デーモンを再起動する。

vpn1:~$ sudo service ipsec restart

3. vpn2 の設定:

デフォルトルートは router1 に向けておく。向いていなかったら /etc/network/interfaces などを編集して変更する。

vpn1$ ip route
default via 5.6.7.1 dev eth1
5.6.7.0/24 dev eth1  proto kernel  scope link  src 5.6.7.8
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.1

OpenSWANをインストールする。

vpn1:~$ sudo apt-get install openswan

カーネルパラメータを変更する。

vpn2:~$ sudo vi /etc/sysctl.conf	# vpn1と同じ記述をする。
vpn2:~$ sudo sysctl -p /etc/sysctl.conf

IPsec事前共有鍵を設定する。

vpn2:~$ sudo vi /etc/ipsec.secrets	# これもvpn1と同じ記述をする。

IPsecの設定を記述する。

vpn2:~$ sudo vi /etc/ipsec.conf
config setup	# protostack以外はデフォルトのまま
	dumpdir=/var/run/pluto/
	nat_traversal=yes
	virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v6:fd00::/8,%v6:fe80::/10
	oe=off
	protostack=netkey	# auto から変更
# 以下、追記する。right/leftをvpn1側とは入れ換える。
conn linux-to-linux
	authby=secret
	left=5.6.7.8
	leftsubnet=10.0.2.0/24
	right=1.2.3.4
	rightsubnet=10.0.1.0/24
	auto=start	# こちら側からVPN接続を自動開始する

デーモンを再起動する。

vpn1:~$ sudo service ipsec restart

これで完成。

III. 確認

ipsec verify を実行すると FAILED が出るが、気にしなくてよい。

vpn1:~$ sudo ipsec verify
Two or more interfaces found, checking IP forwarding        [FAILED]

router1でtcpdumpを仕掛けておき、host1からhost2あてにpingを打ってみる。

host1:~$ ping 10.0.2.100
router1:~$ sudo tcpdump -n -i eth1 not tcp port 22
10:49:22.294046 IP 1.2.3.4 > 5.6.7.8: ESP(spi=0x8f3ac7ea,seq=0x1), length 132
10:49:22.294543 IP 5.6.7.8 > 1.2.3.4: ESP(spi=0x0293d289,seq=0x1), length 132
10:49:23.295411 IP 1.2.3.4 > 5.6.7.8: ESP(spi=0x8f3ac7ea,seq=0x2), length 132
10:49:23.295890 IP 5.6.7.8 > 1.2.3.4: ESP(spi=0x0293d289,seq=0x2), length 132

ESPにカプセル化されてパケットが通過していることが確認できた。

※パケットがトンネルに入るか入らないかは、IPルーティングではなくxfrmポリシーによって決まっている。
ip xfrm state、ip xfrm policy コマンドで確認できる。

vpn1:~$ sudo ip xfrm state
src 1.2.3.4 dst 5.6.7.8
	proto esp spi 0x8f3ac7ea reqid 16385 mode tunnel
	replay-window 32 flag af-unspec
	auth-trunc hmac(sha1) 0xdbc2f99d8243e36fc8920c790c0b6b9d85c84a48 96
	enc cbc(aes) 0x506786cc1fbf21c272ddeab0c4deb739
src 5.6.7.8 dst 1.2.3.4
	proto esp spi 0x0293d289 reqid 16385 mode tunnel
	replay-window 32 flag af-unspec
	auth-trunc hmac(sha1) 0x10110db5180fb3773d47cb538b29ae9371137ebd 96
	enc cbc(aes) 0xb29c28de3d0e40111f6f9720fddf117f
vpn1:~$ sudo ip xfrm policy
src 10.0.1.0/24 dst 10.0.2.0/24 
	dir out priority 2344 
	tmpl src 1.2.3.4 dst 5.6.7.8
		proto esp reqid 16385 mode tunnel
src 10.0.2.0/24 dst 10.0.1.0/24 
	dir fwd priority 2344 
	tmpl src 5.6.7.8 dst 1.2.3.4
		proto esp reqid 16385 mode tunnel
src 10.0.2.0/24 dst 10.0.1.0/24 
	dir in priority 2344 
	tmpl src 5.6.7.8 dst 1.2.3.4
		proto esp reqid 16385 mode tunnel
(snip)