conectando-se ao servidor apache no contêiner docker (osx e docker-machine) DA INTERNET

1

Em suma, tudo funciona até que eu tente acessar meu servidor apache em um contêiner docker da internet . Os pacotes de entrada chegam ao container docker, mas os pacotes de saída são descartados pela interface NAT no docker-machine.

Minha configuração é

  • configuração típica de LAN doméstica com um roteador conectado à internet
  • docker de execução da máquina osx (ie - docker-machine aka boot2docker)
  • um contêiner do docker executando o apache (expondo a porta 80 como 11111)
  • Também tenho o apache em execução no osx (minha máquina host), que servirá como uma ferramenta de solução de problemas.
  • Eu adicionei uma interface em ponte à máquina docker que conecta a máquina docker diretamente à minha LAN e obtém um IP do meu roteador.
  • no meu roteador (192.168.1.1) redirecionei 11111 para o IP da estação de acoplamento (192.168.1.102)

o que posso fazer

  • Eu posso conectar-me ao apache do meu host e de outro computador no meu LAN (todos 192.168.1.X) por causa da interface da bridge no
    docker-machine. ambos 192.168.1.102:11111 e usando o
    http: //: 11111
  • então, obviamente, meu domínio resolve seu IP corretamente e o encaminhamento de porta no meu roteador funciona bem.
  • Também posso acessar facilmente o servidor da web na minha máquina host (osx) da internet

o que eu tentei

  • encaminhamento de porta no meu host (osx) usando pfctl
  • usando --net = host no meu contêiner

Eu reduzi o problema (usando o tcpdump e outras experimentações) que quando eu me conecto ao servidor web no container de um computador na minha LAN, os pacotes fluem através da interface em ponte (192.168.1.102) no docker-machine . Quando eu me conecto pela internet, o pacote de entrada flui através de 192.168.1.102, mas o pacote de retorno não. Em vez disso, ele passa pela interface NAT no docker-machine e é descartado. Eu provei isso fazendo "ifconfig eth0 down" na interface NAT de dentro do docker-machine. Agora, obviamente, isso estraga meu docker-machine porque não consigo mais executar os comandos do docker e ele mata a minha sessão ssh atual. Mas quando eu fiz isso, a conectividade com o servidor web no container da internet funciona! Então eu provei que o pacote de retorno é o problema.

Agora, posso usar o iptables dentro do docker-machine para rotear o pacote adequadamente para que ele saia da interface em ponte em vez da interface NAT? Eu tentei sem sucesso. Aqui estão as minhas regras do iptables no docker-machine. Eu quero encaminhar todos os pacotes provenientes do meu contêiner com uma porta de origem de 11111 e encaminhá-los para eth1 (a interface em ponte).

sudo iptables -I FORWARD 1 -i docker0 -o eth1 -p tcp --syn --sport 11111 -m conntrack --ctstate NEW -j ACCEPT

docker@default:~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere             tcp spt:11111 flags:FIN,SYN,RST,ACK/SYN ctstate NEW
DOCKER-ISOLATION  all  --  anywhere             anywhere
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (1 references)
target     prot opt source               destination

Chain DOCKER-ISOLATION (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Eu estou indo sobre isso tudo errado? Existe uma maneira padrão de configurar isso que eu não explorei?

    
por user59553 18.11.2016 / 03:51

0 respostas