2006年04月07日

Linux 2.4 と 2.6 で IPsec 接続 -- FreeS/WAN と racoon

はてなブックマークに登録

KLab の事業所は何ヶ所かあって,当然ながらそれぞれに LAN が組まれています.ご多分に漏れず,弊社でもこれらの 事業所 LAN 同士を VPN 接続しています.事業所間が離れていることもあり,over Internet で IPsec を使って構成しています.
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 をやめて OpenswanstrongSwan を使えば 2.4 カーネルでも x509 証明書を扱えますが,今回は現在 FreeS/WAN が動いている VPN ゲートウェイサーバには手を加えたくありません.ということで,2.6 カーネルの IPsec の方で何とか FreeS/WAN にあわせることにしました.

IPsec はざっくり分けると,二つの要素からなります.一つは peer 同士の間でやりとりされるパケットを暗号化したり,(パケット自体の)認証をしたりする部分で,これは通常カーネル内で処理されます.もう一つは,パケットの暗号化や認証に使う鍵を peer の間で交換する部分で,これは通常ユーザプロセスが担当します.
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

  1. 東京と福岡の VPN ゲートウェイ用の鍵を openssl コマンドで作成します.
  2. 東京用の公開鍵にパッチを当てます(certpatch)
  3. FreeS/WAN用に,鍵の形式を PEM 形式から FreeS/WAN の形式に変換します(fswcert コマンド)
  4. FreeS/WAN の設定を追加します(東京)
  5. racoon の設定を行います(福岡)
  6. 設定を反映します

1.公開鍵の準備は,opensslreq(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 の秘密鍵が必要です.使い方は次の通りです.

certpatch -t ip -i 192.168.0.1 -k ca.key toukyou.crt tmp.crt
mv tmp.crt toukyou.crt

3.openssl コマンドで作成した鍵ファイルは PEM 形式か DER 形式ですので,FreeS/WAN で使用するためには形式を変換してやる必要があります.これには fswcert コマンドを使用します.これは,FreeS/WAN 用の x509 パッチの提供サイトにソースがありますので,それをダウンロードしてきてコンパイルしてください.公開鍵と秘密鍵それぞれを変換する必要があります.
秘密鍵は次のようにして 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 に設定を追加する際に使用します.

4.東京のFreeS/WAN の設定をします./etc/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

5.福岡の spd と racoon の設定をします.
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 ;
}

6.設定の反映をします.東京の FreeS/WAN は

ipsec auto --rereadsecrets
ipsec auto --add toukyou-fukuoka

とします.
福岡の racoon の設定の反映は,
racoonctl reload-config

とします.

参考文献

klab_gijutsu2 at 16:02│Comments(0)TrackBack(0)ipsec 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント