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 é
o que posso fazer
o que eu tentei
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?