150 votes

Comment puis-je rediriger les ports avec iptables ?

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 fonctionne pas. Qu'est-ce qui me manque?

7 votes

0 votes

Je vais opter pour la balise n-p-r (bien que cela puisse être lié à la programmation, bien que mal formulé bien sûr.)

2 votes

Que diriez-vous de ceci : Je suis un programmeur essayant de mettre en place un environnement pour pouvoir déboguer mon application serveur dans Eclipse, appelée depuis l'intranet. Cela vous convient-il ?

121voto

oo_olo_oo Points 1186

Tout d'abord - vous devriez vérifier si le renvoi est autorisé :

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

Si les deux retournent 1 c'est bon. Sinon, faites ce qui 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. Donc, votre règle devrait être étendue en ajoutant la 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 sont appliquées uniquement au trafic TCP (si vous voulez aussi modifier l'UDP, vous devez fournir des règles similaires mais avec l'option -p udp définie).

Enfin, mais non le moindre est la configuration du routage. Tapez :

ip route

et vérifiez si 192.168.1.0/24 se trouve parmi les entrées de routage retournées.

18 votes

Je préfère personnellement la syntaxe sysctl comme sysctl net.ipv4.conf.eth0.forwarding=1

1 votes

Comment puis-je supprimer la règle incorrectement saisie ?

3 votes

La deuxième ligne : "iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT" n'est PAS nécessaire si vous n'avez pas de restrictions/sécurité de pare-feu, ce qui est le cas avec la plupart des réseaux locaux domestiques, sinon soyez prudent avec -A, car il l'ajoutera APRÈS les restrictions/sécurité et pourrait ne pas fonctionner (donc vérifiez -I à la place, qui ajoute DEVANT les règles iptables)

25voto

rustyx Points 1406

La solution acceptée fonctionne lorsque l'hôte de destination et la passerelle sont sur le même sous-réseau (comme c'est le cas ici, tous deux sont sur eth0 192.168.1.0/24).

Voici une solution générique pour quand la passerelle, la source et la destination sont tous sur des sous-réseaux différents.

1) Activer l'acheminement IP :

sysctl net.ipv4.conf.eth0.forwarding=1 
sysctl net.ipv6.conf.eth0.forwarding=1 

//note: si l'acheminement vers/depuis <code>localhost</code>, définir également <code>sysctl net.ipv4.conf.eth0.route_localnet=1</code>


2) Ajouter 2 règles iptables pour transmettre un port TCP spécifique :

Pour réécrire l'IP de destination du paquet (et inversement dans le paquet de réponse) :

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

Pour réécrire l'IP de source du paquet vers l'IP de la passerelle (et inversement dans le paquet de réponse) :

iptables -A POSTROUTING -t nat -p tcp -d 192.168.1.200 --dport 8080 -j MASQUERADE

3) Si vous n'avez pas de règle de pare-feu par défaut ACCEPT, autorisez le trafic vers la destination :

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

4) Tester le nouveau configuration. Si cela fonctionne, assurez-vous que les modifications persistent après les redémarrages :

cat < /etc/sysctl.d/99-forwarding.conf
sysctl net.ipv4.conf.eth0.forwarding=1 
sysctl net.ipv6.conf.eth0.forwarding=1 
EOF

iptables-save > /etc/network/iptables.up.rules

echo '#!/bin/sh' > /etc/network/if-pre-up.d/iptables
echo "`which iptables-restore` < /etc/network/iptables.up.rules" >> /etc/network/if-pre-up.d/iptables
chmod +x /etc/network/if-pre-up.d/iptables

4 votes

Je suppose que cela devrait être la réponse acceptée car les autres ne tiennent pas compte de la partie POSTROUTING qui résout le problème d'appeler wanIP:8081 depuis le LAN.

0 votes

Cela a fonctionné pour moi, la première fois, après des mois de lutte avec diverses alternatives inférieures. Excellent. Je suppose qu'on peut faire confiance à quelqu'un nommé "rusty" en ce qui concerne les iptables... :-)

19voto

EB. Points 908

Vous oubliez postrouting adresse source 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.

1 votes

Vous vous trompez dans l'étape POSTROUNTING. À ce stade, la conversation concerne toujours la --destination plutôt que la --source.

0 votes

Système intégré -/bin/sh: sysctl: not found

18voto

Roy Rico Points 1547

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

3 votes

Ummm... c'est ce que j'ai déjà. J'utilise iptables-restore pour le charger afin que chaque élément soit dans sa propre section, mais c'est ce que j'ai écrit ci-dessus.

0 votes

D'accord, la syntaxe semblait mauvaise dans l'original. Avez-vous essayé -i ppp0 dans les règles? Quel est exactement le problème?

10voto

Nullivex Points 91

J'ai créé le script bash suivant pour faire cela sur mon routeur Linux. Il infère automatiquement l'adresse IP WAN et confirme vos sélections avant de procéder.

#!/bin/bash

# décider quelle action utiliser
action="add"
if [[ "-r" == "$1" ]]; then
  action="remove"
  shift
fi

# séparer les composants
dest_addr_lan="$1"
dest_port_wan="$2"
dest_port_lan="$3"

# trouver notre adresse WAN
wan_addr=`curl -4 -s icanhazip.com`

# remplir automatiquement notre port LAN de destination si nécessaire
if [ -z $dest_port_lan ]; then
  dest_port_lan="$dest_port_wan"
fi

# afficher les infos pour vérification
echo "Adresse LAN de destination : $dest_addr_lan"
echo "Port WAN de destination : $dest_port_wan"
echo "Port LAN de destination : $dest_port_lan"
echo "Adresse WAN : $wan_addr"

# confirmer avec l'utilisateur
read -p "Est-ce que tout est correct ? " -n 1 -r
echo    # (optionnel) aller à la ligne suivante
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 "Règle de redirection supprimée"
  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 "Règle de redirection ajoutée"
  fi
else
  echo "Infos non confirmées, sortie..."
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
... confirmer les détails ... appuyer sur y
# Règle de redirection ajoutée

Pour supprimer la même règle

# ./port_forward.sh -r 192.168.1.100 3000
... confirmer les détails ... appuyer sur y
# Règle de redirection supprimée

Je pensais que cela pourrait faire gagner du temps à quelqu'un sur leur routeur respectif.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X