NVR700WとIPsec

2回続けて書いたフレッツ光ネクストと小型ONUの話のおまけ。

NVR510が使えない

YAMAHAのルータで小型ONUに対応した機種は2つ、 NVR510NVR700W がある。 後者はSIMが内蔵できてdocomo/au/softbankの3G/4G網につなぐ機能がありずっと高価なので 最初NVR510を調達したのだけど、設定してみるとIPsecなトンネルには対応していないのでした。 NVR510/NVR700Wのコマンドリファレンス の記述みて誤解していました。

他にもport分割なVLANが使えないなど機能的に不満があったので、予備にとってあった NVR700Wを投入してNVR510を予備に回すことにした。

FreeBSD 13.0のIPsec

FreeBSD 13.0-RELEASE Release Notes | The FreeBSD Project より

Removed support for IPsec algorithms deprecated by RFC 8221 as well as Triple DES. 16aabb761c0a (Sponsored by Chelsio Communications)

ということでFreeBSD 13.0ではIPsecでの3DESサポートが削除された。 FreeBSDサーバと対向して使っているYAMAHAルータのIPsecの設定も3DESからAESに 書き換えることにした。

FreeBSDports/security/ipsec-toolsでインストールしたracoonの設定ファイル /usr/local/etc/racoon/racoon.confで、

    encryption_algorithm    3des;

となっている行をすべて

    encryption_algorithm    aes;

に変更してracoon立ち上げ直し。

NVR700Wがaes256-cbcに対応していない

NVR700Wのコマンドリファレンスマニュアルで IPsec ike encryption の項目を読むと、IPsecの設定では同じAESでも暗号強度の違いでaes256-cbc, aes192-cbc, aes-cbcの 3種類がある。一番暗号強度が強いaes256-cbcを指定して設定してみたところ、

IPsecトンネルは上がってくるのだけど

IPsecトンネルは上がってこない。いろいろ試してみるところ、 NVR700Wはaes256-cbcだと通信できないようでした。マニュアルの嘘つき。 RTX700Wと対向するIPsecトンネルはaes-cbcを指定するよう変更して解決。 FreeBSDのracoon.confではいずれの場合も encryption_algorithm aes; で大丈夫。

YAMAHAルータのIPsecとNAT-T設定を巡る不思議

YAMAHAのサイトにある IPsec設定ガイド を参考に、ルータの外向けIPv4固定グローバルアドレスがXXX.XXX.XXX.XXX、 対向するルータのIPv4アドレスがYYY.YYY.YYY.YYY、 LAN側の内側IPv4アドレスが192.168.0.1のとき、IPsecトンネルは

tunnel select 2
ipsec tunnel 102
ipsec sa policy 102 2 aes-cbc sha-hmac
ipsec ike version 2 1
ipsec ike encryption 2 aes-cbc
ipsec ike local address 2 192.168.0.1
ipsec ike local id 2 XXX.XXX.XXX.XXX
ipsec ike pre-shared key KEYSTRING
ipsec ike remote address 2 YYY.YYY.YYY.YYY
tunnel enable 2
nat desciptor type 1 masquerade
nat descriptor masquerade static 1 1 192.168.0.1 esp
nat descriptor masquerade static 1 2 192.168.0.1 udp 500

のように書くことができる。YAMAHAルータ側のアドレスはNATの中の192.168.0.1だけれど、 これで(IPsecでNATに対応するための)NAT-Tを指定しなくても通信ができていた。

ところが対向がFreeBSD 13.0サーバの場合、YAMAHAルータで192.168.0.1というローカルアドレスを 使用しているのを検知してしまうのか、racoon.confの中で nat_traversal off; を指定しないとこの設定のYAMAHAルータとの間でトンネルを確立できなくなってしまった。

詳しいところはまだ調べていないけれど、参考まで。

FreeBSDルータと対向するYAMAHAの設定

前述したように、FreeBSDルータとRTX1200であれば aes-cbc ではなく aes256-cbc が指定可能。

tunnel select 2
 ipsec tunnel 102
  ipsec sa policy 102 2 esp aes-cbc sha-hmac
  ipsec ike version 2 1
  ipsec ike always-on 2 on
  ipsec ike encryption 2 aes-cbc
  ipsec ike group 2 modp1024
  ipsec ike hash 2 sha
  ipsec ike keepalive log 2 on
  ipsec ike keepalive use 2 auto heartbeat
  ipsec ike local address 2 192.168.0.1
  ipsec ike local id 2 XXX.XXX.XXX.XXX
  ipsec ike log 2 key-info message-info payload-info
  ipsec ike negotiate-strictly 2 off
  ipsec ike pfs 2 on
  ipsec ike pre-shared-key 2 KEYSTRING
  ipsec ike remote address 2 YYY.YYY.YYY.YYY
  ipsec ike remote id 2 YYY.YYY.YYY.YYY
 ip tunnel mtu 1280
tunnel enable 2
nat desciptor type 1 masquerade
nat descriptor masquerade static 1 1 192.168.0.1 esp
nat descriptor masquerade static 1 2 192.168.0.1 udp 500

FreeBSDサーバ側

FreeBSDルータ側のIPv4ローカルアドレスが192.168.1.1/24、YAMAHA側が192.168.0.1/24とする。

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

remote  XXX.XXX.XXX.XXX[500] {
        exchange_mode   main,aggressive;
        doi             ipsec_doi;
        nonce_size      16;
        lifetime        time 28800 sec;
        initial_contact on;
        situation       identity_only;
        my_identifier   address "YYY.YYY.YYY.YYY";
        peers_identifier        address "YYY.YYY.YYY.YYY";
        mode_cfg        on;
        generate_policy on;
        nat_traversal   off;
        ike_frag        on;
        passive         off;
        support_proxy   on;
        proposal_check  obey;
        proposal {
                encryption_algorithm    aes;
                hash_algorithm          sha1;
                authentication_method   pre_shared_key;
                dh_group                2;
        }
}
sainfo address 192.168.1.0/24 any address 192.168.0.0/24 any {
        pfs_group               2;
        lifetime time           28800 sec;
        encryption_algorithm    aes;
        authentication_algorithm        hmac_sha1;
        compression_algorithm   deflate;
}
sainfo address YYY.YYY.YYY.YYY any address XXX.XXX.XXX.XXX any {
        pfs_group               2;
        lifetime                time 28800 sec;
        encryption_algorithm            aes;
        authentication_algorithm        hmac_sha1;
        compression_algorithm   deflate;
}

/usr/local/etc/racoon/psk.txt

XXX.XXX.XXX.XXX KEYSTRING

/etc/ipsec.conf

flush;
spdflush;
spdadd 192.168.1.0/24 192.168.0.0/24 any -P out ipsec esp/tunnel/YYY.YYY.YYY.YYY-XXX.XXX.XXX.XXX/require;
spdadd 192.168.0.0/24 192.168.1.0/24 any -P in ipsec esp/tunnel/XXX.XXX.XXX.XXX-YYY.YYY.YYY.YYY/require;