Solution 1 :
Tout d'abord, vous devez vérifier si le transfert est autorisé :
cat /proc/sys/net/ipv4/conf/ppp0/forwarding
cat /proc/sys/net/ipv4/conf/eth0/forwarding
Si les deux renvoient 1
c'est bon. Si ce n'est pas le cas, procédez comme suit :
echo '1' | sudo tee /proc/sys/net/ipv4/conf/ppp0/forwarding
echo '1' | sudo tee /proc/sys/net/ipv4/conf/eth0/forwarding
Deuxième chose - DNAT
peut être appliqué le nat
tableau uniquement. Ainsi, votre règle doit être étendue en ajoutant également une spécification de table (-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
Les deux règles s'appliquent uniquement au trafic TCP (si vous souhaitez également modifier UDP, vous devez fournir des règles similaires mais avec -p udp
jeu d'options).
Le dernier point, mais non le moindre, est la configuration du routage. Saisissez :
ip route
et vérifiez si 192.168.1.0/24
figure parmi les entrées de routage renvoyées.
Solution 2 :
Je pense que ce que vous voulez est :
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
Solution 3 :
Vous oubliez l'adresse source de post-routage 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
Et n'oubliez pas de définir votre pare-feu Linux comme passerelle par défaut sur l'ordinateur avec l'adresse 192.168.1.200.
Solution 4 :
J'ai créé le script bash suivant pour faire cela sur mon routeur Linux. Il déduit automatiquement l'IP WAN et confirme vos sélections avant de continuer.
#!/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
L'utilisation du script est simple, il suffit de le copier et de le coller dans un fichier, puis.
# chmod +x port_forward.sh
# ./port_forward.sh 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule added
Pour supprimer la même règle
# ./port_forward.sh -r 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule removed
J'ai pensé que cela pourrait faire gagner du temps à quelqu'un sur son routeur respectif.
Solution 5 :
J'avais pour tâche de faire croire à MACHINE_A que le service s'exécute physiquement sur MACHINE_B, mais de rediriger de manière transparente toutes les requêtes vers MACHINE_C.
L'astuce consistait à utiliser MASQUERADE.
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
Veuillez noter que vous voudrez peut-être modifier les commandes :
-
Pour autoriser le transfert de paquets sur une interface spécifique uniquement. Par exemple :
sysctl net.ipv4.conf.eth0.forwarding=1
-
Pour autoriser non seulement MACHINE_A, mais également tous les autres à utiliser la redirection de port, supprimez :
-s MACHINE_A