Summary
BSDRP 1.52に家庭用ブロードバンドルータ的な設定をする で構築したルーターにL2TP/IPsecを導入することを考えます。
FreeBSDで提供されているipsec-toolsは、パッチを当てない限り、任意に指定した送信元IPアドレスに応じたPSK(Pre-Shared-Key)しか選択できません。
そのため、非固定IPとなるノードからIPsecの接続要求を処理するには、以下の方法が考えられます。
- 証明書を用いた認証
- 送信元によらず(0.0.0.0/0を指定して)共通のPSKを使えるようにパッチを当てる
今回は後者の方法を題材に、BSDRPに新しいパッケージを追加する方法を簡単に見ていきます。
パッケージの確認
まず、BSDRPで使用されているパッケージの構成情報を確認します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
# pkg info ipsec-tools-0.8.1_7 | head -35
ipsec-tools-0.8.1_7
Name : ipsec-tools
Version : 0.8.1_7
Installed on : Sun Sep 14 11:19:31 UTC 2014
Origin : security/ipsec-tools
Architecture : freebsd:10:x86:64
Prefix : /usr/local
Categories : security
Maintainer : vanhu@FreeBSD.org
WWW : http://ipsec-tools.sourceforge.net/
Comment : KAME racoon IKE daemon, ipsec-tools version
Options :
ADMINPORT : off
DEBUG : on
DOCS : off
DPD : on
FRAG : on
GSSAPI : off
HYBRID : on
IDEA : on
IPV6 : on
LDAP : on
NATT : on
NATTF : off
PAM : off
RADIUS : on
RC5 : on
SAUNSPEC : off
STATS : off
Shared Libs required:
libldap-2.4.so.2
Shared Libs provided:
libracoon.so.0
libipsec.so.0
Flat size : 2.17MiB
|
Note
コンパイルオプションの違いを確認しておきましょう。
パッケージの作成
同じような環境でportsからパッケージを作ります。
今回は、パッケージが Architecture : freebsd:10:x86:64
と書かれていたので それっぽいVMイメージ を拾ってきて起動したらパッケージを作りましょう。
もちろん、普通にFreeBSD 10系をインストールしても大丈夫です。
パッチ So, save this as /usr/ports/security/ipsec-tools/files/patch-zz-local-1.diff を突っ込んだら、パッケージの作成自体はいつも通り。
1
2
3
4
|
# portsnap fetch extract
# cd /usr/ports/security/ipsec-tools
# vi files/patch-zz-local-1.diff
# make package
|
Note
この時、さっき確認したコンパイルオプションと同じになるように設定します。理由があれば変えても良いと思いますが。
出来上がるとこんな感じだと思います。
1
2
3
|
# ls -l work/pkg/
total 608
-rw-r--r-- 1 root wheel 557648 Oct 8 22:35 ipsec-tools-0.8.1_7.txz
|
設定
パッケージの更新を手動で行う場合のモデルケースとしてipsec-toolsを使っているだけなので、パッチを当てた該当部分のみ動作確認が取れるように設定します。
Warning
フォアグラウンドで確認するので、まだサービスとしては起動しません。
/usr/local/etc/racoon/racoon.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
path include "/usr/local/etc/racoon";
path pre_shared_key "/usr/local/etc/racoon/psk.txt";
path certificate "/usr/local/etc/ipsec.d/certs";
remote anonymous
{
exchange_mode main,aggressive;
doi ipsec_doi;
situation identity_only;
my_identifier address;
lifetime time 2 min; # sec,min,hour
initial_contact on;
proposal_check obey; # obey, strict or claim
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group 2;
}
}
sainfo anonymous
{
pfs_group 2;
lifetime time 1 hour;
encryption_algorithm 3des, blowfish 448, rijndael ;
authentication_algorithm hmac_sha1, hmac_md5 ;
compression_algorithm deflate ;
}
|
/usr/local/etc/racoon/psk.txt
/usr/local/etc/racoon/setkey.conf
1
2
3
4
|
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;
|
Warning
L2TP/IPsecを想定しているけど、IPsecのWildcard PSKの動作確認までしかしないので、mpd5の設定は要らない。
Phase1の鍵交換が失敗することを確認する
racoonを起動します
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# cd /usr/local/etc/racoon/
# setkey -f setkey.conf
# setkey -PD
0.0.0.0/0[any] 0.0.0.0/0[1701] udp
in ipsec
esp/transport//require
spid=1 seq=1 pid=1746
refcnt=1
0.0.0.0/0[1701] 0.0.0.0/0[any] udp
out ipsec
esp/transport//require
spid=2 seq=0 pid=1746
refcnt=1
# racoon -f racoon.conf -F
|
失敗した図
パッチを当てていない場合は、このようになる。
1
2
3
|
2014-10-08 22:59:59: [192.168.56.1] ERROR: couldn't find the pskey for 192.168.56.1.
2014-10-08 22:59:59: [192.168.56.1] ERROR: failed to process ph1 packet (side: 1, status: 4).
2014-10-08 22:59:59: [192.168.56.1] ERROR: phase1 negotiation failed.
|
パッケージのインストール
BSDRPは組み込み向けイメージということもあり、書き込み可能なスペースが限られているので、今回は/var/tmpにscpでパッケージをファイル転送する感じで進めます。
/
を書き込み可能な形で再マウントし、(元々インストール済みのパッケージなので)強制的に上書きインストールします。
1
2
3
4
5
|
# cd /var/tmp
# mount -uw /
# pkg add -f ./ipsec-tools-0.8.1_7_wildcard-psk_amd64.txz
pkg: package ipsec-tools is already installed, forced install
Installing ipsec-tools-0.8.1_7: 100%
|
Phase1の鍵交換が成功することを確認する
同じようにracoonをフォアグラウンドで動かしてみます。
1
2
|
# cd /usr/local/etc/racoon/
# racoon -f racoon.conf -F
|
成功した図
パッチを当てた後なら、こうなる。
1
2
3
4
5
6
7
8
|
2014-10-08 23:15:26: INFO: ISAKMP-SA established 192.168.56.101[500]-192.168.56.1[500] spi:e60469b4bfffed0f:3463b7b92d13c5ef
2014-10-08 23:15:26: INFO: respond new phase 2 negotiation: 192.168.56.101[500]<=>192.168.56.1[500]
2014-10-08 23:15:26: WARNING: trns_id mismatched: my:3DES peer:AES
2014-10-08 23:15:26: WARNING: trns_id mismatched: my:3DES peer:AES
2014-10-08 23:15:26: WARNING: trns_id mismatched: my:BLOWFISH peer:AES
2014-10-08 23:15:26: WARNING: trns_id mismatched: my:BLOWFISH peer:AES
2014-10-08 23:15:26: INFO: IPsec-SA established: ESP/Transport 192.168.56.101[500]->192.168.56.1[500] spi=226122172(0xd7a59bc)
2014-10-08 23:15:26: INFO: IPsec-SA established: ESP/Transport 192.168.56.101[500]->192.168.56.1[500] spi=1770247511(0x6983d557)
|
めでたしめでたし
どうしても必要なパッケージがある場合は、後から追加することも可能ですね、ということを確認しただけでした。
僕は後でminiupnpd(UPnPとpfを連携させるデーモン)を入れておこうと思います。
余談
BSDRPはstrongswan-5.2.0_1が入っているので、そもそもipsec-toolsを使わずstrongswanを使って%any設定をすればいいと思っていたのですが Strongswan for FreeBSD supports IKEv2 but NOT IKEv1. とか言われてFreeBSDのstrongswanではIKEv1がサポートされていないオチが待っていたのでこういう感じになりました。
おわりん。