RTX と Linux を IPsec で接続 (Openswan)

拠点間 WAN 接続にインターネット VPN を利用する場合、IPsec を使うことがよくある。
IPsec を使ったインターネット VPN の構築では、VPN の両端の機器を同一にすることがほとんどだろう。
筆者の場合だと YAMAHA の RTX シリーズ ルーターを IPsec VPN の両端にすることが多い。

たまには変わったことをということで、IPsec VPN の片側端を Linux に、他方端を YAMAHA RTX シリーズ ルーターにして構築を試みることにした。
Linux のデストリビューションはいつもの如く Ubuntu にして IPsec の実装に Openswan を使う。
RTX シリーズ ルーターは RTX1100 だ。

openswan

検証環境

検証した環境は以下の通り。

接続のイメージ

検証の目標は、Linux と RTX シリーズ ルーターの間に IPsec で VPN セッションを張り、Linux から RTX シリーズ ルーターを越えた先のネットワークにある機器を通信できるようにすることだ。
Linux の通信相手には VPN セッションの片側の端点になる RTX シリーズ ルーターも含み、通信のパケットはすべて VPN セッションを通るようにしたい。

Linux のデストリビューションは ubuntu 12.04 LTS にした。
この時期にしてはちょっと古い気もするが、次の LTS がまだリリースされていないので仕方ない。
Openswan は ubuntu 12.04 LTS の標準パッケージを使うので、そのバージョンは 2.6.37 だ。

Linux 側の LAN インターフェースは eth0 の一枚だけで、そこに 172.26.0.101 を割り当て、サブネットマスクを 24 bit (255.255.255.0) にする。

RTX シリーズ ルーターには RTX1100 を使う。
RTX1200 にしたかったところだが、残念ながら自由に使える機材が手元に無かった。
ファームウェアは Rev.8.03.94 だ。
RTX1100 の LAN1 に 172.26.255.250 を割り当て、LAN2 に 172.26.254.1 を割り当てる。
サブネットマスクはどちらも 24 bit (255.255.255.0) だ。

Linux と RTX1100 の間には YAMAHA RTX810 を置いて、双方のネットワークを分離した。
間に入れた RTX810 の LAN1、LAN2 には 172.26.0.1/24 と 172.26.255.2/24 を割り当てる。

この構成で、IPsec VPN セッションは Linux の eth0 に割り当てた 172.26.0.101 と RTX1100 の LAN1 に割り当てた 172.26.255.250 の間に張ることになる。
そして、IPsec VPN セッションには、Linux の eth0 に割り当てた 172.26.0.101 と RTX1100 の LAN2 とそのポートに繋がる 172.26.254.0/24 のネットワーク セグメントの機器の間の通信を通す。

IPsec のパラメーターは以下のようにした。

相互認証の方式 共通鍵 (pre-shared-key)
交換モード メイン モード
IKE ハッシュ アルゴリズム SHA1
IKE 暗号アルゴリズム AES128
IPsec モード トンネル モード
IPsec ハッシュ アルゴリズム SHA1
IPsec 暗号アルゴリズム AES128
DH グループ Phase 1: グループ 2 (1024 bit)
Phase 2: グループ 2 (1024 bit)
ID のタイプ ID_IPV4_ADDR
PFS の使用 使用しない
ISAKMP SA の寿命 28800 秒 (8 時間)
IPsec SA の寿命 28800 秒 (8 時間)

なお、共通鍵は “atIB926vecGI32yi” にした。

Linux の設定

まずは Linux (Ubuntu 12.04LTS) の LAN インターフェースを設定し、IPsec VPN の対向端点を含むネットワーク 172.26.255.0/24 宛ての経路情報を設定しておく。
さらに、IPsec の実装になる Openswan も apt-get install openswan コマンドでインストールする。

ubuntu の場合、Openswan をインストールしただけだと、動作環境を確認する sudo ipsec verify コマンドを実行したときに、以下のように FAILED が出てしまう。

この sudo ipsec verify コマンドの結果から「FAILED」をなくすために、以下のコマンドを実行してシステムの設定を変更する。

先の sudo ipsec verify コマンドの実行結果では /proc/sys/net/ipv4/conf/*/send_redirects に関する項目が FAILED になっており、、/proc/sys/net/ipv4/conf/*/accespt_redirects に関する項目は OK になっている。
しかし、メッセージに従って /proc/sys/net/ipv4/conf/*/send_redirects を disable (0) に変更した後に改めて sudo ipsec verify コマンドを実行すると /proc/sys/net/ipv4/conf/*/accespt_redirects に関する項目が FAILED になることが分かっている。
このため、/proc/sys/net/ipv4/conf/*/send_redirects と  /proc/sys/net/ipv4/conf/*/accespt_redirects の両方をまとめて disable (0) にした。

