iptables: cómo reenviar todos los puertos externos a un puerto local

5

Quiero que se ejecute un servicio en cada puerto externo de mi sistema. Como no funcionaría iniciar 65535 instancias únicas de ese servicio (supongo ...) pensé en usar iptables para esto.

El servicio (solo un script de Python de 10 líneas) está escuchando en localhost: 10000. iptables ahora debe reenviar cada solicitud TCP en un puerto externo a este puerto local para que cada uno de estos puertos parezca estar abierto. Tengo pocas experiencias con iptables y no tengo tiempo para leer más sobre este tema, por lo que no puedo hacer que esto funcione.

Lo intenté:

iptables -A PREROUTING -t nat -i eth0 -p tcp -j DNAT --to-destination 127.0.0.1:10000

Pero cuando se escanea desde la red local, todos los puertos aparecen filtrados, no abiertos. Actualmente no hay otras reglas activas y todas las políticas están establecidas en ACC

¿Cómo puedo hacer eso bien?

¡Gracias por adelantado!

j0ker
fuente
Aquí hay un enlace a una respuesta más reciente: unix.stackexchange.com/questions/111433/…
Wren T.

Respuestas:

5

Como sus políticas son ACEPTAR, puede usar su línea de iptables con 2 cambios:

  1. agregar rango de puertos de destino con --dport 1: 65535
  2. cambie el 127.0.0.1 con su IP de interfaz (la IP de eth0)

Por ejemplo, esta línea funciona si su eth0 IP es 192.168.1.10:

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 1:65535 -j DNAT --to-destination 192.168.1.10:10000

todas las conexiones a 192.168.1.10 (a cualquier puerto) serán redirigidas al puerto 10000.

Editar: también puede usar el objetivo REDIRECCIONAR:

iptables -t nat -A PREROUTING -p tcp --dport 1:65535 -j REDIRECT --to-ports 10000

esto todavía no te ayudará si solo escuchas localhost.

0xAF
fuente
Funciona bien si el servidor escucha la interfaz externa. ¡Gracias! ¿Es posible realizar la redirección a un puerto en localhost, para que pueda ejecutar el servidor localmente?
j0ker
1
IIRC la tabla nat está hecha para trabajar con interfaces externas. Si hay una manera de redirigir a localhost (o, en ese caso, a una interfaz diferente), implicaría habilitar el reenvío (echo 1> / proc / sys / net / ipv4 / ip_forward) y puede ser nativo hacia adelante y hacia atrás tráfico (o incluso ruta de origen). No veo el punto de hacer esto, ya que su servicio será accesible en interfaces externas. No tiene sentido hacer que escuche solo localhost.
0xAF
El punto es la conveniencia de escribir el script del servidor. Mi IP local permanece igual, mientras que la eth0 IP cambia con la red.
j0ker
Luego usa el objetivo REDIRECTO. Ver mi respuesta editada. De esta manera, usará una línea universal de iptables. Y su servicio puede escuchar "0.0.0.0" (todas las interfaces), por lo que incluso si la ip cambia, esto no dañará su servicio. (Editar: acepte la respuesta si la encuentra correcta).
0xAF
1
Un paso adicional necesario es sysctl -w net.ipv4.conf.eth0.route_localnet=1. Puede verificar el valor actual consysctl net.ipv4.conf.eth0.route_localnet
chefarov