Wie kann ich mit iptables portieren?

118

Ich möchte, dass auf ppp0 an Port 8001 eingehende Verbindungen auf eth0 an Port 8080 zu 192.168.1.200 geroutet werden.

Ich habe diese beiden 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?

Stu
quelle
6
NAT HOWTO
Paul Tomblin
Ich werde mit dem npr-Tag gehen (obwohl dies programmierbezogen sein könnte , obwohl es natürlich schlecht formuliert ist.)
Mihai Limbăşan
Wie wäre es damit: Ich bin ein Programmierer, der versucht, eine Umgebung einzurichten, damit ich meine Serveranwendung in Eclipse debuggen kann, das über das Internet aufgerufen wird. Nahe genug?
Klar, das habe ich mit "schlecht formuliert" gemeint ... Könnten Sie die Frage entsprechend bearbeiten?
Mihai Limbăşan

Antworten:

97

Zunächst sollten Sie prüfen, ob die Weiterleitung überhaupt zulässig ist:

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

Wenn beide zurückkehren, ist 1es in Ordnung. Wenn nicht, machen Sie folgendes:

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

Zweitens - DNATkönnte nur auf dem natTisch angewendet werden . Daher sollte Ihre Regel auch 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 gelten nur für den TCP-Verkehr (wenn Sie auch UDP ändern möchten, müssen Sie ähnliche Regeln mit festgelegten -p udpOptionen angeben).

Last, but not least ist die Routing-Konfiguration. Art:

ip route

und prüfen Sie, ob 192.168.1.0/24es sich um zurückgegebene Routing-Einträge handelt.

oo_olo_oo
quelle
16
Ich persönlich bevorzuge die sysctlSyntax wiesysctl net.ipv4.conf.eth0.forwarding=1
Doud
1
Wie entferne ich die falsch eingegebene Regel?
Nickolai Leschov
2
zweite Zeile: "iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NEW, ESTABLED, RELATED -j ACCEPT" ist NICHT erforderlich, wenn Sie keine Firewall-Einschränkungen / Sicherheit haben, die Dies ist bei den meisten Heim-LANs der Fall. Andernfalls sollten Sie mit -A vorsichtig sein, da es NACH Einschränkungen / Sicherheit hinzugefügt wird und möglicherweise nicht funktioniert (aktivieren Sie stattdessen -I, das
VOR den
2
@ ÁronLőrincz, Nein. Iptables-Regeln sind flüchtig, sofern sie nicht explizit beim Booten geladen werden.
Sherrellbc
1
@Nickolai Leschov, geben Sie die gleiche Ersetzung -Amit-D
Alexei Martianov
14

Ich denke, was Sie wollen, 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
Robert Gamble
quelle
2
ähm ... das ist was ich schon habe. Ich benutze iptables-restore, um es zu laden, so dass jedes in einem eigenen Abschnitt ist, aber das habe ich oben geschrieben.
Okay, die Syntax sah im Original schlecht aus. Hast du -i ppp0 in den Regeln ausprobiert? Was genau ist das Problem?
Robert Gamble
13

Sie haben die Postrouting-Quelladresse vergessen.

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 für Computer mit der Adresse 192.168.1.200 festzulegen.

Eifrig
quelle
Sie haben es auf der POSTROUNTINGStufe rückwärts geschafft . An diesem Punkt dreht sich das Gespräch --destinationeher um als um --source.
Sherrellbc
6

Ich habe das folgende Bash-Skript erstellt, um dies auf meinem Linux-Router zu tun. Es leitet die WAN-IP automatisch ein 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 Sie es 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

Dieselbe Regel entfernen

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

Ich dachte, dies könnte jemandem Zeit auf dem jeweiligen Router sparen.

Nullivex
quelle
2

Ich hatte die Aufgabe, MACHINE_A zu veranlassen, zu denken, dass der Dienst auf MACHINE_B physisch ausgeführt wird, aber alle Anforderungen transparent an MACHINE_C umzuleiten.

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 optimieren möchten:

  1. Paketweiterleitung nur auf einer bestimmten Schnittstelle zulassen. Zum Beispiel:

    sysctl net.ipv4.conf.eth0.forwarding=1
    
  2. Entfernen Sie Folgendes, damit nicht nur MACHINE_A, sondern auch alle anderen Benutzer die Portweiterleitung verwenden können:

    -s MACHINE_A
    
Denis Scherbakov
quelle
1

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 er Pakete zwischen den Schnittstellen weiterleiten darf.

Adam Liss
quelle
0

Dieser Befehl funktioniert bei mir nicht:

-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 arbeite weiter, wenn ich schreibe:

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 Detinationshost)
  • LAN_IP - IP-Adresse an der LAN-Schnittstelle (am Router)

PREROUTING und FORWARD sind natürlich auch notwendig :)

Andrew
quelle