IPTables - Puerto a otra ip y puerto (desde el interior)


10

Actualmente tengo una caja NAS que se ejecuta bajo el puerto 80. Para acceder al NAS desde el exterior, asigné el puerto 8080 al puerto 80 en el NAS de la siguiente manera:

iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.32.25.2:80

Esto funciona como un encanto. Sin embargo, esto funciona solo si estoy accediendo al sitio web desde el exterior de la red (en el trabajo, en casa diferente, etc.). Entonces, cuando mywebsite.com:8080escribo, IPTables hace el trabajo correctamente y todo funciona bien.

Ahora, el problema que tengo es, ¿cómo puedo redirigir este puerto desde el interior de la red? Mi nombre de dominio mywebsite.comapunta a mi enrutador (mi servidor Linux) desde adentro (10.32.25.1) pero quiero redirigir el puerto 8080 al puerto 80 en 10.32.25.2 desde adentro.

¿Cualquier pista?

Editar # 1

Intentando ayudar a facilitar esta pregunta, armé este diagrama. Siéntase libre de actualizar si es incorrecto o tergiversando lo que está buscando.

                                 iptables
                                     |                   .---------------.
    .-,(  ),-.                       v               port 80             |
 .-(          )-.        port 8080________               |               |
(    internet    )------------>[_...__...°]------------->|      NAS      |
 '-(          ).-'     10.32.25.2    ^   10.32.25.1      |               |
     '-.( ).-'                       |                   |               |
                                     |                   '---------------'
                                     |
                                     |
                                   __  _ 
                                  [__]|=|
                                  /::/|_|

@slm Exactamente. No ocurre nada en 10.32.25.2:8080 porque el servidor está en el puerto 80. Desde el exterior, el NAT redirige desde el puerto 8080 al puerto 80 en la IP especificada (10.32.25.2). NET -> NAT: 8080 -> 10.32.25.2:80. Necesito la regla desde adentro y no sé qué poner allí.
David Bélanger

@slm Sí. No sé cómo puedo lograr algo así. Quiero decir 10.32.25.1:8080redirigir a 10.32.25.2:80. Mi regla anterior es trabajar desde el exterior, pero no desde el interior de mi red. Entonces, si estoy en la oficina, puedo acceder a mi NAS desde website.com:8080 y es completamente transparente. Desde mi casa, website.com:8080 apunta a 10.32.25.1 porque es mi enrutador, también conocido como servidor Linux. Quiero redirigir el puerto 8080 al NAS también en el puerto 80, pero de nuevo, de manera transparente.
David Bélanger

@slm Sí, todo está bien y funciona. Solo quiero redirigir el puerto 10.32.25.1:8080 a 10.32.25.2:80 desde la red interna.
David Bélanger

También mencionar como interfaz eth0 10.32.25.2, por lo que podemos capaz de iptables escritura usar basado en la interfaz de entrada
Rahul Patil

Opps lo siento, acabo de ver ... ya resolviste el problema ...
Rahul Patil

Respuestas:


13

Finalmente encontré cómo hacerlo. Primero, tuve que agregar -i eth1a mi regla "externa" (eth1 es mi conexión WAN). También necesitaba agregar otras dos reglas. Aquí al final con lo que vine:

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 8080 -j DNAT --to 10.32.25.2:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to 10.32.25.2:80
iptables -t nat -A POSTROUTING -p tcp -d 10.32.25.2 --dport 80 -j MASQUERADE

2
La segunda regla no es necesaria, ya que la primera regla ya contiene eso ...
machineaddict

1
La primera regla restringe la ruta previa solo si llega a la interfaz eth1. La segunda regla es más general, ya que se aplica a todas las interfaces. ¡Cuidado con los bucles!
tu-Reinstate Monica-dor duh

4

También olvidó mencionar que el reenvío de paquetes debe estar habilitado para poder realizar el NAT de destino. Por defecto, generalmente está desactivado, por lo que las reglas de iptables no funcionarán. Se puede habilitar emitiendo:

echo 1 > /proc/sys/net/ipv4/ip_forward

¡Muchas gracias por esto, me habría arrancado el pelo durante horas!
ColinM

3

Primero permita el reenvío con

echo 1 > /proc/sys/net/ipv4/ip_forward

Luego establezca reglas de iptable con

IF=eth1
PORT_FROM=8080
PORT_TO=80
DEST=10.32.25.2
iptables -t nat -A PREROUTING -i $IF -p tcp --dport $PORT_FROM -j DNAT --to $DEST:$PORT_TO
iptables -t nat -A POSTROUTING -p tcp -d $DEST --dport $PORT_TO -j MASQUERADE

Puede poner estas líneas en, /etc/rc.localpor ejemplo. Nota: dado que Debian jessie lo hizo ejecutable y habilitó el servicio rc.local a través de

systemctl enable rc-local.service

0

Primero debe verificar que tiene activado el reenvío:

cat /proc/sys/net/ipv4/ip_forward

Si no 1, corre echo 1 > /proc/sys/net/ipv4/ip_forward.

Si desea que el tráfico que llega a 10.32.25.1 en el puerto 80 y 443 se reenvíe al puerto 80 de 10.32.25.2, entonces debe usar la siguiente regla:

iptables -t nat -A PREROUTING -d 10.32.25.1 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 10.32.25.2:80
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.