うちのネットワークで, ときどき見えない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 件のコメント:
新しいコメントは書き込めません。