Comment puis-je transférer avec iptables?

118

Je veux que les connexions entrant 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?

Stu
la source
6
NAT HOWTO
Paul Tomblin
Je vais aller avec la balise npr (bien que cela puisse être lié à la programmation, bien que mal formulé, bien sûr.)
Mihai Limbăşan
Que diriez-vous de cela: je suis un programmeur qui essaie de configurer un environnement pour pouvoir déboguer mon application serveur dans eclipse et être appelé à partir d’innernet. Assez proche?
Bien sûr, c'est ce que je voulais dire par "mal formulé" ... Pourriez-vous modifier la question en conséquence?
Mihai Limbăşan

Réponses:

97

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 reviennent 1c'est ok. Si ce n'est pas le cas:

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 - DNATpourrait être appliqué sur la nattable seulement. Donc, votre règle devrait être étendue en ajoutant également 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 s'appliquent uniquement au trafic TCP (si vous souhaitez également modifier UDP, vous devez fournir des règles similaires mais avec des -p udpoptions définies).

Dernier point, mais non le moindre, la configuration du routage. Type:

ip route

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

oo_olo_oo
la source
16
Personnellement, je préfère la sysctlsyntaxe commesysctl net.ipv4.conf.eth0.forwarding=1
Doud
1
Comment puis-je supprimer la règle entrée de manière incorrecte?
Nickolai Leschov
2
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 obligatoire si vous ne disposez pas de restrictions / de sécurité du pare-feu, qui est le cas avec la plupart des réseaux locaux domestiques, sinon faites attention avec -A, car il l'ajoutera APRÈS les restrictions / sécurité et risque de ne pas fonctionner (vérifiez -I au lieu de cela, c'est-à-dire qu'il ajoute EN DEVANT les règles iptables)
THESorcerer
2
@ ÁronLőrincz, Non. Les règles Iptables sont volatiles, à moins d'être explicitement chargées au démarrage.
sherrellbc
1
@ Nickolai Leschov, entrez le même remplacement -Apar-D
Alexei Martianov
14

Je pense que ce que tu veux 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
Robert Gamble
la source
2
euh ... c'est ce que j'ai déjà. J'utilise iptables-restore pour le charger de sorte que chacun se trouve dans sa propre section, mais c'est ce que j'ai écrit ci-dessus.
D'accord, la syntaxe paraissait mauvaise dans l'original. Avez-vous essayé -i ppp0 dans les règles? Quel est exactement le problème?
Robert Gamble
13

Vous oubliez l'adresse source 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 un ordinateur avec une adresse 192.168.1.200.

Zélé
la source
Vous l'avez à l'envers sur la POSTROUNTINGmarche. À ce stade, la conversation porte toujours sur --destinationplutôt que sur --source.
sherrellbc
6

J'ai créé le script bash suivant pour le 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, il suffit de 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.

Nullivex
la source
2

J'avais pour tâche de faire croire à MACHINE_A que le service s'exécute physiquement sur MACHINE_B, mais que toutes les demandes soient redirigées de manière transparente 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:

  1. Pour autoriser la transmission de paquets sur une interface spécifique uniquement. Par exemple:

    sysctl net.ipv4.conf.eth0.forwarding=1
    
  2. Pour autoriser non seulement MACHINE_A, mais également tous les autres utilisateurs, à utiliser la redirection de port, supprimez:

    -s MACHINE_A
    
Denis Scherbakov
la source
1

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.

Adam Liss
la source
0

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 le travail FORWARD quand j'écris:

iptables -t nat -A POSTROUTING -o $LAN_IF -p tcp -m tcp --dport $FW_PORT -j SNAT --to-source $LAN_IP
  • LAN_IF - interface LAN (par exemple, eth1, br0 ...)
  • FW_PORD - port transféré (sur l'hôte de détination)
  • LAN_IP - adresse IP sur l'interface LAN (sur le routeur)

PREROUTING et FORWARD sont également nécessaires, bien sûr :)

Andrew
la source