LXC, encaminhamento de porta e iptables

8

Eu tenho um container LXC ( 10.0.3.2) em execução em um host. Um serviço está sendo executado dentro do contêiner na porta 7000.

No host ( 10.0.3.1, lxcbr0), posso acessar o serviço:

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

Eu adoraria tornar o serviço em execução dentro do contêiner acessível ao mundo externo. Portanto, desejo encaminhar a porta 7002no host para a porta 7000no contêiner:

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

O que resulta em ( iptables -t nat -L):

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

Ainda assim, não consigo acessar o serviço do host usando a porta encaminhada:

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

Sinto como se estivesse perdendo algo estúpido aqui. Que coisas devo verificar? Qual é uma boa estratégia para depurar essas situações?

Para completar, eis como iptablessão configurados no 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
fonte
Você checou a INPUTcorrente? Talvez a política esteja REJECTlá.
Michael Härtl 13/03/2019
A política éACCEPT
Roberto Aloi 13/03/2013
Desculpe, eu quis dizer a FORWARDcorrente. Além disso, verifique se o encaminhamento IP está habilitado: cat /proc/sys/net/ipv4/ip_forward.
Michael Härtl 13/03/2013
ip_forwardestá definido como1
Roberto Aloi 13/03/2013
FORWARDpolítica também éACCEPT
Roberto Aloi 13/03/2013

Respostas:

3

Parece que você bloqueou a porta 7002 na 10.0.3.1, pois sua política padrão é DROP

Tente adicioná-lo às regras INPUT:

iptables -A INPUT -p tcp --dport 7002 -j ACCEPT
insider
fonte
1

Eu tive o mesmo problema. Ainda não encontrei solução, mas a seguir, anoto algumas observações.

Eu tenho uma ${host}máquina host (Ubuntu 12.04) e ela executa uma máquina convidada via LXC. O convidado está IP 10.0.3.248ativado e o gateway está 10.0.3.1. Eu executo um servidor Web no convidado e quero portar o tráfego de encaminhamento de ${host}:8888para 10.0.3.248:80. A seguir estão as entradas relevantes do iptables:

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

Com a configuração atual, posso visitar com êxito o servidor da Web em 10.0.3.248:80 a partir de outra máquina física. No entanto, ele falha quando tento visitar 10.0.3.248:80 de ${host}. Talvez você possa tentar visitar esse serviço no LXC a partir de outra máquina.

Meu entendimento é que, quando visito ${host}, o pacote passa pela interface de loopback e entra diretamente na cadeia INPUT. Embora eu permita tudo no INPUT, não há serviço escutando ${host}:8888. Do wireshark, vejo que um RST é enviado recebido. Quando visito de outra máquina física, o pacote entra na cadeia PREROUTING e foi editado por DNAT conforme o esperado.

Um post relacionado:

user199716
fonte
0

Eu precisava adicionar uma regra FORWARD

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

ok, meus 5 centavos a partir do ano 2018:

Eu instalei o LXC e brinquei com ele. O IP do meu contêiner é10.0.0.10

Eu adicionei esta regra:

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

Não deu certo. Então percebi que mesmo a política do FORWARD é ACEITAR, existe uma regra que bloqueia todos os FORWARDs.

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

Então eu tive que injetar regra no topo:

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

Agora em frente host:81-> 10.0.0.10:22funciona.

usuario
fonte
-2

Seu contêiner pode ser acessado da LAN através de uma interface de ponte de host e, portanto, conectado à mesma sub-rede que o host.

Você precisa que seu roteador encaminhe essas portas para o seu contêiner.

mVincent
fonte