2006/06/06

NAT越しで見えないWebサイトが発生

うちのネットワークで, ときどき見えないWebサイトが存在することが分かった.
例えば, www.microsoft.comや, www.infoseek.co.jpなど.

非常に悩んだが, 最終的にはMSSの問題だということが分かった.

うちでは, fletsをカーネルモードrp-pppoeで使用しているので,
iptablesの設定に
-A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
を付け足すことで, 対応した.

多くのサイトは見えているが, いくつかのサイトが見えない.
同じような構成のシステムがもう一つあるため, そちらで再現を
試みてみたが, 再現できない.

両方のシステムで, パケットキャプチャを行った結果でも, それほど
大きな違いはない.
ルータ兼FWのLinux機からはちゃんとWebページが見える.
片方のシステムの内部LANから, NAT越しでのサーフィンが失敗する.

NAT(iptablesのMASQUERADE)されたパケットが相手方Webサーバで
DROPされているのか????とも考えた.

解決の糸口はetherealの吐いた"TCP Previous segment lost".
これでググったら, いいのに出会った.

何がおきていたかというと...
ブラウザ                 サーバ
            SYN(MSS=1452)→→→→→→→→
            ←←←←←←←←←←←←←SYN,ACK(MSS=1460)
            ACK→→→→→→→→→→→→→
に続いて, ブラウザが"GET / HTTP/1.0"を送出するまでは
良かったのだが, その応答から, 途中のルータなどにより
ドロップされていた.

なぜドロップされるのかというと, MTUのサイズが大きすぎるため,
適切に転送できないから.

なぜ, 片方のシステムでは, 症状が発生し, 他方では発生しなかったのか
は, 確実には分からないが, Linux機の内部LAN側についているHUBが
関係しているのかもしれない.

なお, rp-pppoeをカーネルモードで動かした場合, pppoe.conf内の
CLAMPMSSの設定が無視されるので要注意.
MSS値を変更するには, iptablesのルールに
-A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

-A FORWARD -p tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1415: -j TCPMSS --set-mss 1412
などを加えることで対策を行う.

0 件のコメント: