image最近VyattaでL2TP/IPsec VPNのアクセスコンセントレータをたてようとしていて嵌ったのでメモ。VyattaはPCルータを作るために様々なパッケージを集めたDebianベースのLinuxディストリビューションです。Tabによる補完の効くネットワーク機器ライクなCUI(vbash)とWebGUIを備えていて、Ubuntu Serverのような一般的なディストリベースでPCルータを構成するより手軽です。今回はこれをつかって、あるネットワークの管理用セグメントに入るためのVPNアクセスコンセントレータをたてようとしていました。WebGUIをガイドメッセージに従ってポチポチしていたらなんとなく動くものが出来て、こりゃ便利、と思っていたのですが、リモートアクセスするPCがNAT下にいると、うまく動かないという問題に直面。L2TP/IPsec VPNはIPsecで暗号化した通信を行うのですが、IPsecのパケットは、TCPやUDPではなく、IPsecとしてのパケットをIPの上に直接流すため、NATとは相性が悪いというのはよく知られた話。その対策として、IPsecのパケットをUDPで包む技術があり、NAT-Traversalというオプションを有効にしたから良い筈・・・と考えていたのですが、もう一つ指定するオプションがありました。
vpn->ipsec->nat-networksというオプション。これの指定を正しく設定してやらないと正しくNAT下で動きません。このオプションは、リモートのPCが居るかもしれないNATセグメントのレンジを指定するのであって、VPNを使って入りたいセグメントのレンジを書くところではありません。これを勘違いしていたために、丸1日潰しました。。つまり、

     nat-networks { 
         allowed-network 10.0.0.0/8 { 
             exclude <VPN先セグメントがPrivate Addressで被った場合、そのセグメント>  
         } 
         allowed-network 172.16.0.0/12 { 
         } 
         allowed-network 192.168.0.0/16 { 
         } 
     }

こんな感じでないとダメなんですね。。"cannot respond to ipsec sa request because no connection is known for…"というエラーメッセージが/var/log/messagesに出て困っている方は、試してみてください。