¿Cómo puedo portar hacia adelante con iptables?

118

Quiero que las conexiones que entran en ppp0 en el puerto 8001 se enruten a 192.168.1.200 en eth0 en el puerto 8080.

Tengo estas dos reglas

-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

y no funciona ¿Qué me estoy perdiendo?

Stu
fuente
66
NAT HOWTO
Paul Tomblin
Voy a ir con la etiqueta npr (aunque esto podría estar relacionado con la programación, aunque mal redactado, por supuesto)
Mihai Limbăşan
¿Qué tal esto? Soy un programador que intenta configurar un entorno para poder depurar la aplicación de mi servidor en eclipse desde la red interna. ¿Suficientemente cerca?
Claro, eso es lo que quise decir con "mal redactado" ... ¿Podría editar la pregunta en consecuencia?
Mihai Limbăşan

Respuestas:

97

En primer lugar, debe verificar si el reenvío está permitido:

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

Si ambos regresan 1, está bien. Si no, haga lo siguiente:

echo '1' | sudo tee /proc/sys/net/ipv4/conf/ppp0/forwarding
echo '1' | sudo tee /proc/sys/net/ipv4/conf/eth0/forwarding

Lo segundo: DNATpodría aplicarse natsolo en la mesa. Por lo tanto, su regla debe ampliarse agregando también la especificación de la tabla ( -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

Ambas reglas se aplican solo al tráfico TCP (si desea alterar UDP también, debe proporcionar reglas similares pero con un -p udpconjunto de opciones).

Por último, pero no menos importante es la configuración de enrutamiento. Tipo:

ip route

y verifique si se 192.168.1.0/24encuentra entre las entradas de enrutamiento devueltas.

oo_olo_oo
fuente
16
Personalmente prefiero la sysctlsintaxis comosysctl net.ipv4.conf.eth0.forwarding=1
Doud
1
¿Cómo elimino la regla introducida incorrectamente?
Nickolai Leschov
2
segunda línea: "iptables -A ADELANTE -p tcp -d 192.168.1.200 --dport 8080 -m estado - estado NUEVO, ESTABLECIDO, RELACIONADO -j ACEPTAR" NO es necesario si no tiene restricciones / seguridad de firewall, que es el caso con la mayoría de las LAN domésticas, de lo contrario, tenga cuidado con -A, ya que lo agregará DESPUÉS de las restricciones / seguridad y puede no funcionar (así que marque -I en su lugar, es agregar FRENTE a las reglas de iptables)
THESorcerer
2
@ ÁronLőrincz, No. Las reglas de Iptables son volátiles a menos que se carguen explícitamente en el arranque.
sherrellbc
1
@Nickolai Leschov, ingrese el mismo reemplazo -Acon-D
Alexei Martianov el
14

Creo que lo que quieres es:

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
fuente
2
ummm ... eso es lo que ya tengo. Utilizo iptables-restore para cargarlo, por lo que cada uno está en su propia sección, pero eso es lo que escribí anteriormente.
De acuerdo, la sintaxis se veía mal en el original. ¿Intentaste -i ppp0 en las reglas? ¿Cuál es el problema exactamente?
Robert Gamble
13

Olvida la dirección de origen de postrouting 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

Y no olvide configurar su firewall de Linux como puerta de enlace predeterminada en la computadora con la dirección 192.168.1.200.

Fanático
fuente
Lo tienes al revés en el POSTROUNTINGescalón. En este punto, la conversación sigue siendo sobre --destinationmás que --source.
sherrellbc
6

He creado el siguiente script bash para hacer esto en mi enrutador Linux. Infiere automáticamente la IP de WAN y confirma sus selecciones antes de continuar.

#!/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

El uso de la secuencia de comandos es simple, simplemente cópielo y péguelo en un archivo y luego.

# chmod +x port_forward.sh
# ./port_forward.sh 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule added

Para eliminar la misma regla

# ./port_forward.sh -r 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule removed

Pensé que esto podría ahorrarle tiempo a alguien en su enrutador respectivo.

Nullivex
fuente
2

Tuve la tarea de hacer que MACHINE_A pensara que el servicio se ejecuta físicamente en MACHINE_B, pero que redirige todas las solicitudes a MACHINE_C de manera transparente.

El truco era usar 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

Tenga en cuenta que es posible que desee modificar los comandos:

  1. Para permitir el reenvío de paquetes solo en una interfaz específica. Por ejemplo:

    sysctl net.ipv4.conf.eth0.forwarding=1
    
  2. Para permitir que no solo MACHINE_A, sino también todos los demás utilicen el reenvío de puertos, elimine:

    -s MACHINE_A
    
Denis Scherbakov
fuente
1

Tratar

echo "1" > /proc/sys/net/ipv4/conf/ppp0/forwarding
echo "1" > /proc/sys/net/ipv4/conf/eth0/forwarding

Estos archivos le dicen al núcleo que puede reenviar paquetes entre las interfaces.

Adam Liss
fuente
0

Este comando no funciona para mí:

-A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip

Tengo 2 interfaces LAN y trabajo ADELANTE cuando escribo:

iptables -t nat -A POSTROUTING -o $LAN_IF -p tcp -m tcp --dport $FW_PORT -j SNAT --to-source $LAN_IP
  • LAN_IF: interfaz LAN (por ejemplo, eth1, br0 ...)
  • FW_PORD: puerto reenviado (en el host de detinción)
  • LAN_IP: dirección IP en la interfaz LAN (en el enrutador)

PREROUTING y FORWARD también son necesarios, por supuesto :)

Andrés
fuente