总之,一切工作,直到我尝试从互联网上访问我的Apache服务器在docker集装箱。 进入的数据包到达docker容器,但是出口数据包被docker-machine上的NAT接口丢弃。
我的设置是
我可以做什么
我试过了
我已经缩小了问题(使用tcpdump和其他实验),当我连接到我的局域网上的计算机的容器中的Web服务器时,数据包stream经docker机中的桥接接口(192.168.1.102)。 当我从互联网连接传入的数据包stream通过192.168.1.102,但返回数据包不。 相反,它会通过docker-machine上的NAT接口并被丢弃。 我已经通过在docker-machine内部的NAT接口上执行“ifconfig eth0 down”来certificate这一点。 现在显然,这使我的docker机,因为我不能再运行docker命令,并杀死我当前的SSH会话。 但是当我这样做,从互联网的容器中的Web服务器的连接工作! 所以我certificate了返回数据包是问题。
现在, 我可以在docker-machine里面使用iptables来正确地路由这个数据包,这样它就能从桥接接口而不是NAT接口走出去了吗? 我试过没有成功。 这是我的docker-machine上的iptables规则。 我想要路由来自我的容器的源端口为11111的任何数据包,并将它们路由到eth1(桥接接口)。
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
我是否全部错了? 有没有一个标准的方式来设置,我还没有探索?