拡張されたIPsecはどう使える?(wakatonoの戯れメモ)
http://www.todo.gr.jp/~wakatono/cakeoff20040522_IPsec.pdf
id:yomoyomoさんのところ経由。wakatonoさんが作成されたIPsecの解説資料で、Windows OSでのIPsec NAT Traversalについて触れられた貴重な資料です(しかもクリエイティブコモンズのライセンスで配布!)。特にp.19の
Windows Server 2003では、動的に変わるアドレスもSource/Destinationとして指定可能
これは初耳でした。LinuxのIPsec実装には無い機能なんじゃないかな……。
それと、id:wakatonoさんの2004年5月27日の日記のところで質問させてもらったのですが、Windows OSの場合はなんとIKE NAT Traversalを使わなくても「IPアドレスの変換しか行わないNAT*1なら普通にIPsec通信ができる」(!)のだそうです。これには、かなりびっくりしました。
これが何故おかしいのかについて説明するために、RFC3715(IPsec-Network Address Translation (NAT) Compatibility Requirements)を見てみます。このRFCの2.1節「Intrinsic NA(P)T Issues」では、NA(P)TがIPsecと相容れない本質的な問題の1つとして「(b)Incompatibility between checksums and NAT」という項があり、このように記述されています。
Incompatibility between checksums and NAT. TCP and UDP checksums have a dependency on the IP source and destination addresses through inclusion of the "pseudo-header" in the calculation. As a result, where checksums are calculated and checked upon receipt, they will be invalidated by passage through a NAT or reverse NAT device.
つまり、ESPの認証ではIPヘッダの中身を計算に使っていないからいいけれど、ESPによって暗号化された中にあるUDPヘッダやTCPヘッダのチェックサム計算ではオリジナルの始点・終点アドレスを使用してしまっているのが問題になるわけです。原文では、この文章のあとに「IPsecトンネルモードの場合」と「チェックサムが0の場合(IPv4 UDPの場合のみこれが許可される)」はこの問題を回避できる、という内容の記述がされています。
(更に細かい話)IKE NAT Traversalでは、NAT-OAペイロードによって送信元のオリジナルアドレス(Original Address)を通知しておくことで、UDPカプセル化されたIPsecパケットを受信した側にてチェックサムを再計算できるようにする仕様になっています。個人的には、わざわざオリジナルアドレスなんか渡さずに、送信側であらかじめ変換後のIPアドレスに沿ったUDP or TCPチェックサム値を計算しておけばいいんじゃないかな……と思うんですが、何か大人の事情があるんでしょうか。
wakatonoさんによると、Windows対向(IEとIISの対向)できちんとNATを越えて通信が出来た、とのことなので恐らくWindowsがチェックサム計算をさぼっているか何かだと思うのですが……。もし本当にそうだったとしたら、Windowsの実利主義には脱帽します(褒めてませんよ)。
-
-
- -
-
(2004-06-01追記)
世の中には「IPsecパススルー」という機能をサポートしたNA(P)T機器があって、トンネルモードの場合のみ通常のIPsecでもNATトラバーサル可能なのだそうです。全然知りませんでした……(恥)。
トンネルモードの場合は「IPヘッダ|ESPヘッダ|IPヘッダ|UDP(TCP)ヘッダ|ペイロード」という形のパケットになるので、先頭のIPヘッダに含まれる始点・終点アドレスが書き換えられてもUDP(TCP)ヘッダのチェックサム計算には影響しませんから、トンネルの終点でNAT相当の処理を行えば(状況によっては行わなくても)確かに大丈夫です。IKE NAT Traversal関係のドラフトでやけにトンネルモードの記述が多いと思ったら、こういうのが既にあったからなんですねぇ。
あ、ちなみにトランスポートモードの場合はやっぱりダメですよ。