Je veux que les connexions arrivant sur ppp0 sur le port 8001 soient routées vers 192.168.1.200 sur eth0 sur le port 8080.
J'ai ces deux règles
-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
et ça ne marche pas. Qu'est-ce que je rate?
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. Sinon, 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
pourrait être appliqué uniquement sur la table nat
. Par conséquent, votre règle doit être étendue en ajoutant également des spécifications 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).
Dernier point, mais non le moindre, la configuration du routage. Type:
ip route
et vérifiez si 192.168.1.0/24
fait partie des entrées de routage renvoyées.
Je pense que ce que vous voulez c'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
Vous oubliez l'adresse source post-routage SNAT:
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.
J'ai créé le script bash suivant pour ce faire 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, copiez et collez-le 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.
J'ai eu la tâche de faire croire à MACHINE_A que le service s'exécute physiquement sur MACHINE_B, mais de réacheminer de manière transparente toutes les demandes 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 aussi tous les autres à utiliser la redirection de port, supprimez:
-s MACHINE_A
Essayer
echo "1" > /proc/sys/net/ipv4/conf/ppp0/forwarding
echo "1" > /proc/sys/net/ipv4/conf/eth0/forwarding
Ces fichiers indiquent au noyau qu'il est autorisé à transférer des paquets entre les interfaces.
Cette commande ne fonctionne pas pour moi:
-A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip
J'ai 2 interfaces LAN et je travaille FORWARD quand j'écrirai:
iptables -t nat -A POSTROUTING -o $LAN_IF -p tcp -m tcp --dport $FW_PORT -j SNAT --to-source $LAN_IP
PRÉROUVER et AVANCER sont également nécessaires, bien sûr :)