LXC, reenvío de puertos e iptables

8

Tengo un contenedor LXC ( 10.0.3.2) ejecutándose en un host. Se está ejecutando un servicio dentro del contenedor en el puerto 7000.

Desde el host ( 10.0.3.1, lxcbr0), puedo llegar al servicio:

$ telnet 10.0.3.2 7000
Trying 10.0.3.2...
Connected to 10.0.3.2.
Escape character is '^]'.

Me encantaría hacer que el servicio que se ejecuta dentro del contenedor sea accesible para el mundo exterior. Por lo tanto, quiero reenviar el puerto 7002en el host al puerto 7000en el contenedor:

iptables -t nat -A PREROUTING -p tcp --dport 7002 -j DNAT --to 10.0.3.2:7000

Lo que resulta en ( iptables -t nat -L):

DNAT   tcp  --  anywhere     anywhere     tcp dpt:afs3-prserver to:10.0.3.2:7000

Aún así, no puedo acceder al servicio desde el host utilizando el puerto reenviado:

$ telnet 10.0.3.1 7002
Trying 10.0.3.1...
telnet: Unable to connect to remote host: Connection refused

Siento que me estoy perdiendo algo estúpido aquí. ¿Qué cosas debo verificar? ¿Cuál es una buena estrategia para depurar estas situaciones?

Para completar, así es como iptablesse configuran en el host:

iptables -F
iptables -F -t nat
iptables -F -t mangle
iptables -X

iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o lxcbr0 -j MASQUERADE

iptables -t nat -A PREROUTING -p tcp --dport 7002 -j DNAT --to 10.0.3.2:7000
Roberto Aloi
fuente
¿Revisaste la INPUTcadena? Tal vez la política está REJECTahí.
Michael Härtl
La política esACCEPT
Roberto Aloi
Lo siento, me refería a la FORWARDcadena. También puedes ver si el reenvío de IP está habilitado: cat /proc/sys/net/ipv4/ip_forward.
Michael Härtl
ip_forwardestá configurado para1
Roberto Aloi
FORWARDla política también esACCEPT
Roberto Aloi

Respuestas:

3

Parece que ha bloqueado el puerto 7002 en 10.0.3.1 ya que su política predeterminada es DROP

Intente agregarlo a las reglas de ENTRADA:

iptables -A INPUT -p tcp --dport 7002 -j ACCEPT
persona enterada
fuente
1

Tuve el mismo problema. Todavía no he encontrado la solución, pero a continuación anoto algunas observaciones.

Tengo una ${host}máquina host (Ubuntu 12.04) y ejecuta una máquina invitada a través de LXC. El invitado está encendido IP 10.0.3.248y la puerta de enlace está 10.0.3.1. Tengo un servidor web en el invitado y quiero tráfico portuario adelante de ${host}:8888a 10.0.3.248:80. Las siguientes son las entradas relevantes de iptables:

-A PREROUTING -p tcp --dport 8888 -j DNAT --to-destination 10.0.3.248:80
-A POSTROUTING -j MASQUERADE

Con la configuración actual, puedo visitar con éxito el servidor web en 10.0.3.248:80 desde otra máquina física. Sin embargo, falla cuando intento visitar 10.0.3.248:80 de ${host}. Quizás pueda intentar visitar ese servicio dentro de LXC desde otra máquina.

Tengo entendido que, cuando visito desde ${host}, el paquete pasa por la interfaz de bucle invertido y entra directamente en la cadena de ENTRADA. Aunque permito todo en INPUT, no hay servicio escuchando ${host}:8888. Desde wireshark, veo que se envía un RST recibido. Cuando visito desde otra máquina física, el paquete entra en la cadena PREROUTING y fue DNAT-ed como se esperaba.

Una publicación relacionada:

usuario199716
fuente
0

Necesitaba agregar una regla ADELANTE

iptables -A FORWARD -p tcp -d 10.0.3.2 --dport 7002 -j ACCEPT
teknopaul
fuente
0

ok, mis 5 centavos del año 2018:

Instalé LXC y jugué alrededor. Mi contenedor IP es10.0.0.10

Agregué esta regla:

iptables -t nat -A PREROUTING -p tcp -i ens192 --dport 81 -j DNAT --to-destination 10.0.0.10:22

No funcionó. Entonces me di cuenta de que incluso la política FORWARD es ACEPTAR, hay una regla que bloquea todas las FORWARD.

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  *      virbr0  0.0.0.0/0            10.0.0.0/24          ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  virbr0 *       10.0.0.0/24          0.0.0.0/0           
    0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
    5   268 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Así que tuve que inyectar la regla en la parte superior:

iptables -I FORWARD -p tcp -d 10.0.0.10 --dport 22 -j ACCEPT

Ahora adelante host:81-> 10.0.0.10:22funciona.

Mella
fuente
-2

Se puede acceder a su contenedor desde la LAN a través de una interfaz de puente de host y, por lo tanto, conectado a la misma subred que el host.

Necesita que su enrutador reenvíe esos puertos a su contenedor.

mVincent
fuente