
次の構成を使用して、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は橋です。