Frage Wie kann ich mit iptables weiterleiten?


Ich möchte, dass Verbindungen, die auf Port 8001 auf ppp0 eingehen, auf eth0 auf Port 8080 zu 192.168.1.200 weitergeleitet werden.

Ich habe diese zwei Regeln

-A PREROUTING  -p tcp -m tcp --dport 8001 -j DNAT --to-destination 192.168.1.200:8080

-A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state NEW,ESTABLISHED,RELATED -j ACCEPT

und es funktioniert nicht. Was vermisse ich?


110
2017-12-05 21:06


Ursprung


NAT-HOWTO - Paul Tomblin
Ich werde mit dem n-p-r Tag gehen (obwohl das könnte Programmier-bezogen sein, aber schlecht formuliert natürlich.) - Mihai Limbăşan
Wie wäre es damit: Ich bin ein Programmierer, der versucht, eine Umgebung einzurichten, so dass ich meine Server-Anwendung in der Eclipse debuggen kann, die vom inneren Netz angerufen wird. Nahe genug?
Klar, das meinte ich mit "schlecht formuliert" ... Könnten Sie die Frage entsprechend bearbeiten? - Mihai Limbăşan


Antworten:


Zunächst einmal sollten Sie prüfen, ob Weiterleitungen überhaupt erlaubt sind:

cat /proc/sys/net/ipv4/conf/ppp0/forwarding 
cat /proc/sys/net/ipv4/conf/eth0/forwarding 

Wenn beide zurückkommen 1 Es ist in Ordnung. Wenn nicht, folgendes tun:

echo '1' | sudo tee /proc/sys/net/ipv4/conf/ppp0/forwarding
echo '1' | sudo tee /proc/sys/net/ipv4/conf/eth0/forwarding

Zweite Sache - DNAT könnte auf angewendet werden nat nur Tabelle. Daher sollte Ihre Regel durch Hinzufügen von Tabellenspezifikationen erweitert werden (-t nat):

iptables -t nat -A PREROUTING -p tcp -i ppp0 --dport 8001 -j DNAT --to-destination 192.168.1.200:8080
iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Beide Regeln werden nur auf TCP-Datenverkehr angewendet (wenn Sie auch UDP ändern möchten, müssen Sie ähnliche Regeln angeben, jedoch mit -p udp Optionssatz).

Last but not least ist Routing-Konfiguration. Art:

ip route

und überprüfe, ob 192.168.1.0/24 gehört zu den zurückgegebenen Routing-Einträgen.


91
2018-03-24 11:24



Ich persönlich bevorzuge die sysctl Syntax wie sysctl net.ipv4.conf.eth0.forwarding=1 - Doud
Wie entferne ich die falsch eingegebene Regel? - Nickolai Leschov
zweite Zeile: "iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m Status --state NEU, ESTABLISHED, RELATED -j ACCEPT" ist NICHT erforderlich, wenn Sie keine Firewall-Einschränkungen / Sicherheit haben, die ist bei den meisten Heim-LANs der Fall, ansonsten sei vorsichtig mit -A, weil es nach Einschränkungen / Sicherheit hinzugefügt wird und möglicherweise nicht funktioniert (also überprüfe -I, das heißt, ich füge VOR den iptables-Regeln hinzu) - THESorcerer
@ ÁronLőrincz, Nein. Iptables-Regeln sind flüchtig, wenn sie nicht explizit beim Booten geladen werden. - sherrellbc
@Nickolai Leschov, gleiches Ersetzen eingeben -A mit -D - Alexei Martianov


Ich denke was du willst ist:

iptables -A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state 
    NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -A PREROUTING -p tcp --dport 8001 -j DNAT --to-destination
    192.168.1.200:8080

14
2017-12-05 21:43



Ähm ... das ist was ich schon habe. Ich benutze iptables-restore, um es zu laden, so dass jeder in seinem eigenen Abschnitt ist, aber das ist, was ich oben geschrieben habe.
Okay, die Syntax sah im Original schlecht aus. Hast du -i ppp0 in den Regeln getestet? Was ist das Problem genau? - Robert Gamble


Sie vergessen, die Ausgangsadresse SNAT 'ing zu setzen:

sysctl net.ipv4.ip_forward=1
yours_wan_ip=101.23.3.1
-A PREROUTING  -p tcp -m tcp -d $yours_wan_ip --dport 8001 -j DNAT --to-destination 192.168.1.200:8080

-A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state NEW,ESTABLISHED,RELATED -j ACCEPT

-A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip

