同一宿主机同一桥接网卡下两个同一网段的容器之间的通信原理分析
-----结合tcpdump和Wireshark分析
1实验环境的准备,docker run起两个符合要求的contanier
命令: [root@oxhtest ~]# docker run -itd --name centosdemo1 --privileged centos /bin/bash
[root@oxhtest ~]# docker run -itd --name centosdemo2 --privileged centos /bin/bash
命令截图:
docker run --help
2分别进到两个容器中查看路由表
注释:去哪个网络地址走哪个路由可依据路由选择的最长匹配原则和交换机的工作原理思考
3查看两个容器的ip地址
4通信原理图
原理说明:1.此时172.17.0.4ping172.17.0.5是走的二层网络,并不会走三层,此时的docker0就相当于一个交换机,centosdemo1和centosdemo2就相当于下挂在交换机上的两台pc
5抓包验证
5.1首先在172.17.0.4上发起ping
5.2在centosdemo1上抓icmp的ping包查看源地址和目的地址情况
5.2在宿主机上的eth0和docker0上分别抓包
5.2.1在宿主机的eth0上抓icmp的ping包且源地址为172.17.0.4(按原理应该是抓不到任何包的)
5.2.2在宿主机的docker0上抓icmp的ping包且源地址为172.17.0.4(按原理应该是可以抓到包的)
5.3在centosdemo2上抓icmp的ping包查看源地址和目的地址情况
6结论:在整个过程中包并没有被做任何的修改,同一宿主机同一桥接网卡下两个同一网段的容器之间是做的二层协议,此时的docker0就相当于一个交换机,centosdemo1和centosdemo2就相当于下挂在交换机上的两台pc
容器可以和外界通信原理的分析
--以ping通信为例子结合抓包分析
1实验环境准备我们已上面的centosdemo1为实验对象,ping另一台云主机(公网地址106.53.163.63)为实验环境
2.原理分析
分析:此时在从宿主机的docker0到宿主机的eth0的过程中会有一个源地址的转换,装换依据宿主机上的iptaples规则
整个通信过程如下
在centosdemo1上发起ping,此时ping包通过容器里的eth0与外界通信,容器经过查看路由表发现目标地址是106.53.163.63此时会选择走第一条路由,也就是走自己的网关172.17.0.1(docker0)与外界通信。
数据包到达docker0之后,也就是到达宿主机上时先看iptanles规则中的路由前规则,因为此时iptables没有路由前规则,随后查路由表,决定走哪个路由,选好路由规则后再查iptables的路由后规程
iptables没有路由前规则的截图,接下来会查路由表做哪条路由
依据数据包的源和目标ip选择以下路由,决定把数据包发给eth0
决定把数据包发给宿主机的eth0后做源地址装换(这个由路由后的iptables规则决定)
规则解释:所有源地址是172.17.0.0/16且目标地址不是docker0的数据包做源地址装换
3结合原理预测抓包结果
抓包网卡 源地址 目标地址
容器内的eth0 172.17.0.4 106.52.163.63
宿主机的docker0 172.17.0.4 106.52.163.63
宿主机的eth0 172.21.32.5(宿主机的eth0网卡地址) 106.52.163.63
目标主机的eth0 49.232.53.135(宿主机公网地址) 172.16.0.14(目标主机内网地址)
4抓包验证
4.1centosdemo1容器内发起ping
4.2容器内eth0抓包验证源地址目标地址
4.3宿主机docker0上抓包验证源地址目标地址
4.4宿主机eth0上抓包验证源地址目标地址(如果宿主机eth0上的数据包比较多的话,多写点tcpdump的过滤规则精确抓包有助于分析)
4.5目标主机eth0抓包验证源地址目标地址