Posted by & filed under server.


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 マイクロソフトの通りレジストリをやってもダメ。なんか解決案ありますかな。

  • axot

    ファイアウォールのUDP 1701とespプロトコル設定も必要かなぁ