Wie kann ich ausgehenden Datenverkehr mit iptables lokal auf Port 80 umleiten?

19

Ich versuche, Ports auf meinem Ubuntu-Rechner mit lokal umzuleiten iptables. Ähnlich wie beim transparenten Proxying. Ich möchte alles abfangen, was versucht, mein System auf Port 80 zu belassen und es auf einen Remote-Host und einen Remote-Port umzuleiten.

Kann ich dies mit den NAT- und Pre-Routing-Funktionen von erreichen iptables?

pjf
quelle

Antworten:

30

Versuchen Sie diese iptablesRegel:

$ sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination IP:80

Das oben Gesagte sagt zu:

  • Fügen Sie der NAT-Tabelle ( -t nat) die folgende Regel hinzu .
  • Diese Regel wird -Aan den ausgehenden Datenverkehr angehängt ( OUTPUT).
  • Wir interessieren uns nur für TCP-Verkehr ( -p tcp).
  • Wir sind nur an Verkehr interessiert, dessen Zielhafen 80 ( --dport 80) ist.
  • Wenn wir eine Übereinstimmung haben, springen Sie zu DNAT ( -j DNAT).
  • Leiten Sie diesen Datenverkehr an den IP @ -Port 80 ( --to-destination IP:80) eines anderen Servers weiter .

Was ist DNAT?

DNAT
    This target is only valid in the nat table, in the PREROUTING and OUTPUT 
    chains, and user-defined chains which are only called from those chains.
    It specifies that the destination address of the packet should be modified 
    (and all future packets in  this  connection will also be mangled), and
     rules should cease being examined.

Verweise

slm
quelle
danke dafür aber es scheint nicht zu funktionieren. Ich habe jedoch seitdem festgestellt, dass dies funktioniert.
pjf
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --zum Ziel xx.xx.xx.xx: 3128
pjf
Liegt das daran, dass dies lokal und nicht über ein Gateway erfolgt? Ihr SNAT würde über ein Gateway arbeiten?
pjf
@pjf - ich glaube schon. Ich habe meine Antwort aktualisiert.
SLM
@pjf - Ich habe beide Regeln gefunden und war dabei, meine Antwort mit beiden zu aktualisieren. Ich war mir nicht sicher, in welcher Situation Sie sich befanden.
slm
6

Dies kann präzisiert werden, um nur den Verkehr zu einem bestimmten Zielhost zu verarbeiten. Zum Beispiel, wenn Postfix einen Fehler gemacht hat und Mails in der Warteschlange an eine alte IP-Adresse gesendet werden sollen.

iptables -t nat -A OUTPUT -p tcp -d {ONLY_TO_THIS_DESTINATION} --dport 25 -j DNAT --to-destination {NEW_IP}:25
Widmo
quelle
4

Auf diese Weise können Sie Ports in alle IP-Adressen übersetzen. Der Hauptunterschied hierbei ist das Fehlen einer IP-Adresse im --to-destinationFeld.

iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination :80
Felipe Alvarez
quelle
Sehr nützlicher Tipp; genau das, was ich brauchte. Gibt es eine Möglichkeit, die Portnummer zu erhöhen? Angenommen, ich habe eine Reichweite von 100 Ports und möchte sie alle um einen bestimmten Betrag erhöhen.
Zdenek
Nicht sicher was du meinst. Könnten Sie eine for-Schleife in Bash schreiben?
Felipe Alvarez
Eine Schleife, die 100 Iptables-Regeln hinzufügt, würde funktionieren, diese jedoch verlangsamen. Ich würde es vorziehen, in der Lage zu sein, viele aufeinanderfolgende Ports in einer einzigen Regel zu erhöhen.
Zdenek
@Zdenek Ich weiß nicht, ob das mit iptables möglich ist. Haben Sie sich an firewalld?
Felipe Alvarez