Und vergessen Sie nicht, Ihre Linux-Firewall als Standard-Gateway auf dem Computer mit 192.168.1.200 Adresse zu setzen.


12
2018-06-09 11:09



Du hast es rückwärts auf der POSTROUNTING Schritt. An diesem Punkt geht es immer noch um das Gespräch --destination eher, als --source. - sherrellbc


Ich habe das folgende Bash-Skript dafür auf meinem Linux-Router erstellt. Es leitet automatisch die WAN-IP ab und bestätigt Ihre Auswahl, bevor Sie fortfahren.

#!/bin/bash

# decide which action to use
action="add"
if [[ "-r" == "$1" ]]; then
  action="remove"
  shift
fi

# break out components
dest_addr_lan="$1"
dest_port_wan="$2"
dest_port_lan="$3"

# figure out our WAN ip
wan_addr=`curl -4 -s icanhazip.com`

# auto fill our dest lan port if we need to
if [ -z $dest_port_lan ]; then
  dest_port_lan="$dest_port_wan"
fi

# print info for review
echo "Destination LAN Address: $dest_addr_lan"
echo "Destination Port WAN: $dest_port_wan"
echo "Destination Port LAN: $dest_port_lan"
echo "WAN Address: $wan_addr"

# confirm with user
read -p "Does everything look correct? " -n 1 -r
echo    # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]; then
  if [[ "remove" == "$action" ]]; then
    iptables -t nat -D PREROUTING  -p tcp -m tcp -d $wan_addr --dport     $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan
    iptables -D FORWARD -m state -p tcp -d $dest_addr_lan --dport     $dest_port_lan --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -t nat -D POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport     $dest_port_lan -j SNAT --to-source $wan_addr
    echo "Forwarding rule removed"
  else
    iptables -t nat -A PREROUTING  -p tcp -m tcp -d $wan_addr --dport     $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan
    iptables -A FORWARD -m state -p tcp -d $dest_addr_lan --dport     $dest_port_lan --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -t nat -A POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport $dest_port_lan -j SNAT --to-source $wan_addr
    echo "Forwarding rule added"
  fi
else
  echo "Info not confirmed, exiting..."
fi

Die Verwendung des Skripts ist einfach, kopieren und fügen Sie es in eine Datei und dann.

# chmod +x port_forward.sh
# ./port_forward.sh 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule added

Um die gleiche Regel zu entfernen

# ./port_forward.sh -r 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule removed

Ich dachte, das könnte jemandem Zeit auf seinem jeweiligen Router sparen.


5
2017-12-14 22:02





Versuchen

echo "1" > /proc/sys/net/ipv4/conf/ppp0/forwarding
echo "1" > /proc/sys/net/ipv4/conf/eth0/forwarding

Diese Dateien teilen dem Kernel mit, dass Pakete zwischen den Schnittstellen weitergeleitet werden dürfen.


1
2017-12-10 02:58





Ich hatte die Aufgabe, MACHINE_A zu denken, dass der Dienst physisch auf MACHINE_B läuft, aber alle Anfragen transparent an MACHINE_C weiterzuleiten.

Der Trick bestand darin, MASQUERADE zu verwenden.

sysctl net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -p tcp -d MACHINE_B --dport 443 -j DNAT --to-destination MACHINE_C

iptables -t nat -A POSTROUTING -s MACHINE_A -o INTERFACE_NAME -j MASQUERADE

Bitte beachten Sie, dass Sie die Befehle möglicherweise anpassen möchten:

  1. Um Paketweiterleitung nur an einer bestimmten Schnittstelle zu ermöglichen. Zum Beispiel:

    sysctl net.ipv4.conf.eth0.forwarding=1
    
  2. Damit nicht nur MACHINE_A, sondern auch alle anderen Portweiterleitungen verwenden können, entfernen Sie:

    -s MACHINE_A
    

1
2018-03-17 09:02





Dieser Befehl funktioniert nicht für mich:

-A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip

Ich habe 2 LAN-Schnittstellen und FORWARD arbeite, wenn ich geschrieben habe:

iptables -t nat -A POSTROUTING -o $LAN_IF -p tcp -m tcp --dport $FW_PORT -j SNAT --to-source $LAN_IP
  • LAN_IF - LAN Schnittstelle (zB eth1, br0 ...)
  • FW_PORD - Weitergeleiteter Port (auf dem Zielhost)
  • LAN_IP - IP-Adresse an der LAN-Schnittstelle (am Router)

PREROUTING und FORWARD sind natürlich auch notwendig :)


0
2018-05-24 12:04