LXC-Routing entre contêineres

0

Eu tenho um lxc-setup padrão com um host e vários contêineres. Um contêiner webfrontend está recebendo todo o tráfego do host nas portas 80 e 443 via DNATing das portas. Um nginx em webfrontend decide via vhosts, qual container webappX deve receber o pedido e faz o proxies por meio do proxy para o ip privado do webappX:

host:443 <--prerouting--> webfrontend:443 <--nginx--> webappX-private:80

-A PREROUTING -d 80.x.x.x/32 -i eth0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.3.100:443
  • Host (público): 80.x.x.x
  • webfrontend (lxcbr0): 10.0.3.100
  • webappX (lxcbr0): 10.0.3.200
  • webappY (lxcbr0): 10.0.3.201
  • ...

Isso funciona bem e permite um ponto central para os certificados letsencrypt, etc.

No entanto, quando o webappX precisa acessar o webappY, a conexão é recusada e o front-end da web nunca vê a solicitação. Eu posso acessar o webappY no ip privado (do webappX), mas não consigo acessar o webappY-public (também conhecido como o webfrontend):

root@webappX:~# curl -I http://10.0.3.201
HTTP/1.1 200 OK
[...]

root@webappX:~# curl -I http://webappY.example.com
curl: (7) Failed to connect to webappY.example.com port 80: Connection refused

root@webappX:~# nslookup webappY.example.com
[...]
Name: webappY.example.com
Address: 80.x.x.x

Encaminhamento entre os contêineres é dado:

*filter
-A FORWARD -o lxcbr0 -j ACCEPT
-A FORWARD -i lxcbr0 -j ACCEPT

Até agora, tentei definir regras de POSTROUTING e OUTPUT em eth0 e lo sem sucesso.

Alguma idéia?

    
por Lars 19.07.2016 / 20:18

1 resposta

1

O que você precisa é chamado de NAT hairpinning (também conhecido como loopback NAT, reflexão NAT):

NAT loopback, [...] is a feature in many consumer routers which permits the access of a service via the public IP address from inside the local network.

Por que não está funcionando? A regra DNAT do IPTables que você forneceu na sua pergunta especifica uma interface de entrada que esta regra deve aplicar a: -i eth0 . Seu tráfego não vem de eth0 , mas de alguma interface de rede virtual ou qualquer outra coisa. Apenas remover essa restrição para eth0 pode ser suficiente para que funcione.

Como alternativa, uma regra separada pode ser adicionada a lxcbr0 :

iptables -t nat -A PREROUTING -i lxcbr0 -p tcp --dport 443 \
    --destination 80.x.x.x -j DNAT --to 10.0.3.100:443
    
por 28.09.2016 / 12:59