web-dev-qa-db-ja.com

TCP Linux(奇妙なパケット損失)では接続がリセットされますが、Windowsでは接続がリセットされません

Windowsではすべて問題ありませんが、Linuxで特定のWebページを取得しようとすると、長い間待機してから「接続がピアによってリセットされます」

宛先IPへのpingは正常に機能します。

インターフェイスのMTUを1476( "ping -c1 -M do -s"を使用して検出)に減らし、さらに低い値にしてみましたが、問題は解決しませんでした。

宛先ホストの近くにある別のLinuxPCでは問題がないため、パスにルーターがあると思われます。

これらはwiresharkとtsharkの出力です。

接続がリセットされたLinux: http://Pastebin.com/tpjS5qZc

問題のないWindows: http://Pastebin.com/iyN1GDxT

3番目のパケットが宛先ホストへのパスで失われ、宛先がいくつかの重複したackパケットを送り返すようですが、WindowsパケットとLinuxパケットに関連する違いは見られません。

3
Mohammad Salehe

キャプチャで両方のサーバーが「ビットをフラグメント化しない」を設定しています。これは、両端がパスMTUディスカバリを実行しようとしていることを意味します。

LinuxサーバーからリモートサーバーへのICMP Fragmentation Neededをブロックするファイアウォールがあるようです。回避策として、次の方法でMSSクランプを有効にします。

iptables -A OUTPUT -p tcp --tcp-flags SYN,RST SYN -j TCPMSS  --clamp-mss-to-pmtu

LinuxでPMTUディスカバリーを無効にすることもできます。

echo  1  |Sudo tee /proc/sys/net/ipv4/ip_no_pmtu_disc

iptables manページから:

TCPMSSこのターゲットを使用すると、TCP SYNパケットのMSS値を変更して、その接続の最大サイズを制御できます(通常、発信インターフェイスのMTUからIPv4の場合は40、IPv6の場合は60を引いた値に制限されます)。 )もちろん、-ptcpと組み合わせてのみ使用できます。

   This  target is used to overcome criminally braindead ISPs or servers which block "ICMP Fragmentation Needed" or "ICMPv6 Packet Too
   Big" packets.  The symptoms of this problem are that everything works fine from your Linux firewall/router, but machines behind  it
   can never exchange large packets:
    1) Web browsers connect, then hang with no data received.
    2) Small mail works fine, but large emails hang.
    3) ssh works fine, but scp hangs after initial handshaking.
   Workaround: activate this option and add a rule to your firewall configuration like:

           iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN
                       -j TCPMSS --clamp-mss-to-pmtu

   --set-mss value
          Explicitly  sets  MSS  option  to  specified  value.  If  the  MSS of the packet is already lower than value, it will not be
          increased (from Linux 2.6.25 onwards) to avoid more problems with hosts relying on a proper MSS.

   --clamp-mss-to-pmtu
          Automatically clamp MSS value to (path_MTU - 40 for IPv4; -60 for IPv6).  This may not function as desired where  asymmetric
          routes  with  differing  path MTU exist — the kernel uses the path MTU which it would use to send packets from itself to the
          source and destination IP addresses. Prior to Linux 2.6.25, only the path MTU to the destination IP address  was  considered
          by this option; subsequent kernels also consider the path MTU to the source IP address.

   These options are mutually exclusive.

参照: http://lartc.org/howto/lartc.cookbook.mtu-mss.html

編集:キャプチャを詳しく調べた後、すべてのIPをフィルタリングしているパスに沿って壊れたファイアウォールがあることを発見しましたTCPタイムスタンプオプションを使用するパケット。Linuxボックスで実行するだけ:echo 0 | Sudo tee /proc/sys/net/ipv4/tcp_timestamps

9