Iptables funktioniert nicht wie erwartet: Antwortpaket nicht wie erwartet mit DNAT in PREROUTING DNATed

Iptables funktioniert nicht wie erwartet: Antwortpaket nicht wie erwartet mit DNAT in PREROUTING DNATed

Mein Server (auf dem die untenstehenden iptablesRegeln geladen sind) hat die IP 192.168.3.110. In meinem LAN gibt es einen anderen Computer mit der IP 192.168.3.106. Ich versuche, Anfragen an meinen Server auf Port 80 umzuleiten auf 192.168.3.106.

Ich habe die folgende iptablesDatei, die auf meinen CentOS 7-Server geladen ist:


*nat
:PREROUTING DROP
:INPUT DROP
:OUTPUT DROP
:POSTROUTING DROP

-A PREROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT
-A PREROUTING -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A PREROUTING --dst 192.168.3.110 -p tcp --dport 80 -j DNAT --to-destination 192.168.3.106
-A PREROUTING -i lo -j ACCEPT

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT

-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A OUTPUT --dst 192.168.3.110 -p tcp -m state --state NEW --dport 80 -j DNAT --to-destination 192.168.3.106
-A OUTPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

-A POSTROUTING -m state --state RELATED,ESTABLISHED -j ACCEPT
-A POSTROUTING -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A POSTROUTING --src 192.168.3.0/24 --dst 192.168.3.106 -p tcp --dport 80 -j SNAT --to-source 192.168.3.110
-A POSTROUTING -o lo -j ACCEPT

COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT

-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

-A OUTPUT -p tcp --sport 22 -j ACCEPT
-A OUTPUT -p tcp -j ACCEPT
-A OUTPUT -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

COMMIT

Im Wesentlichen gehe ich dabei folgendermaßen vor (zumindest verstehe ich das so):

  • SSH aktivieren

  • TCP auf Port 80 aktivieren

  • DNAT- und SNAT-Pakete, damit ich das gewünschte Verhalten erreiche.

Frage:Ich verstehe nicht, warum 192.168.3.110ich eine Antwort erhalte, wenn ich von meinem Server aus einen Anruf an sich selbst tätige.

So verstehe ich, dass es in diesem Fall funktionieren sollte:

  1. curl http://192.168.3.110- vergessen Sie nicht, dass ich dies von meinem Server aus ausführe, mit IP192.168.3.110
  2. Das Paket geht von der NAT-Tabelle zur Ausgabekette, wo es DNATed ist
  3. Das Paket geht von der NAT-Tabelle zur POSTROUTING-Kette, wo es SNATed wird.
  4. mein Apache von 192.168.3.106antwortet auf meine Anfrage.
  5. Paket erreicht PREROUTING-Kette aus NAT-Tabelle, wo es DNATed werden soll
  6. Paket wird weitergeleitet und irgendwohin geworfen.

Alles scheint wie erwartet zu funktionieren, außer 5 und 6. Mit anderen Worten, ich erhalte die Antwort vom Server.Kann mir jemand erklären, wo meine Logik fehlerhaft ist?

Antwort1

Die iptables-NAT-Tabellen werden nur für das erste Paket einer (Pseudo-)Verbindung durchlaufen. Spätere Pakete werden gemäß den vom ersten Paket erstellten Zuordnungen zugeordnet (oder unverändert gelassen).

verwandte Informationen