ファイアウォール(Ubuntu 8.04)がRSTで最終パケット(FIN、ACK、PSH)を拒否する理由
背景には、長い間、TCPがタイムアウトするまでHTTPリクエストが部分的にロードされたままになることがあるというファイアウォールの問題がありました。 ファイアウォールでトラフィックをトレースした後、特定のタイミング条件でのみ発生することに気付きました。たとえば、クライアントがペイロードで2番目のACKを送信する前にWebサーバーが応答全体を送信した場合です。[SYN、SYN / ACK、ACK]が交換され、REQUESTが送信され、ACKされ、最初のRESPONSEパケットが受信され、ACKされた後、ウェブサーバーは残りの応答本文を1ショットで送信します(8パケット最後のFIN、PSHを含み、クライアントがそれらのいずれかにACKを返す前に、ファイアウォールはWebサーバーに対してRSTで拒否し、クライアントを無限にハングさせ続けます。 これは、ファイアウォールの両側からのパケットを含むWiresharkトレース全体です。192.168.126.161は、クライアントのプライベートNAT'et IPアドレスです。172.16.1.2はWebサーバーIP(実際のパブリックIPを表示しない)であり、10.1.1.1はファイアウォール外部IP(実際のパブリックIPを表示しない)です 2105 0.086275 192.168.126.161 172.16.1.2 TCP 37854 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 SACK_PERM=1 TSV=89375083 TSER=0 2106 0.000066 10.1.1.1 172.16.1.2 TCP 37854 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 SACK_PERM=1 TSV=89375083 TSER=0 2107 0.002643 172.16.1.2 10.1.1.1 TCP http > 37854 [SYN, ACK] Seq=0 Ack=1 …