Pregunta ¿Cómo puedo portear hacia delante con iptables?


Quiero que las conexiones que llegan 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?


110
2017-12-05 21:06


origen


NAT HOWTO - Paul Tomblin
Voy a ir con la etiqueta n-p-r (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 mi aplicación de servidor en eclipse al ser llamado desde Internet. ¿Suficientemente cerca?
Claro, eso es lo que quiero decir con "mal redactado" ... ¿Podría editar la pregunta en consecuencia? - Mihai Limbăşan


Respuestas:


En primer lugar, debe comprobar si se permite el reenvío:

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

Si ambos vuelven 1 está bien. Si no, haz lo siguiente:

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

Segunda cosa - DNAT podría ser aplicado en nat solo mesa Por lo tanto, su regla debería extenderse 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 también desea modificar UDP, debe proporcionar reglas similares pero con -p udp conjunto de opciones).

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

ip route

y verifica si 192.168.1.0/24 Se encuentra entre las entradas de enrutamiento devueltas.


91
2018-03-24 11:24



Yo personalmente prefiero el sysctl sintaxis como sysctl net.ipv4.conf.eth0.forwarding=1 - Doud
¿Cómo elimino la regla ingresada incorrectamente? - Nickolai Leschov
segunda línea: "iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m estado --estado NUEVO, ESTABLECIDO, RELACIONADO -j ACEPTAR" NO se requiere si no tiene restricciones / seguridad de cortafuegos, las cuales es el caso de la mayoría de las LAN locales, de lo contrario, tenga cuidado con -A, porque se agregará DESPUÉS de las restricciones / seguridad y es posible que no funcione (así que verifique -I en su lugar, eso es agregar EN FRENTE a las reglas de iptables) - THESorcerer
@ ÁronLőrincz, No. Las reglas de Iptables son volátiles a menos que se carguen explícitamente en el arranque. - sherrellbc
@Nickolai Leschov, ingrese el mismo reemplazo -A con -D - Alexei Martianov


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

14
2017-12-05 21:43



ummm ... eso es lo que ya tengo. Uso iptables-restore para cargarlo, así 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. ¿Probaste -i ppp0 en las reglas? ¿Cuál es el problema exactamente? - Robert Gamble


Olvidaste la dirección de origen de post-enrutamiento 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.


12
2018-06-09 11:09



Lo tienes al revés en el POSTROUNTING paso. En este punto la conversación todavía se trata de --destination más bien que --source. - sherrellbc


He creado el siguiente script de bash para hacer esto en mi enrutador de 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 del script 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.


5
2017-12-14 22:02





Tratar

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

Estos archivos le dicen al kernel que puede reenviar paquetes entre las interfaces.


1
2017-12-10 02:58





Tuve la tarea de hacer que MACHINE_A creyera que el servicio se está ejecutando físicamente en MACHINE_B, pero de forma transparente, redirigir todas las solicitudes a MACHINE_C.

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 en una interfaz específica solamente. 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
    

1
2018-03-17 09:02





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 detención)
  • LAN_IP: dirección IP en la interfaz LAN (en el enrutador)

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


0
2018-05-24 12:04