Usando o iptables para fornecer ao contêiner LXC um IP roteável

0

Estou usando o Docker para gerenciar contêineres LXC. No momento, o Docker configura o contêiner LXC subjacente com roteamento somente de host e, em seguida, usa o iptables / DNAT para fazer furos no contêiner, tornando-o acessível por meio do IP do host e de uma porta "aleatória".

Isso não vai funcionar para nós por vários motivos. Gostaríamos que cada contêiner fosse acessado por meio de seu próprio IP (roteável). Então, eu tenho jogado usando tabelas de IP para isso. Ele funciona bem para mim em casa (rodando no Ubuntu Raring), mas não no trabalho (rodando no Ubuntu Precise). Eu estou supondo que há alguma configuração padrão do kernel que eu não conheço.

Veja o que estou fazendo:

1) Configurando uma nova interface virtual do macvlan para que eu possa usar o DHCP para obter um IP:

ip link add container1 link eth0 type macvlan
dhclient container1
ip link set container1 up

Neste ponto, eu tenho uma nova interface com seu próprio endereço IP e gateway padrão, máscara de sub-rede, etc., que correspondem à interface física subjacente ( eth0 ).

2) Configure as tabelas de IP para o tráfego de entrada DNAT do IP da nova interface. Digamos que a nova interface tenha o IP 10.10.10.88 e o contêiner LXC controlado pelo Docker tenha o IP 172.17.0.20.

iptables -t nat -N CONTAINER1
iptables -t nat -A PREROUTING -p all -d 10.10.10.88/32 -j CONTAINER1
iptables -t nat -A CONTAINER1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.20:8080

(Aqui também estou NAT, a porta de 80 a 8080).

Como mencionado, isso funciona bem em casa. Agora posso acessar esse contêiner do host como 172.17.0.20:8080 e de outra máquina na minha LAN como 10.10.10.88:80. (Curiosamente, eu não posso alcançá-lo em 10.10.10.88:80 de dentro do host, mas eu acho que eu preciso de outra regra, talvez, a cadeia OUTPUT para pegar isso.) Mas isso não funciona no trabalho.

No trabalho, quando tento acessar esse contêiner usando seu IP roteável (10.10.10.88 neste exemplo), vejo os pacotes chegando e correspondendo às regras iptables até a regra DNAT. Posso observar isso usando os contadores de pacotes impressos por iptables -L e também usando o destino TRACE na tabela bruta e observando o log do kernel. Mas depois de combinar a regra DNAT, os pacotes simplesmente desaparecem. Na minha máquina doméstica (que funciona), após o DNAT, posso ver os pacotes passando pela cadeia INPUT na tabela de filtros com o novo IP de destino (NAT). Na minha máquina de trabalho, esse passo não acontece.

Ambas as máquinas têm o encaminhamento de IP ativado.

    
por dty 01.10.2013 / 16:23

0 respostas