Lösung 1:
Zunächst sollten Sie prüfen, ob die Weiterleitung überhaupt erlaubt ist:
cat /proc/sys/net/ipv4/conf/ppp0/forwarding
cat /proc/sys/net/ipv4/conf/eth0/forwarding
Wenn beide 1
zurückgeben Es ist in Ordnung. Wenn nicht, gehen Sie wie folgt vor:
echo '1' | sudo tee /proc/sys/net/ipv4/conf/ppp0/forwarding
echo '1' | sudo tee /proc/sys/net/ipv4/conf/eth0/forwarding
Zweitens - DNAT
könnte auf nat
angewendet werden nur Tisch. Daher sollte Ihre Regel um eine Tabellenspezifikation 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-Verkehr angewendet (wenn Sie auch UDP ändern möchten, müssen Sie ähnliche Regeln angeben, jedoch mit -p udp
Optionssatz).
Zu guter Letzt ist die Routing-Konfiguration. Geben Sie ein:
ip route
und prüfen Sie, ob 192.168.1.0/24
gehört zu den zurückgegebenen Routing-Einträgen.
Lösung 2:
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
Lösung 3:
Sie vergessen die Postrouting-Quelladresse SNAT 'ing:
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 der Adresse 192.168.1.200 einzustellen.
Lösung 4:
Ich habe das folgende Bash-Skript erstellt, um dies auf meinem Linux-Router zu tun. Es leitet automatisch die WAN-IP ab und bestätigt Ihre Auswahl, bevor es fortfährt.
#!/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 einfach und fügen Sie es in eine Datei ein.
# chmod +x port_forward.sh
# ./port_forward.sh 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule added
So entfernen Sie dieselbe Regel
# ./port_forward.sh -r 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule removed
Ich dachte, dies könnte jemandem Zeit auf seinem jeweiligen Router sparen.
Lösung 5:
Ich hatte die Aufgabe, MACHINE_A glauben zu machen, dass der Dienst physisch auf MACHINE_B läuft, aber alle Anfragen 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 vielleicht die Befehle optimieren möchten:
-
Paketweiterleitung nur auf einer bestimmten Schnittstelle zulassen. Zum Beispiel:
sysctl net.ipv4.conf.eth0.forwarding=1
-
Um nicht nur MACHINE_A, sondern auch allen anderen die Verwendung der Portweiterleitung zu erlauben, entfernen Sie:
-s MACHINE_A