Linuxbridge方式虚拟机ping过程解析
1、 拓扑、环境
在三台服务器上分别创建三台虚拟机,三台虚拟机满足:
1) 在同一个租户的一个内网中;
2) 都绑定外网ip,即floatingip;
3) 分别在三台计算节点上。
2、 虚拟机、bridge表项查找过程
表项查找过程为:
2.1登陆一台虚拟机(vm1),找到绑定内网ip网卡(eth0)对应的mac地址;
登陆虚拟机,使用ip addr命令
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
3: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether fa:16:3e:6a:eb:ec brd ff:ff:ff:ff:ff:ff
inet 10.0.1.10 /24 brd 10.0.1.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe64:ee9/64 scope link
valid_lft forever preferred_lft forever
2.2登陆所有计算节点/网络节点,查找vm1所在的计算节点和dhcp;
在所有网络节点上使用linux命令查找:
grep -nr ' fa:16:3e:6a:eb:ec '/var/lib/neutron/dhcp/
在所有计算节点上使用linux命令查找:
grep -nr ' fa:16:3e:6a:eb:ec ' /var/lib/nova/instances/
找到后查看dhcp 下面的host文件:
[root@10-10-1-33 ~]# cat/var/lib/neutron/dhcp/72e4e728-98e7-48ff-8d4c-976c5bc4be6c/host
fa:16:3e:32:d3:b3,host-10-0-1-9.openstacklocal,10.0.1.9
fa:16:3e:3b:2b:90,host-10-0-1-4.openstacklocal.,10.0.1.4
fa:16:3e:3d:77:50,host-10-0-1-1.openstacklocal.,10.0.1.1
fa:16:3e:41:62:3c,host-10-0-1-5.openstacklocal.,10.0.1.5
fa:16:3e:4b:54:33,host-10-0-1-8.openstacklocal,10.0.1.8
fa:16:3e:56:0e:c7,host-10-0-1-6.openstacklocal.,10.0.1.6
fa:16:3e:86:34:8f,host-10-0-1-2.openstacklocal.,10.0.1.2
fa:16:3e:c9:c5:ea,host-10-0-1-3.openstacklocal.,10.0.1.3
fa:16:3e:6a:eb:ec,host-10-0-1-10.openstacklocal,10.0.1.10
fa:16:3e:34:11:b2,host-10-0-1-11.openstacklocal,10.0.1.11
fa:16:3e:db:64:dd,host-10-0-1-12.openstacklocal,10.0.1.12
查看dhcp netns的网卡信息:
[root@10-10-1-33 test]# ip netns execqdhcp-72e4e728-98e7-48ff-8d4c-976c5bc4be6c ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ns-f6cd140c-24:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether fa:16:3e:86:34:8f brd ff:ff:ff:ff:ff:ff
inet 10.0.1.2/24 brd 10.0.1.255 scopeglobal ns-f6cd140c-24
valid_lft forever preferred_lft forever
inet 169.254.169.254/16 brd 169.254.255.255 scope global ns-f6cd140c-24
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fe86:348f/64 scope link
valid_lft forever preferred_lft forever
2.3根据nova libvirt配置找到vm1对应的tap设备、计算节点linuxbridge、vxlan;
在2.2找到虚拟机所在的计算节点上查看libvirt.xml配置文件
[root@10-10-1-33 ~]# cat/var/lib/nova/instances/66d40651-fbc6-4a7f-af64-bda6fa9b65c5/libvirt.xml
<domain type="kvm">
……
<devices>
<interface type="bridge">
<mac address="fa:16:3e:6a:eb:ec"/> //mac地址
<model type="virtio"/>
<source bridge="brq72e4e728-98"/> //虚拟机绑定的网桥
<target dev="tap4d744f00-61"/> //虚拟机上的tap设备
</interface>
……
</devices>
</domain>
查看linux bridge信息:
[root@10-10-1-33 ~]# brctl show
bridge name bridgeid STP enabled interfaces
brq250835de-97 8000.5acdf3088b88 no eth2.303
tap11dc1a7e-30
tap53efabcb-5a
tap73a4a085-2a
tapa366e2c4-d9
tapba7441cc-25
tapcbed9baa-26
brq72e4e728-98 8000.0a2cbb058421 no tap08962bcf-5e
tap10b45a78-e5
tap4d744f00-61
tapf6cd140c-24
vxlan-11
2.4查找vm1连接的router、外网linux bridge、外网出接口、tap设备
在所有网络节点上查看ip netns,然后查看每个netns,找到router:
[root@10-10-1-33 ~]# ip netns execqrouter-5ccadf1b-cb5d-44d0-a2f8-c9a7b54cabe4 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: qr-58a0b2b4-10: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether fa:16:3e:ed:2a:9b brd ff:ff:ff:ff:ff:ff
inet 10.0.0.1/24 brd 10.0.0.255 scope global qr-58a0b2b4-10
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:feed:2a9b/64 scope link
valid_lft forever preferred_lft forever
3: qr-08962bcf-5e:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether fa:16:3e:3d:77:50 brd ff:ff:ff:ff:ff:ff
inet 10.0.1.1/24 brd 10.0.1.255 scopeglobal qr-08962bcf-5e 连接vm所在内网的端口ip
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fe3d:7750/64 scope link
valid_lft forever preferred_lft forever
4: qg-73a4a085-2a:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether fa:16:3e:74:16:da brd ff:ff:ff:ff:ff:ff
inet 192.168.3.25/24 brd 192.168.3.255 scope global qg-73a4a085-2a
valid_lft forever preferred_lft forever
inet 192.168.3.34/32 brd 192.168.3.34scope global qg-73a4a085-2a floatingip1
valid_lft forever preferred_lft forever
inet 192.168.3.33/32 brd 192.168.3.33scope global qg-73a4a085-2a floatingip2
valid_lft forever preferred_lft forever
inet 192.168.3.35/32 brd 192.168.3.35scope global qg-73a4a085-2a floatingip3
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fe74:16da/64 scope link
valid_lft forever preferred_lft forever
5: qr-18f43b67-46:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
link/ether fa:16:3e:88:40:e3 brd ff:ff:ff:ff:ff:ff
inet 10.0.88.1/24 brd 10.0.88.255 scope global qr-18f43b67-46
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fe88:40e3/64 scope link
valid_lft forever preferred_lft forever
2.5根据dhcp中的host文件获取vm2、vm3的mac地址、对应的计算节点、tap设备、计算节点linux bridge、vxlan;
根据dhcp中的host文件获取vm2、vm3的mac地址(也可以用步骤1获取),查找vm2、vm3对应的计算节点、tap设备、计算节点linux bridge、vxlan。即重复上面的2.2、2.3、2.4。
根据以上获取的信息可以画出1中的拓扑图。
3、 Ping过程bridge上mac表项变化情况
三台计算节点上连接虚拟机的网桥名字都是brq72e4e728-98。初始状态三个网桥上的mac地址为:
[root@10-10-1-33 ~]# brctlshowmacs brq72e4e728-98
port no mac addr is local? ageing timer
3 0a:2c:bb:05:84:21 yes 0.00
3 0a:2c:bb:05:84:21 yes 0.00
2 d6:1c:c7:6c:a5:68 yes 0.00
2 d6:1c:c7:6c:a5:68 yes 0.00
1 f2:f5:5a:67:04:f5 yes 0.00
1 f2:f5:5a:67:04:f5 yes 0.00
4 fa:16:3e:41:62:3c no 244.04
1 fa:16:3e:4b:54:33 no 5.08
2 fa:16:3e:86:34:8f no 5.08
4 fe:16:3e:41:62:3c yes 0.00
4 fe:16:3e:41:62:3c yes 0.00
5 fe:16:3e:6a:eb:ec yes 0.00 vm1-mac
5 fe:16:3e:6a:eb:ec yes 0.00
[root@10-10-1-34 ~]# brctl showmacs brq72e4e728-98
port no mac addr islocal? ageing timer
2 7a:2d:61:cc:e0:a6 yes 0.00
2 7a:2d:61:cc:e0:a6 yes 0.00
4 fa:16:3e:4b:54:33 no 29.62
2 fa:16:3e:86:34:8f no 29.62
5 fe:16:3e:34:11:b2 yes 0.00 vm2-mac
5 fe:16:3e:34:11:b2 yes 0.00
1 fe:16:3e:3b:2b:90 yes 0.00
1 fe:16:3e:3b:2b:90 yes 0.00
4 fe:16:3e:4b:54:33 yes 0.00
4 fe:16:3e:4b:54:33 yes 0.00
3 fe:16:3e:56:0e:c7 yes 0.00
3 fe:16:3e:56:0e:c7 yes 0.00
[root@10-10-1-37 ~]# brctlshowmacs brq72e4e728-98
port no mac addr islocal? ageing timer
2 f2:15:8c:33:ed:22 yes 0.00
2 f2:15:8c:33:ed:22 yes 0.00
2 fa:16:3e:4b:54:33 no 161.63
1 fe:16:3e:c9:c5:ea yes 0.00
1 fe:16:3e:c9:c5:ea yes 0.00
3 fe:16:3e:db:64:dd yes 0.00 vm3-mac
3 fe:16:3e:db:64:dd yes 0.00
然后在vm2上ping vm1,在ping的过程中查看三个网桥上的mac地址:
[root@10-10-1-33 ~]# brctlshowmacs brq72e4e728-98
port no mac addr is local? ageing timer
3 0a:2c:bb:05:84:21 yes 0.00
3 0a:2c:bb:05:84:21 yes 0.00
2 d6:1c:c7:6c:a5:68 yes 0.00
2 d6:1c:c7:6c:a5:68 yes 0.00
1 f2:f5:5a:67:04:f5 yes 0.00
1 f2:f5:5a:67:04:f5 yes 0.00
1 fa:16:3e:32:d3:b3 no 0.41
1 fa:16:3e:34:11:b2 no 0.81
1 fa:16:3e:4b:54:33 no 25.14
5 fa:16:3e:6a:eb:ec no 0.81
2 fa:16:3e:86:34:8f no 0.72
4 fe:16:3e:41:62:3c yes 0.00
4 fe:16:3e:41:62:3c yes 0.00
5 fe:16:3e:6a:eb:ec yes 0.00
5 fe:16:3e:6a:eb:ec yes 0.00
[root@10-10-1-34 ~]# brctl showmacs brq72e4e728-98
port no mac addr islocal? ageing timer
2 7a:2d:61:cc:e0:a6 yes 0.00
2 7a:2d:61:cc:e0:a6 yes 0.00
6 fa:16:3e:32:d3:b3 no 0.40
5 fa:16:3e:34:11:b2 no 0.09
2 fa:16:3e:3d:77:50 no 0.40
4 fa:16:3e:4b:54:33 no 23.62
2 fa:16:3e:6a:eb:ec no 0.09
2 fa:16:3e:86:34:8f no 4.02
6 fe:16:3e:32:d3:b3 yes 0.00
6 fe:16:3e:32:d3:b3 yes 0.00
5 fe:16:3e:34:11:b2 yes 0.00
5 fe:16:3e:34:11:b2 yes 0.00
1 fe:16:3e:3b:2b:90 yes 0.00
1 fe:16:3e:3b:2b:90 yes 0.00
4 fe:16:3e:4b:54:33 yes 0.00
4 fe:16:3e:4b:54:33 yes 0.00
3 fe:16:3e:56:0e:c7 yes 0.00
3 fe:16:3e:56:0e:c7 yes 0.00
[root@10-10-1-37 ~]# brctlshowmacs brq72e4e728-98
port no mac addr is local? ageing timer
2 f2:15:8c:33:ed:22 yes 0.00
2 f2:15:8c:33:ed:22 yes 0.00
2 fa:16:3e:4b:54:33 no 185.08
1 fe:16:3e:c9:c5:ea yes 0.00
1 fe:16:3e:c9:c5:ea yes 0.00
3 fe:16:3e:db:64:dd yes 0.00
3 fe:16:3e:db:64:dd yes 0.00
这个过程可以看出:虽然三个网桥名字相同,但上面的mac地址不同,接口也不同,不是同一个网桥,只是名字相同,表示是同一个租户的同一个网络而已。
4、 抓包分析
Ping的过程中在三个网桥和router netns中进行抓包。
在vm2连接的网桥上:
在router上:
在vm1连接的网桥上:
在vm3连接的网桥上没有收到相关的数据包。
对抓取的数据包进行分析:
1) vm2不知道vm1的mac地址,发送了arp广播请求给网关(router)、vm1,vm1进行arp相应,然后vm2将ping request数据包发给了网关(router);
2) router将ping request数据包发给vm1;
3) vm1没有vm2的mac地址,发送arp广播请求,vm2给与回应;vm1发送ping reply给vm2;
4) vm2收到ping reply数据包。对于后续的ping request数据包则直接发给vm1。