el redireccionamiento de puerto de iptables no funciona para localhost

55

Quiero redirigir todo el tráfico desde el puerto 443 al puerto interno 8080. Estoy usando esta configuración para iptables:

iptables -t nat -I PREROUTING --source 0/0 --destination 0/0 -p tcp \
         --dport 443 -j REDIRECT --to-ports 8080

Esto funciona para todos los clientes externos. Pero si estoy tratando de acceder al puerto 443 desde la misma máquina, obtendré un error de conexión rechazada.

wget https://localhost

¿Cómo puedo extender la regla de iptables para redirigir el tráfico local también?

Chris
fuente
Este tema proporciona una respuesta más general: serverfault.com/questions/380447/iptables-preroute-localhost
Jeroen
1
¿Alguien con representante puede agregar una barra diagonal inversa al comando antes del salto de línea?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

69

PREROUTING no es utilizado por la interfaz de bucle invertido, también debe agregar una regla de SALIDA:

iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -o lo --dport 443 -j REDIRECT --to-ports 8080
Andy
fuente
3
No hay necesidad de la primera regla. Los paquetes generados localmente no pasan a través de la cadena PREROUTING.
Khaled
99
Agregué la regla inicial por el bien de la competencia, ya que él también quiere que el tráfico externo se redirija. La regla no necesita fuente / destino si solo dicen aceptar todas las IPs
Andy
Oh, disculpas. No vi tu respuesta cuando respondí.
Andy
Hola Andy, todavía me estoy conectando a server.com | <ip> |: 443 ... falló: conexión rechazada.
Chris
Hola Chris, ¿es esa la conexión a localhost | 127.0.0.1 | 443 o es ese el dominio? Si es esto último y lo está ejecutando desde su servidor, puede tener un problema de enrutamiento interno. Puede verificar dos veces probando wget server.com:8080 (aunque supongo que la razón por la que reenvía el puerto es porque está bloqueado externamente). Mi propia VPC tiene ese problema, sin embargo, podría poner una solución al definir el dominio como 127.0.0.1 en su archivo / etc / hosts.
Andy
10

Para redirigir paquetes de localhost a otra máquina, la regla:

 iptables -t nat -A OUTPUT -o lo -d 127.0.0.1 -p tcp --dport 443 -j DNAT  --to-destination 10.x.y.z:port

funcionará, PERO también debe habilitar esta opción en el núcleo:

sysctl -w net.ipv4.conf.all.route_localnet=1

Sin esa configuración del núcleo no funcionará.


fuente
Eso también funcionaría. Creo que hacerlo todo en iptables es más limpio.
quadruplebucky
En realidad, la configuración del kernel se necesita si el destino está en otra máquina, se alinea una máquina virtual o una máquina remota.
es no si usted tiene las dos reglas que Andy sugirió anteriormente.
quadruplebucky
Lo siento, estaba hablando del caso de reenvío a una máquina diferente donde DNAT no funciona. Estaba buscando esta respuesta para una solución a un problema cuando intentaba enviar algo que pensaba que se estaba conectando a localhost a un contactor en la misma máquina. por ejemplo, ejecutar el servidor de nombres en un contenedor para consultas locales.
En realidad, depende de la versión del kernel> = 3.6, aparentemente.
quadruplebucky
3

¿Qué tal esto?

iptables -t nat -A OUTPUT -d 127.0.0.1 -p tcp --dport 443 -j REDIRECT --to-port 8080

Atanasios
fuente
2

Dijiste que recibías un error de conexión rechazada . ¡Esto significa que no hay proceso local escuchando en el puerto al que está intentando conectarse! Para verificar los procesos de escucha, use el comando:

$ sudo netstat -lnp | grep 8080

Después de aplicar la regla, debe tener un proceso escuchando en el puerto 8080 para conectarse.

Parece que debería tener la siguiente regla en su lugar:

$ iptables -t nat -I OUTPUT --source 0/0 --destination 0/0 -p tcp
                                       --dport 443 -j REDIRECT --to-ports 8080

Recuerde que está enviando desde el host local. Por lo tanto, debe redirigir el paquete de salida.

Khaled
fuente
1
Gracias por tu respuesta. El proceso está escuchando en el puerto 8080. Por lo tanto, quiero redirigir todo el tráfico a ese puerto.
Chris
¿Estás seguro de que el proceso también está escuchando en la interfaz de bucle? Es posible que solo esté escuchando en su interfaz física. Por lo general, su servidor web necesitará escuchar 0.0.0.0 en lugar de, por ejemplo, 192.168.10.0
MrMajestyk