NVR700WとIPsec
2回続けて書いたフレッツ光ネクストと小型ONUの話のおまけ。
NVR510が使えない
YAMAHAのルータで小型ONUに対応した機種は2つ、 NVR510 と NVR700W がある。 後者は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に 書き換えることにした。
FreeBSDのports/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;