Wie kann der gesamte TCP-Verkehr auf die Netzwerkschnittstelle beschränkt werden, auf der die Sitzung initiiert wurde?

Wie kann der gesamte TCP-Verkehr auf die Netzwerkschnittstelle beschränkt werden, auf der die Sitzung initiiert wurde?

Ich habe ein eingebettetes Linux-System mit zwei Netzwerkschnittstellen (lan0, wlan0), die auf dasselbe Subnetz konfiguriert sind. Ein Server auf diesem System akzeptiert TCP-Verbindungen auf beiden Schnittstellen.

Wie kann ich sicherstellen, dass alle Antworten für eine Sitzung über dieselbe Schnittstelle gesendet werden, über die die Anforderung empfangen wurde? Wie kann der gesamte Datenverkehr einer TCP-Sitzung auf eine bestimmte Netzwerkschnittstelle beschränkt werden?

Der listen()-Socket und die akzeptierten Sockets können mit setsockopt(fd, BIND_TO_DEVICE) an eine Schnittstelle/ein Gerät gebunden werden. Der Server führt dies für beide Schnittstellen aus. Dies hilft dabei, zu erkennen, auf welcher Schnittstelle die Sitzung erstellt wurde, und den ausgehenden Datenverkehr auf dieselbe Schnittstelle zu beschränken.

Aber wenn accept() ausgeführt wird, wird das SYN-ACK an den Client zurückgesendet und ein Problem scheint zu sein, dass dieses anfängliche Paket aufgrund der ARP-Suche über die andere (falsche) Schnittstelle gesendet werden kann. Das ARP kann die IP-Adresse des Clients auf der anderen/"falschen" Schnittstelle finden, da der Client auch dort sichtbar ist.

Antwort1

Sie können die TCP-Verbindung für die Schnittstelle mit iptables beschränken.

#iptables -A INPUT -p tcp -i eth0 --syn -m limit --limit 1/s --limit-burst 3 -j RETURN

--limit 1/s: Maximum average matching rate in seconds
--limit-burst 3: Maximum initial number of packets to match

verwandte Informationen