IPTables - DNAT nur, wenn das Ziel nicht zuhört

IPTables - DNAT nur, wenn das Ziel nicht zuhört

Ich habe die Schnittstellen eth0 (Internetzugang) und tap_vpn0 (VPN-Tap-Schnittstelle, mit Netzwerk 192.168.110.0/24). Ich möchte alle eingehenden Verbindungen über eth0 auf 192.168.110.2 DNAT-en, aber NUR, wenn auf dem Server selbst KEIN Abhördienst vorhanden ist (hauptsächlich der VPN-Server selbst, aber im Grunde jeder andere Dienst, der angezeigt wird netstat -plunt, einschließlich SSH).

Was ich derzeit mache, ist iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 22 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 443 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 5555 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 992 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 1194 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 4500 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 500 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 1194 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 1701 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 54700 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 63486 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 68 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p gre -j ACCEPT iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.110.2

eine lange Liste statischer Ausnahmen aufschreiben. Aber gibt es eine Möglichkeit, IPTables anzuweisen, kein DNAT durchzuführen, wenn der Port auf dem eigentlichen Host nicht geschlossen ist, wenn das Paket lokal erfolgreich verarbeitet werden soll? Wenn ich also beispielsweise später auf dem Server einen zufälligen Port von 9988 öffne, muss ich keine weitere Ausnahme hinzufügen, iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 9988 -j ACCEPTsondern es wird einfach kein DNAT durchgeführt?

Antwort1

Scheint, als iptables -t nat -I PREROUTING 1 -i eth0 -m socket --nowildcard -j ACCEPTwürde das funktionieren. -m socketLaut Beschreibung tut es genau das – es gleicht ab, ob es einen akzeptierenden Socket für dieses Paket gibt. Der Trick bestand darin, die --nowildcardOption zu verwenden, die ich zuvor weggelassen hatte – sogar auf der Manpage steht: „Der Socket-Abgleich akzeptiert standardmäßig keine Null-gebundenen Listener, da dann lokale Dienste Datenverkehr abfangen könnten, der andernfalls weitergeleitet würde.“ – was eigentlich genau das ist, was ich brauchte – dass die lokalen Dienste abfangen, wenn einer verfügbar ist!

Die resultierenden Regeln sind: iptables -t nat -I PREROUTING 1 -i eth0 -m socket --nowildcard -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 22 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p gre -j ACCEPT iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.110.2

Ich habe Port 22 (SSH) freigelassen, für den Fall, dass es nicht wie erwartet funktioniert – aber beim Testen scheint es perfekt zu funktionieren!

verwandte Informationen