GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo puedo portar hacia adelante con iptables?

Solución 1:

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 en nat solo mesa. Por lo tanto, su regla debe 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, está la configuración de enrutamiento. Escriba:

ip route

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

Solución 2:

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

Solución 3:

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

Solución 4:

Creé el siguiente script bash para hacer esto en mi enrutador Linux. Infiere automáticamente la IP de la 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 respectivo enrutador.

Solución 5:

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

El truco estaba en 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
    

Linux
  1. ¿Cómo puedo monitorear datos en un puerto serie en Linux?

  2. ¿Cómo puedo eliminar el puerto TCP 16969 en Bash?

  3. ¿Cómo puedo hacer una división con variables en un shell de Linux?

  4. ¿Cómo puedo hacer un HTTP PUT con Wget?

  5. ¿Cómo puedo monitorear el tráfico del puerto serie?

Cómo usar los comandos de Netcat con ejemplos

SSH a un puerto distinto del 22:cómo hacerlo (con ejemplos)

Cómo asegurar el servicio SSH con Port Knocking

Cómo proteger un firewall de Linux con reglas de IPTables

¿Cómo configurar el túnel ssh para reenviar ssh?

Permitir FTP con IPTables