
Ich versuche, eine Captive-Webportal-Umleitung auf CentOS mit der folgenden Konfiguration einzurichten:
Diese Konfiguration funktioniert für die ersten paar Pakete, aber dann ist der Zielport in der Antwort vom Server plötzlich beschädigt. Die Paketverfolgung sieht folgendermaßen aus:
Client: Der Host, der die ursprüngliche Webanforderung stellt. Server: Ursprüngliches Ziel der Anforderung. Portal: Captive-Portal-Server.
Diese Paketverfolgung wird von einem Ort erstellt, an dem sowohl der Client- als auch der Portalverkehr angezeigt werden kann. Zeilen, die mit c: beginnen, stammen von der Clientseite und p: von der Portalseite.
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?!?
An diesem Punkt ist die Verbindung unterbrochen. Der Client erwartet kein Paket auf diesem Port und sendet ein RST. Die Nummer des defekten Ports wird bei jedem Verbindungsversuch um 1 erhöht (vermutlich funktioniert es nach 12 Versuchen). Alle erneuten Übertragungen haben in der Antwort dieselbe defekte Portnummer. Ich habe keine Ahnung, was die Ursache dafür sein könnte.
Ist das ein Fehler oder mache ich etwas falsch? Diese Maschine hat eine etwas ungewöhnliche Konfiguration. Sie ist als Brücke konfiguriert. Um die NAT-Regel nur auf Pakete anzuwenden, die in eine Richtung gehen, werden die Pakete zuerst mit einer ebtables-NAT-Regel markiert und diese Markierung wird überprüft, wenn das iptables-NAT angewendet wird.
Dies ist auf Enterprise Linux 6 mit Kernel 2.6.32-279.5.2.el6.x86_64
Die NAT-Regel lautet:
target prot opt in out source destination
DNAT tcp -- ilb any anywhere anywhere multiport dports http,https mark match 0x8 to:<portal IP>
ilb ist die Brücke.