标签:发送 转换 ges 通信 请求 替换 做了 pdu www.
1.容器如何访问外部
前面我们做了很多试验:只要host能连外网,使用默认bridge(docker0)创建得容器就能访问外网,那么容器是怎样访问外网的呢?
注:这里的外网不仅是internet,包括internet
容器是怎样访问外网的呢?
这里的关键就是NAT。我们查看一下docker host上的iptables的规则
可以看到iptables对docker0这个bridge做了策略:当网桥docker0收到外出的包,把他交给MASQUERADE处理。而MASQUERADE的处理方式是将包的源地址替换成host地址发送出去,即做了一次网络地址转换(NAT)
我们可以通过tcpdump查看地址如何转换。先查看docker host的路由表:
默认路由通过ens160(host网卡) 发出去的,所以我们要同时监控ens160和docker0上的icmp(ping)数据包
源地址容器发送请求
docker0接收到源地址的请求,docker0将请求交给MASQURADE进行处理
我们可以看到ens160的变化:MASQUERADE将源地址的包转换成Host的地址,发送出去(这就是NAT的网络地址转换,深刻理解了)
这就是iptables NAT规则的处理结果,从而保证数据包能到达外网
继续盗图:
处理过程:1.容器发送ping包:172.17.0.5>www.baidu.com
2.docker0收到包后,发现是发送到外网的。交给NAT处理
3.NAT将源地址转换成ens160的IP:192.168.7.222>www.baidu.com
4.ping包从ens160发出去。到达www.baidu.com
通过NAT,docker容器实现了对外网的访问。
centos7下安装docker(12.4容器如何与外部进行通信)
标签:发送 转换 ges 通信 请求 替换 做了 pdu www.
原文地址:http://www.cnblogs.com/lkun/p/7747459.html