web-dev-qa-db-fra.com

Comment puis-je transférer 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 marche pas. Qu'est-ce que je rate?

118
Stu

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.

97
oo_olo_oo

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
15
Robert Gamble

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.

14
Zealotous

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.

6
Nullivex

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:

  1. Pour autoriser le transfert 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 aussi tous les autres à utiliser la redirection de port, supprimez:

    -s MACHINE_A
    
3
Denis Scherbakov

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
Adam Liss

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
  • LAN_IF - Interface LAN (par exemple. Eth1, br0 ...)
  • FW_PORD - port redirigé (sur l'hôte de détection)
  • LAN_IP - Adresse IP sur l'interface LAN (sur le routeur)

PRÉROUVER et AVANCER sont également nécessaires, bien sûr :)

0
Andrew