it-swarm-es.com

¿Cómo puedo portar hacia adelante con iptables?

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?

118
Stu

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 devuelven 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: DNAT podría aplicarse solo en la tabla nat. 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 a TCP tráfico (si desea modificar UDP también, 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 verifique si 192.168.1.0/24 se encuentra entre las entradas de enrutamiento devueltas.

97
oo_olo_oo

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

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.

14
Zealotous

He creado el siguiente script bash para hacer esto en mi enrutador Linux. Infiere automáticamente la WAN IP 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, solo copie y pegue 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.

6
Nullivex

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 ajustar 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
    
3
Denis Scherbakov

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.

1
Adam Liss

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

0
Andrew