Linux 2.4 と 2.6 で IPsec 接続 -- FreeS/WAN と racoon
VPN ゲートウェイは Linux マシンです.この VPN は 2年以上前から動いているのですが,その当時の Linux のカーネルの主流は 2.4 で,これに FreeS/WAN のパッチを当てて IPsec を動かしていました.そしてそれは今も動いています.
最近,事業所の一つが移転したのですが,それに併せて VPN ゲートウェイを新調しました.その際,カーネルを 2.6 系に移行しました.この事業所でも当然ながら VPN 接続する必要があります.
2.6 系のカーネルでは IPsec のコードが初めから取り込まれています.このコードは kame の流れを汲む usagi のコードベースです.つまり,FreeS/WAN とは系統が異なる実装になります.系統が異なっていても,IPsec は RFC に規格化されたプロトコルですから基本的に相互接続には問題ないのですが,ただ相互の認証に公開鍵暗号系を用いようとすると少々面倒でした.
IPsec で peer 同士の認証をするのに公開鍵を使う場合,x509 証明書を用いた PKI を使うのが一般的ですが,patch(http://www.strongsec.com/freeswan/ など) を適用していない FreeS/WAN では,x509 証明書を扱うことができません.そして残念ながら,KLab の VPN ゲートウェイサーバの FreeS/WAN にはパッチはあたっていません.新たに patch を当ててカーネルを作り直すか,或いは(既に開発が終了している) FreeS/WAN をやめて Openswan や strongSwan を使えば 2.4 カーネルでも x509 証明書を扱えますが,今回は現在 FreeS/WAN が動いている VPN ゲートウェイサーバには手を加えたくありません.ということで,2.6 カーネルの IPsec の方で何とか FreeS/WAN にあわせることにしました.
IPsec 通信に使用する鍵の交換は鍵交換デーモンが IKE(Inter Key Exchange) プロトコルに基づいて行います.IKE ではその第一段階(phase 1)として,peer の認証を行います.この peer を認証するにあたって使用する鍵は,事前共有鍵方式と公開鍵方式があります.公開鍵方式では,x509 証明書を使用した PKI を用いるのが一般的です.つまり,peer との通信を行うに当たって,まず相互に自分の公開鍵とその証明書を相手に渡します.渡された方は渡された証明書が自分が信頼する認証局(CA)から発行されたものであることを確認し,それが渡された公開鍵に対する証明書であることを確認します.一方FreeS/WAN では PKI を使わずに,peer の公開鍵を事前に何らかの方法で取得しておいてそれを使用します(形式としては ssh の公開鍵の交換と同じ形です).
2.6 カーネルの IPsec を使う場合に用いることができる IKE デーモンは二つあります.racoon と isakmpd です.今回は racoon を使いました.isakmpd で同じことができるかは未検証です.
手順は次の通りです.今回新たに 2.6 のカーネルを使ったゲートウェイを設置したのは福岡事業所です.ここから,東京の本社に VPN 接続をします.本社の VPN ゲートウェイサーバは 2.4 カーネルです.東京のゲートウェイサーバには,福岡だけではなく大阪などからも接続します.
それぞれの IP アドレスは仮に次のようになっているとします.
東京LAN 東京GW(2.4) 福岡GW(2.6) 福岡LAN
172.16.1.0/24 - 192.168.0.1 - 192.168.0.2 - 172.16.2.0/24
- 東京と福岡の VPN ゲートウェイ用の鍵を openssl コマンドで作成します.
- 東京用の公開鍵にパッチを当てます(certpatch)
- FreeS/WAN用に,鍵の形式を PEM 形式から FreeS/WAN の形式に変換します(fswcert コマンド)
- FreeS/WAN の設定を追加します(東京)
- racoon の設定を行います(福岡)
- 設定を反映します
1.公開鍵の準備は,openssl の req(1) コマンドを使っていつも通りに作成します.東京の公開鍵は toukyou.crt,秘密鍵は toukyou.key という名前に,福岡用の公開鍵は fukuoka.crt,秘密鍵は fukuoka.key という名前にします.
openssl の設定ファイル(openssl.cnf)を編集することができるのでしたら,東京(FreeS/WAN)の鍵を作成する際に,ファイル中の [ usr_cert ] セクションにある subjectAltName の値として IP:192.168.0.1 を指定します.openssl.cnf を編集できなくても,次の手順でこの情報を追加することもできます.
2.1 で,subjectAltName を指定せずに FreeS/WAN 用の鍵を作った場合は,後からこの情報を追加します.それには certpatch コマンドを利用します.このコマンドは,isakmpd に付属しています.またこのコマンドの利用には CA の秘密鍵が必要です.使い方は次の通りです. 3.openssl コマンドで作成した鍵ファイルは PEM 形式か DER 形式ですので,FreeS/WAN で使用するためには形式を変換してやる必要があります.これには fswcert コマンドを使用します.これは,FreeS/WAN 用の x509 パッチの提供サイトにソースがありますので,それをダウンロードしてきてコンパイルしてください.公開鍵と秘密鍵それぞれを変換する必要があります. 4.東京のFreeS/WAN の設定をします./etc/ipsec.conf に追加する設定は次の通りです. 5.福岡の spd と racoon の設定をします. 6.設定の反映をします.東京の FreeS/WAN は 参考文献
certpatch -t ip -i 192.168.0.1 -k ca.key toukyou.crt tmp.crt
mv tmp.crt toukyou.crt
秘密鍵は次のようにして FreeS/WAN 用の鍵ファイルに保存します.
./fswcert -k ~/iizuka.key >> /etc/ipsec.secrets
この鍵は東京と福岡の通信でのみ使用しますので,ipsec.secrets を編集して,この鍵を 東京-福岡 専用に指定します.具体的には ipsec.secrets ファイルに今追加した鍵の :RSA の前に,192.168.0.1 192.168.0.2 を追加します.
公開鍵は,次のようにして変換します.東京と福岡の公開鍵の両方変換します.
./fswcert -c --left ~/toukyou.crt
./fswcert -c --rigth ~/fukuoka.crt
出力された文字列は,次の手順で ipsec.conf に設定を追加する際に使用します.
conn toukyou-fukuoka
left=192.168.0.1
leftsubnet=172.16.1.0/24
leftrsasigkey=0x03010001A558DE〜
right=192.168.0.2
rightsubnet=172.16.2.0/24
rightrsasigkey=0x03010001AFF4C〜
auto=start
authby=rsasig
spd の設定は次のようになります.
spdadd 172.16.1.0/24 172.16.2.0/24 any -P in ipsec esp/tunnel/192.168.0.1-192.168.0.2/require;
spdadd 172.16.2.0/24 172.16.1.0/24 any -P out ipsec esp/tunnel/192.168.0.2-192.168.0.1/require;
setkey コマンドで適当に追加しします.
racoon の設定は /etc/racoon/racoon.conf に以下を追加します.
path certificate "/etc/racoon/certs";
remote 192.168.0.1 {
exchange_mode main;
lifetime time 28800 sec;
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method rsasig;
dh_group 2;
}
send_cert off;
certificate_type x509 "fukuoka.crt" "fukuoka.key";
peers_certfile x509 "toukyou.crt";
}
sainfo anonymous {
lifetime time 12 hour ;
encryption_algorithm 3des,des ;
authentication_algorithm hmac_md5;
compression_algorithm deflate ;
}
ipsec auto --rereadsecrets
ipsec auto --add toukyou-fukuoka
とします.
福岡の racoon の設定の反映は,
racoonctl reload-config
とします.