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 7002
en el host al puerto 7000
en 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 iptables
se 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
iptables
port-forwarding
lxc
Roberto Aloi
fuente
fuente
INPUT
cadena? Tal vez la política estáREJECT
ahí.ACCEPT
FORWARD
cadena. También puedes ver si el reenvío de IP está habilitado:cat /proc/sys/net/ipv4/ip_forward
.ip_forward
está configurado para1
FORWARD
la política también esACCEPT
Respuestas:
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:
fuente
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á encendidoIP 10.0.3.248
y la puerta de enlace está10.0.3.1
. Tengo un servidor web en el invitado y quiero tráfico portuario adelante de${host}:8888
a10.0.3.248:80
. Las siguientes son las entradas relevantes de iptables: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:
fuente
Necesitaba agregar una regla ADELANTE
fuente
ok, mis 5 centavos del año 2018:
Instalé LXC y jugué alrededor. Mi contenedor IP es
10.0.0.10
Agregué esta regla:
No funcionó. Entonces me di cuenta de que incluso la política FORWARD es ACEPTAR, hay una regla que bloquea todas las FORWARD.
Así que tuve que inyectar la regla en la parte superior:
Ahora adelante
host:81
->10.0.0.10:22
funciona.fuente
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.
fuente