これだけではシステムを再起動すると元に戻ってしまうので、以下のようにして /etc/sysctl.d/ ディレクトリに 60-icmp-redirect.conf ファイルを作り、起動時にシステムの設定が変更されるようにする。

この設定をした後に再度 sudo ipsec verify コマンドを実行して「FAILED」がなくなっていることを確認する。
念のために一度再起動をしてから sudo ipsec verify コマンドを実行してもいいだろう。

次に、Openswan の設定をする。

Openswan に IPsec VPN セッションを追加するために、/etc/ipsec.conf に以下の内容を追記した。

相互認証に使う事前共有鍵の値は、/etc/ipsec.secrets ファイルに以下のように記述する。

以上で Linux 側の設定ができた。

最後に sudo service ipsec reload コマンド (または sudo ipsec reload コマンド) を実行して、追記した設定を読み込ませておく。
/etc/ipsec.conf ファイルに追記した vpn_session1 セクションは auto=add であるため、対向から接続してくるか、 sudo ipsec auto --up vpn_session1 コマンドで接続を開始しなければ、IPsec VPN セッションは動作しない。

RTX1100 の設定

RTX1100 は以下のように設定した (必要な部分だけを抜粋)。

この RTX1100 の設定では、IPsec VPN に使う IKE の鍵交換を起動しないよう ipsec auto refresh 1 off にしてあるため、RTX1100 から IPsec VPN セッションを接続し始めることはない。

Linux 側から IPsec VPN を接続

まずは Linux 側から IPsec VPN を接続してみる。

Linux で IPsec VPN を接続するには sudo ipsec auto --up vpn_session1 コマンドを使う。
--up オプションに続く引数は /etc/ipsec.conf ファイルに追記した conn に続く文字列だ。
このコマンドを実行すると以下のようなメッセージが出力され、IPsec VPN セッションが確立する。

念のために、 traceroute -n 172.26.254.1 などのコマンドを実行して、想定通りの結果が返ってくるかを確認する。

RTX100 からも同様に、 traceroute 172.26.0.101 noresolv -sa 172.26.254.1 などのコマンドを実行して、想定通りの結果が返ってくるかを確認する。

このとき RTX1100 で show ipsec sa コマンドを実行すると、きちんと SA が登録されていることが確認できる。

IPsec VPN セッションを切断するには sudo ipsec auto --down vpn_session1 コマンドを実行する。
--down オプションに続く引数には、 --up オプションと同様に、/etc/ipsec.conf ファイルに追記した conn に続く文字列を指定する。
このコマンドは実行しても何のメッセージも表示せずに、IPsec VPN セッションを切断する。

sudo ipsec auto --down vpn_session1 コマンドを実行して IPsec VPN を切断してから、RTX1100 で show ipsec sa コマンドを実行すると、悲しことに受信側の ESP トンネル が削除されずに残っている。

keepalive 辺りのパラメーターを調整すれば上手く処理できるだとうとは思うが、まだそこまでは検証していない。
この状態で sudo ipsec auto --up vpn_session1 コマンドすると、問題なく再接続できるので、IPsec VPN を常時接続で運用する分にはとりあえず問題にはならないだろう。

RTX 側から IPsec VPN を接続

Linux 側から接続した IPsec VPN を切断して、こんどは RTX 側から IPsec VPN を接続してみる。

RTX1100 で IPsec VPN を接続するには、IPsec VPN で使う IKE の鍵交換が始動するように、 ipsec auto refresh 1 on を設定する。
これを設定するとすぐに IPsec VPN セッションを確立し始めようとする。
しかし、以下のようなログが記録されるばかりで、いつまで経っても IPsec VPN セッションが確立しない。

上記ログを取得する際は、 ipsec ike log 1 key-info message-info payload-infosyslog debug on を RTX1100 に設定した。
ログの最後は、86 行目から 101 行目までの 16 行を、count の値が 0 になるまで繰り返しす。
上記ログの日付は省略した。
さらに、バイナリ データの行も省略した。

このログを見る限りは「invalid ID information」が原因を指し示していると思われる。

RTX1100 から IPsec VPN セッションを接続しようとしたときの、Linux 側のログは以下の通りだ。

ログの最後は、9 行目から 11 行目までの 3 行を、RTX1100 のログの繰り返しと同期して繰り返す。
上記ログの日付は省略した。

IPsec VPN セッションが確立しないのは、invalid ID information (Linux 側は INVALID_ID_INFOMATION) が原因と推察できるが、解決方法は不明のままだ。
加えて、Linux 側からであれば接続できる理由も見当が付いていない。

コメントを残す