IPSec NAT traversal
IPsec-aware NAT problem
NATを超えるときにはsrc, dest port 4500のUDPヘッダーでIKEパケットをカプセル化
NAT越えする場合にはudp:4500も許可しておかないとNAT越しでのIPSecはできない。
IKEv2では機能としてNATトラバーサル機能が組み込まれている
IKEv1ではオプション扱い
NATとIPsecの問題はIKEパケットは下記のような仕様と定まっていることが一つ
udp src port 500
udp dst port 500
NAPTでsourc portが変換するとIPsecのサーバー側で不正パケット扱いになってしまう
逆に一部のNAPTが例外的にsrc udp 500のパケットをNAPT変換しないことで問題になる
一般的にVPNパススルーと呼ばれる機能がこの機能
正確にはVPN方式(L2TP、IPsec、PPTP)ごとにやっていることが違うが
ひとまとめにVPNパススルーとくくられることが多い。
この場合は一つのNAPT配下では一つのIPsecセッションしかはれない
すでに500を使われてしまってnatされるので、2つ目のVPNセッションがはれない問題
フリーWifiとかでおきそう
一般のご家庭でも家族でVPNを複数はると簡単におきる。
NAT traversal対応していないIPsec機器に対応できるのが利点だが問題も多い
IKEで鍵交換できないとSA構築できないのでIPsecトンネルが構築できない
このためNAT(NAPT)でport変換が行われるとIPSecがうまくいかない
その対策としてのNAT traversalの仕様がRFC3947。
IPSecとNAT間の問題点
IPSecのAHだとペイロードにsrc , destのIPアドレスを含む。
ペイロードと実際のsrc,dest IPアドレスが一致しないなら不正なパケット扱いされてしまう。
NATがIPSecの間に入る場合にはこのペイロードIPアドレスについても変換が必要なる。
ESP(udp 50)はペイロードにsrc,dst IPを含まないので、この問題は起きない。
実際のところAHは現在はほぼつかわれてない。
NATとIKEのアドレス識別子間で非互換制がある。
IKE phase 1とphase2 の中でIPアドレスがIKE識別子として使われる。
NATを通るとIP headerのアドレスがNATで変わってしまうので、TCP checksumと実際のIPアドレスのミスマッチ
結果として不正なパケット扱いされてドロップされる。
この問題に対処するためにFQDNとUserIDを代わりにIKE識別子として使うようになった。
逆に言うとIP アドレスをIKE 識別子として使っているとNATのせいでIPSecは使えない。
固定IKE src portとNAPT問題。
NAPT配下におなじ相手に対してIKE SA initiateする時、相手側は
NAT Traversalフェーズ
IKE1の場合
Detecting Support of NAT-Traversal
両peerでNAT traversalの機能をもっているかを検出。
IKE phase 1の最初の2回のIKEメッセージのペイロード部のvendor IDでお互いのcapabilityで通知する。
NAT Traversalをサポートしていればペイロードタイプの値として13がセットされる
Detecting the Presence of NAT
NAT-Dという専用ペイロードを使う。
具体的にはペイロードタイプの値が20がセットされる
NAT検出だけでなく、どこの位置でNATがあるかまで検出することができる。
自身か相手のどちら側にNATデバイスがあるかの判別
検出方法としては下記の通り
送信時にIP, portの値でhash取得
パケットを受け取った際にに受信側でも同様のハッシュをとり値が変化したかどうかでNAT越えが発生したかを確認。
このハッシュのことをNAT-D(NAT discovery)ペイロードと呼ぶ。
インターフェースに複数のIPがある場合には、すべてのIPパターンのNAT-Dペイロードを載せてメッセージをおくる。
受信側は実際に受け取ったパケットのsrc IPで最低一つはNAT-Dペイロードと実際のハッシュ値があえばNAT越えがないと判断
NATデバイスが検出された場合はIKEパケットをUDP src 4500 ,dest 4500としてカプセルかして送出する
NATデバイスでudp src 4500が別のポート番号に変換される
IKE2の場合
Chaingin to New Ports
そもそも問題になっている理由としてはudp 500 portがNAT側の実装で特別な扱いとしてなっているから
単純な解決策はIKEで使うポートをNAT利用時にはさらにUDPカプセル化してportも500番からほかのものに変えればよい。
カプセル化すればNATでsrc portを変更されても元のパケットには影響はない
src udp:500は例外的にポート変換しないNAT responder側の影響もうけない。
500ではなく4500なら普通に別ポートに変換してくれるので
NAT Detectionをした場合はUDPカプセル化してしまいdst にudp:4500を使う。
Negotiation of the Nat-Traversal Encaulation
UDPでカプセル化する際には二つのモードがある。
といっても設定レベルではあんまりきにしなくてよさげ。
UDP-Encapsulated-Tunnel 3
UDP-Encapsulated-Transport 4