Permalink: 2014-10-09 00:05:00+09:00 by ruy@ainoniwa.net in technical tags: router freebsd bsdrp bbr ipsec social:

Summary

先日設定したBSDRP にL2TP/IPsecを導入することを考えます。

FreeBSDで提供されているipsec-toolsは、パッチを当てない限り、任意に指定した送信元IPアドレスに応じたPSK(Pre-Shared-Key)しか選択できません。

従って、非固定IPとなるノードからIPsecの接続要求を処理するには、

  • 証明書を用いた認証
  • 誰でも共通のPSKを使うようにパッチを当てる

という2つの方法があります。

今回は後者の方法を題材に、BSDRPに新しいパッケージを追加する方法を簡単に見ていきます。

パッケージの確認

まず、BSDRPで使用されているパッケージの構成情報を確認します。:

# 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

コンパイルオプションの違いを確認しておきましょう。

パッケージの作成

同じような環境でportsからパッケージを作ります。

今回は、パッケージが "Architecture : freebsd:10:x86:64" と書かれていたので、 それっぽいVMイメージ を拾ってきて起動したらパッケージを作りましょう。

もちろん、普通にFreeBSD 10系をインストールしても大丈夫です。

パッチ So, save this as /usr/ports/security/ipsec-tools/files/patch-zz-local-1.diff を突っ込んだら、パッケージの作成自体はいつも通り。:

# portsnap fetch extract
# cd /usr/ports/security/ipsec-tools
# vi files/patch-zz-local-1.diff
# make package

この時、さっき確認したコンパイルオプションと同じになるように設定します。理由があれば変えても良いと思いますが。

出来上がるとこんな感じだと思います。:

# 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を使っているだけなので、 パッチを当てた該当部分のみ動作確認が取れるよう、適当に設定します。

フォアグラウンドで確認するので、まだサービスとしては起動しません。

/usr/local/etc/racoon/racoon.conf:

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:

* password

/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;

L2TP/IPsecを想定しているけど、IPsecのWildcard PSKの動作確認までしかしないので、mpd5の設定は要らない。

Phase1の鍵交換が失敗することを確認する

racoonを起動します:

# 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

失敗しているの図

bsdrp_ipsec-tools_001.png

パッチを当てていない場合は、このようになる。:

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でパッケージをファイル転送する感じで進めます。

/を書き込み可能な形で再マウントし、(元々インストール済みのパッケージなので)強制的に上書きインストールします。:

# 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をフォアグラウンドで動かしてみます。:

# cd /usr/local/etc/racoon/
# racoon -f racoon.conf -F

成功しているの図

bsdrp_ipsec-tools_002.png

パッチを当てた後なら、こうなる。:

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がサポートされていないオチが待っていたのでこういう感じになりました。

おわりん。