Question Comment puis-je transférer avec iptables?


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?


110
2017-12-05 21:06


origine


NAT HOWTO - Paul Tomblin
Je vais aller avec la balise n-p-r (bien que cette pourrait être lié à la programmation, bien que mal formulé, bien sûr.) - Mihai Limbăşan
Que diriez-vous de cela: je suis un programmeur essayant de configurer un environnement afin de pouvoir déboguer mon application serveur dans eclipse, appelée depuis 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:


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 1 c'est bon. 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 - DNAT pourrait être appliqué sur nat table seulement. Donc, votre règle devrait être étendue en ajoutant aussi 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 le protocole UDP, vous devez fournir des règles similaires mais avec -p udp ensemble d'options).

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

ip route

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


91
2018-03-24 11:24



Personnellement, je préfère le sysctl syntaxe comme sysctl net.ipv4.conf.eth0.forwarding=1 - Doud
Comment puis-je supprimer la règle mal entrée? - Nickolai Leschov
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 de la plupart des réseaux locaux domestiques, sinon faites attention avec -A, car il l'ajoutera APRES restrictions / sécurité et risque de ne pas fonctionner (vérifiez donc -I, c'est-à-dire que vous ajoutez EN DEVANT des règles iptables) - THESorcerer
@ ÁronLőrincz, Non. Les règles Iptables sont volatiles, à moins d'être explicitement chargées au démarrage. - sherrellbc
@ Nickolai Leschov, entrez même remplacement -A avec -D - Alexei Martianov


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

14
2017-12-05 21:43



euh ... c'est ce que j'ai déjà. J'utilise iptables-restore pour le charger afin 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


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.


12
2018-06-09 11:09



Vous l'avez à l'envers sur le POSTROUNTING étape. À ce stade, la conversation est toujours sur --destination plutôt que --source. - sherrellbc


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

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


5
2017-12-14 22:02





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.


1
2017-12-10 02:58





J'avais pour tâche de faire croire à MACHINE_A que le service s'exécute physiquement sur MACHINE_B, mais que je redirige 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:

  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 le transfert de port, supprimez:

    -s MACHINE_A
    

1
2018-03-17 09:02





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 :)


0
2018-05-24 12:04