Enterprise Linux 6 で iptables NAT を使用するとポートが破損する

Enterprise Linux 6 で iptables NAT を使用するとポートが破損する

次の構成を使用して、CentOS でキャプティブ Web ポータル リダイレクトを設定しようとしています。

この構成は最初の数パケットでは機能しますが、その後突然、サーバーからの応答で宛先ポートが破損します。パケット トレースは次のようになります。

クライアント: 元の Web リクエストを発行したホスト。サーバー: リクエストの元の宛先。ポータル: キャプティブ ポータル サーバー

このパケット トレースは、クライアントとポータルの両方のトラフィックを確認できる場所から取得されます。c: で始まる行はクライアント側からのもので、p: はポータル側からのものです。

c: client:57877 -> server:80 [SYN]
p: client:1092 -> portal:80 [SYN]  NAT adjusted SYN
p: portal:80 -> client:1092 [SYN, ACK]
c: server:80 -> client:57877 [SYN, ACL] NAT reversed on the SYN/ACK
c: client:57877 -> server:80 [ACK]
c: client:57877 -> server:80 HTTP GET
p: client:1092 -> portal:80 [ACK]
p: client:1092 -> portal:80 HTTP GET
p: portal:80 -> client:1092 [ACK]
c: server:68 -> client:57877 [ACK]
          ^^ WTF?!?

この時点で接続は失敗しています。クライアントはそのポートでパケットを期待していないため、RST を送信します。この接続が試行されるたびに、壊れたポート番号は 1 ずつ増加します (おそらく、今から 12 回試行すると 1 回は成功するでしょう)。すべての再送信の応答には、同じ壊れたポート番号が含まれます。何が原因なのかわかりません。

これはバグでしょうか、それとも私が何か間違っているのでしょうか? このマシンは、やや変わった構成になっています。ブリッジとして構成されています。NAT ルールを単一方向のパケットにのみ適用するために、パケットは最初に ebtables NAT ルールでマークされ、iptables NAT が適用されたときにそのマークがチェックされます。

これはカーネル 2.6.32-279.5.2.el6.x86_64 を搭載した Enterprise Linux 6 上にあります。

NAT ルールは次のとおりです。

target     prot opt in     out     source               destination         
DNAT       tcp  --  ilb    any     anywhere             anywhere            multiport dports http,https mark match 0x8 to:<portal IP>

ilbは橋です。

関連情報