FreeBSDを使って,自宅にL2TP/IPsecなVPNサーバを構築してみます.
使用したFreeBSDのバージョンは8.2-RELEASE.
カーネルの再構築
カーネルにIPsecサポートを追加します.
options IPSEC options IPSEC_FILTERTUNNEL options IPSEC_NAT_T device crypto
そしてビルド&インストール
cd /usr/src
make buildkernel KERNCONF=IPsec
make installkernel KERNCONF=IPsec
shutdown -r now
security/ipsec-tools のインストール
次にIPsec用のツール群をインストールしますが,その前にパッチを2つほど充てます.
1つめは,racoonが認識できないRTM_GETメッセージについての警告メッセージを頻繁に投げないように抑制し,また,ログメッセージ末尾に改行を挿入することで,syslogが表示するメッセージ量を抑制します.
--- src/racoon/grabmyaddr.c 2011-03-14 14:18:12.000000000 -0300 +++ src/racoon/grabmyaddr.c 2011-04-25 15:56:41.000000000 -0300 @@ -753,6 +753,7 @@ kernel_handle_message(msg) case RTM_ADD: case RTM_DELETE: case RTM_CHANGE: + case RTM_GET: case RTM_MISS: case RTM_IFINFO: #ifdef RTM_OIFINFO @@ -768,7 +769,7 @@ kernel_handle_message(msg) break; default: plog(LLV_WARNING, LOCATION, NULL, - "unrecognized route message with rtm_type: %d", + "unrecognized route message with rtm_type: %d\n", rtm->rtm_type); break; }
このパッチを /usr/ports/security/ipsec-tools/files/patch-zz-local-0.diff として保存します.
2つ目のパッチはracoonのPre-Shared Keyをワイルドカードに対応させるパッチです.
以下のパッチを /usr/ports/security/ipsec-tools/files/patch-zz-local-1.diff として保存します.
--- src/racoon/localconf.c 2008-12-23 12:04:42.000000000 -0200 +++ src/racoon/localconf.c 2011-04-25 15:44:24.000000000 -0300 @@ -207,7 +207,8 @@ getpsk(str, len) if (*p == '\0') continue; /* no 2nd parameter */ p--; - if (strncmp(buf, str, len) == 0 && buf[len] == '\0') { + if (strcmp(buf, "*") == 0 || + (strncmp(buf, str, len) == 0 && buf[len] == '\0')) { p++; keylen = 0; for (q = p; *q != '\0' && *q != '\n'; q++)
パッチを入れたら後はインストールするだけ.
cd /usr/ports/security/ipsec-tools
make install clean
net/mpd5 のインストール
mpd5は特に何もすることはないのでそのままインストール.
cd /usr/ports/net/mpd5
make install clean
設定
IPsecの設定
IPsecの設定ファイルは /usr/local/etc/racoon/racoon.conf です.
ディレクトリとファイルを作成して設定を書きます.
path pre_shared_key "/usr/local/etc/racoon/psk.txt"; listen { isakmp 10.0.0.150 [500]; isakmp_natt 10.0.0.150 [4500]; strict_address; } padding { maximum_length 20; randomize off; strict_check off; exclusive_tail off; } remote anonymous { exchange_mode main, aggressive; doi ipsec_doi; situation identity_only; generate_policy on; proposal_check obey; nat_traversal on; dpd_delay 20; passive on; support_proxy on; ike_frag on; proposal { encryption_algorithm aes; hash_algorithm sha256; authentication_method pre_shared_key; dh_group modp1024; } proposal { encryption_algorithm aes; hash_algorithm sha1; authentication_method pre_shared_key; dh_group modp1024; } proposal { encryption_algorithm 3des; hash_algorithm sha256; authentication_method pre_shared_key; dh_group modp1024; } proposal { encryption_algorithm 3des; hash_algorithm sha1; authentication_method pre_shared_key; dh_group modp1024; } } sainfo anonymous { lifetime time 30 minutes; encryption_algorithm aes, rijndael, 3des; authentication_algorithm hmac_sha1; compression_algorithm deflate; pfs_group modp1024; }
IPアドレス(10.0.0.150)はサーバのIPアドレスに適宜書き換えてください.
Pre-Shared Keyは設定ファイルで指定したファイル(今回は /usr/local/etc/recoon/psk.txt)に以下のフォーマットで書きます.
* hogehoge
その後,パーミッションを適切に設定しておきます.
chmod 600 /usr/local/etc/racoon/psk.txt
セキュリティポリシの設定を /usr/local/etc/racoon/setkey.conf に記述します.
flush; spdflush; spdadd 0.0.0.0/0[0] 0.0.0.0/0[1701] udp -P in ipsec esp/transport//require; spdadd 0.0.0.0/0[1701] 0.0.0.0/0[0] udp -P out ipsec esp/transport//require;
以上でIPsecの設定はおしまいです.
mpd5の設定
ユーザ名とパスワードを /usr/local/etc/mpd5/mpd.secret に書いてやります.
hoge "piyo" foo "bar"
mpd5の設定ファイルを,サンプルファイル(mpd.conf.sample)をコピーして作成して以下の設定を追記します.
default: load l2tp_server l2tp_server: set ippool add pool2 10.0.0.200 10.0.0.210 create bundle template B_l2tp set iface enable proxy-arp set iface enable tcpmssfix set ipcp yes vjcomp set ipcp ranges 10.0.0.150/24 ippool pool2 set ipcp dns 10.0.0.150 create link template L_l2tp l2tp set link action bundle B_l2tp set link enable multilink set link no pap chap eap set link disable chap eap set link enable chap-msv2 set link keep-alive 0 0 set link mtu 1376 set l2tp self 10.0.0.150 set l2tp enable length set link enable incoming
ここでもIPアドレス(10.0.0.150)は適宜書き換えます.
システム設定
/etc/sysctl.conf に以下の設定を追加してIP forwardingを有効にしてやります.
net.inet.ip.forwarding=1 net.inet6.ip6.forwarding=1
最後に,起動設定を /etc/rc.conf に書いてやります.
ipsec_enable="YES" ipsec_program="/usr/local/sbin/setkey" ipsec_file="/usr/local/etc/racoon/setkey.conf" racoon_enable="YES" racoon_flags="-l /var/log/racoon.log" mpd_enable="YES"
service racoon start
service mpd5 start
ポート開放
ファイアウォール内や,NATな環境なときは以下のポートを開放してやる必要があります.
- 500/UDP
- 4500/UDP
これらの設定でMac OS XやiPhoneでの接続は確認できました.
が,肝心のWindowsではエラー809が出て接続不可…
このあたりを参照しつつレジストリをいじったりしてみましたがやはりエラー809…
また後日原因を調べてみる予定です.
こんにちは、僕にも同じ問題起きています。Windowだけはだめらしい。http://support.microsoft.com/kb/926179 マイクロソフトの通りレジストリをやってもダメ。なんか解決案ありますかな。
ファイアウォールのUDP 1701とespプロトコル設定も必要かなぁ