OpenStack学习系列之九:多种网络类型下的实例之间网络通信问题详解

    OpenStack的neutron组件实现了跨宿主机实例之间的网络分配和通信功能,其中网络中使用了Linux的网络命名空间来实现网络的隔离,相关资料可以参考:https://www.cnblogs.com/djoker/p/15974846.html
在OpenStack的部署安装中,在ens19和ens20两个物理网卡上分别创建了provider和inside两个网络,这两个网络类型是一样的,都是flat网络类型,借助桥接将物理网卡和实例的虚拟网卡进行桥接,实现网络通信。

flat网络类型

    在安装部署OpenStack时设置网络部分已经添加了两个网络,分别是provider(绑定网卡ens19)和inside(绑定网卡ens20),这两个网络都是flat网络,将实例的虚拟网卡和物理网卡桥接在一起。在控制节点node1上可以看到两个桥接网卡brqd1e4b37b-ee和brq6f032080-47并分别桥接ens19和ens20。
    获取OpenStack的网络信息可以看到,brqd1e4b37b-ee对应的网络ID为d1e4b37b-eeb7-4934-aab7-dec537139a3a,而brq6f032080-47对应的网络ID为6f032080-473d-4aa8-8cc3-074f23ecc4dd
[root@node1 ~]# openstack network list
+--------------------------------------+----------+--------------------------------------+
| ID                                   | Name     | Subnets                              |
+--------------------------------------+----------+--------------------------------------+
| 6f032080-473d-4aa8-8cc3-074f23ecc4dd | inside   | 11eec460-caf2-45d1-ad79-432106b07f59 |
| d1e4b37b-eeb7-4934-aab7-dec537139a3a | provider | d439dfdb-8e80-4d30-a415-f7015c2108bc |
+--------------------------------------+----------+--------------------------------------+
    对应关系如下所示:

OpenStack Network ID
网络名词
宿主机桥接网卡
桥接物理网卡
d1e4b37b-eeb7-4934-aab7-dec537139a3a
provider
brqd1e4b37b-ee
ens19
6f032080-473d-4aa8-8cc3-074f23ecc4dd
inside
brq6f032080-47
ens20

    这里以provider网络为例,查看provider网络的网络命名空间,可以通过获取的OpenStack network的ID来确认为qdhcp-d1e4b37b-eeb7-4934-aab7-dec537139a3a

[root@node1 ~]# ip netns ls
qdhcp-d1e4b37b-eeb7-4934-aab7-dec537139a3a (id: 1)
qdhcp-6f032080-473d-4aa8-8cc3-074f23ecc4dd (id: 0)
    查看provider网络的命名空间的网络信息,可以看到其中的虚拟网卡为ns-3e628810-83,同时配置了IP地址为172.16.1.10,这里的IP地址用于启动DHCP服务并对外分配IP地址

[root@node1 ~]# ip netns exec qdhcp-d1e4b37b-eeb7-4934-aab7-dec537139a3a ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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-3e628810-83@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:78:a1:95 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.1.10/24 brd 172.16.1.255 scope global ns-3e628810-83
       valid_lft forever preferred_lft forever
    inet 169.254.169.254/32 brd 169.254.169.254 scope global ns-3e628810-83
       valid_lft forever preferred_lft forever
    inet6 fe80::a9fe:a9fe/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe78:a195/64 scope link 
       valid_lft forever preferred_lft forever
    而对应网络命名空间内虚拟网卡ns-3e628810-83的宿主机上的虚拟网卡为tap3e628810-83,可以看到和ens19为桥接在一起

brqd1e4b37b-ee		8000.862a331edfda	no		ens19
							tap3e628810-83
    而provider和inside之所以分别绑定在ens19和ens20两个网卡,是在neutron组件配置中/etc/neutron/plugins/ml2/linuxbridge_agent.ini配置文件中已经指定。

[linux_bridge] 
physical_interface_mappings = provider:ens19,inside:ens20
    创建两个实例在不同的计算节点上,网络使用provider网络,当实例运行之后,测试网络通信和查看网卡桥接状态
    创建两个实例并查看网络和运行主机信息,可以看到test-1实例运行在node4上,而test-2实例运行在node3上

[root@node1 ~]# openstack server list --long
+--------------------------------------+--------+--------+------------+-------------+-----------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
| ID                                   | Name   | Status | Task State | Power State | Networks              | Image Name               | Image ID                 | Flavor Name | Flavor ID | Availability Zone | Host  | Properties |
+--------------------------------------+--------+--------+------------+-------------+-----------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
| 59b013a2-9880-4396-a022-81db284d6f2c | test-1 | ACTIVE | None       | Running     | provider=172.16.1.136 | N/A (booted from volume) | N/A (booted from volume) | m1.nano     | 0         | nova              | node4 |            |
| 8259be88-a207-4c96-bb91-9574c8264034 | test-2 | ACTIVE | None       | Running     | provider=172.16.1.43  | N/A (booted from volume) | N/A (booted from volume) | m1.nano     | 0         | nova              | node3 |            |
+--------------------------------------+--------+--------+------------+-------------+-----------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
    登录test-1实例的控制台查看IP地址并测试和实例test-2的网络是可以通行的

    此时查看node4上的网络信息,桥接口brqd1e4b37b-ee和控制节点上的桥接网卡名称一样,且ens19和tapb47c3f02-3b为桥接网卡。其中tapb47c3f02-3b为虚拟网卡对,一段在宿主机上和ens19作为桥接,另一端在实例中。而node3上的网络情况和node4一样。

bridge name	bridge id		STP enabled	interfaces
brqd1e4b37b-ee		8000.0e9decd1b677	no		ens19
							tapb47c3f02-3b

vlan网络类型

    flat网络类型需要每个网络都绑定一个物理网卡,且两个flat网络类型的网络无法绑定同一个屋里网卡。当实例网络不断增加时已经无法满足需求,此时就需要vlan网络类型。vlan网络可以在一个物理网卡上添加多个,此时需要物理网卡和连接的交换机上的网口配置为trunk接口类型,并允许vlan网络类型的vlan ID。
    vlan网类型的配置,在neutron组件的配置中/etc/neutron/plugins/ml2/ml2_conf.ini已经指定,并调用网络桥接插件/etc/neutron/plugins/ml2/linuxbridge_agent.ini。可以看到vlan网络类型调用的provider网络,其中vlanID为1001到2000,而provider网络绑定的物理网卡为ens19。所以需要调整ens19物理网卡对应的交换机网口为trunk口并允许vlan1001到vlan2000可以通过。
# /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2] 
type_drivers = local,flat,vlan,gre,vxlan,geneve
[ml2_type_vlan] 
network_vlan_ranges = provider:1001:2000
# /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[linux_bridge] 
physical_interface_mappings = provider:ens19,inside:ens20
    在Dashboard添加vlan网络中添加vlan网络。需要在管理员菜单下的网络页面中完成添加网络的操作。
    创建网络输入名称、项目和网络类型,这里选择vlan,物理网络就是provider,会自动查找到网卡ens19,vlanID为1001,需要在范围1001到2000中。
    输入网络地址172.17.0.0/24,网关172.17.0.1

    输入地址池,172.17.0.10,172.17.0.100

    vlan1001网络创建完成

    在控制节点node1上查看网络相关信息,首先获取OpenStack的网络信息,可以看到刚刚添加的vlan1001网络,ID为54886452-55a2-437f-aa99-238e55403fc7
[root@node1 ~]# . admin-openrc 
[root@node1 ~]# openstack network list
+--------------------------------------+----------+--------------------------------------+
| ID                                   | Name     | Subnets                              |
+--------------------------------------+----------+--------------------------------------+
| 54886452-55a2-437f-aa99-238e55403fc7 | vlan1001 | ec33a0a5-4019-4f31-a5d8-2ca86d2c9fa2 |
| 6f032080-473d-4aa8-8cc3-074f23ecc4dd | inside   | 11eec460-caf2-45d1-ad79-432106b07f59 |
| d1e4b37b-eeb7-4934-aab7-dec537139a3a | provider | d439dfdb-8e80-4d30-a415-f7015c2108bc |
+--------------------------------------+----------+--------------------------------------+
    查看控制节点上的网络命名空间,可以看到多了一个qdhcp-54886452-55a2-437f-aa99-238e55403fc7,这个命名空间和OpenStack的网络id是对应的,查看该网络命名空间下的网络IP地址可以证实。
[root@node1 ~]# ip netns ls
qdhcp-54886452-55a2-437f-aa99-238e55403fc7 (id: 2)
qdhcp-d1e4b37b-eeb7-4934-aab7-dec537139a3a (id: 1)
qdhcp-6f032080-473d-4aa8-8cc3-074f23ecc4dd (id: 0)
[root@node1 ~]# ip netns exec qdhcp-54886452-55a2-437f-aa99-238e55403fc7 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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-13daa25c-58@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:5d:ed:b9 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.10/24 brd 172.17.0.255 scope global ns-13daa25c-58
       valid_lft forever preferred_lft forever
    inet 169.254.169.254/32 brd 169.254.169.254 scope global ns-13daa25c-58
       valid_lft forever preferred_lft forever
    inet6 fe80::a9fe:a9fe/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe5d:edb9/64 scope link 
       valid_lft forever preferred_lft forever
    添加的vlan1001的网络命名空间中的ns-13daa25c-58虚拟网卡和宿主机上的网卡tap13daa25c-58是一对虚拟网卡,而tap13daa25c-58和ens19.1001宿主机上的vlan网卡是桥接网卡,这样就可以通过ens19.1001网卡和其他宿主机上的实例通信。
[root@node1 ~]# brctl show 
bridge name	bridge id		STP enabled	interfaces
brq54886452-55		8000.862a331edfda	no		ens19.1001
							tap13daa25c-58
    创建两个实例在不同的计算节点上,网络使用vlan1001网络,当实例运行之后,测试网络通信和查看网卡桥接状态
    创建两个实例并查看网络和运行主机信息,可以看到vlan-test-1实例运行在node4上,而vlan-test-2实例运行在node3上

[root@node1 ~]# openstack server list --long
+--------------------------------------+-------------+--------+------------+-------------+----------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
| ID                                   | Name        | Status | Task State | Power State | Networks             | Image Name               | Image ID                 | Flavor Name | Flavor ID | Availability Zone | Host  | Properties |
+--------------------------------------+-------------+--------+------------+-------------+----------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
| 1063b59c-5680-4a38-ab25-10f364fe2bb6 | vlan-test-1 | ACTIVE | None       | Running     | vlan1001=172.17.0.46 | N/A (booted from volume) | N/A (booted from volume) | m1.nano     | 0         | nova              | node4 |            |
| 946e1f20-c31f-4a38-bf42-fd3eb82af472 | vlan-test-2 | ACTIVE | None       | Running     | vlan1001=172.17.0.33 | N/A (booted from volume) | N/A (booted from volume) | m1.nano     | 0         | nova              | node3 |            |
+--------------------------------------+-------------+--------+------------+-------------+----------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
    登录vlan-test-1实例的控制台查看IP地址并测试和实例vlan-test-2的网络是可以通行的
    此时查看node4上的网络信息,桥接口brq54886452-55和控制节点上的桥接网卡名称一样,且ens19.1001和tap5c14401a-3a为桥接网卡。其中tap5c14401a-3a为虚拟网卡对,一端在宿主机上和ens19.1001作为桥接,另一端在实例中。而node3上的网络情况和node4一样。
brq54886452-55		8000.0e9decd1b677	no		ens19.1001
							tap5c14401a-3a
    使用vlan1001网络的实例如果想访问外部网络,需要ens19物理网卡相连的交换机的网口设置为trunk,且在vlan网络ID为1001中有对应的网关来转发流量即可。

vxlan网络类型

    vxlan网络类型是三层网络,实例和实例之间通过vxlan网络来通信,类似实例之间建立了隧道来通信。它没有vlan网络类型的vlanID号的限制,也没有flat网络类型需要绑定物理网卡的限制。但是因为是三层网络,所以外部访问vxlan网络的实例时需要额外配置路由。
    在neutron组件的配置中已经指定了vxlan的相关配置
# /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
type_drivers = local,flat,vlan,gre,vxlan,geneve
ml2_type_vxlan = vni_ranges 1:1000             # 设置vxlan的ID范围
# /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[vxlan]
enable_vxlan = true
local_ip = 192.168.31.101   # 宿主机之间转发实例数据的使用的ip地址,vxlan会自动工作在该ip所在的网卡,即ens18
    Dashboard添加vxlan网络,创建网络时的名称为vxlan1,网络类型为vxlan,段ID为1

    网络地址范围为172.16.1.10/24,网关设置为172.16.1.1

    输入地址池172.16.1.10,172,16.1.100

    vxlan1网络创建完成

    在控制节点node1上查看网络相关信息,首先获取OpenStack的网络信息,可以看到刚刚添加的vlan1001网络,ID为54886452-55a2-437f-aa99-238e55403fc7

[root@node1 ~]# . admin-openrc 
[root@node1 ~]# openstack network list
+--------------------------------------+----------+--------------------------------------+
| ID                                   | Name     | Subnets                              |
+--------------------------------------+----------+--------------------------------------+
| 5415275c-9c56-4f09-aab3-3eabde4f4eb0 | vxlan1   | b7cf01d1-1331-4d1b-a86a-00e58a0f3c3a |
| 54886452-55a2-437f-aa99-238e55403fc7 | vlan1001 | ec33a0a5-4019-4f31-a5d8-2ca86d2c9fa2 |
| 6f032080-473d-4aa8-8cc3-074f23ecc4dd | inside   | 11eec460-caf2-45d1-ad79-432106b07f59 |
| d1e4b37b-eeb7-4934-aab7-dec537139a3a | provider | d439dfdb-8e80-4d30-a415-f7015c2108bc |
+--------------------------------------+----------+--------------------------------------+
    查看控制节点上的网络命名空间,可以看到多了一个qdhcp-5415275c-9c56-4f09-aab3-3eabde4f4eb0,这个命名空间和OpenStack的网络id是对应的,查看该网络命名空间下的网络IP地址可以证实。

[root@node1 ~]# ip netns ls
qdhcp-5415275c-9c56-4f09-aab3-3eabde4f4eb0 (id: 3)
qdhcp-54886452-55a2-437f-aa99-238e55403fc7 (id: 2)
qdhcp-d1e4b37b-eeb7-4934-aab7-dec537139a3a (id: 1)
qdhcp-6f032080-473d-4aa8-8cc3-074f23ecc4dd (id: 0)
[root@node1 ~]# ip netns exec qdhcp-5415275c-9c56-4f09-aab3-3eabde4f4eb0 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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-74b9fa42-6a@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:31:14:a6 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.1.10/24 brd 172.16.1.255 scope global ns-74b9fa42-6a
       valid_lft forever preferred_lft forever
    inet 169.254.169.254/32 brd 169.254.169.254 scope global ns-74b9fa42-6a
       valid_lft forever preferred_lft forever
    inet6 fe80::a9fe:a9fe/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe31:14a6/64 scope link 
       valid_lft forever preferred_lft forever
    添加的vxlan1的网络命名空间中的ns-74b9fa42-6a虚拟网卡和宿主机上的网卡vxlan-1是一对虚拟网卡,而vxlan-1和ens18宿主机上的网卡是桥接网卡,这样就可以通过ens18网卡和其他宿主机上的实例通信。vxlan网络在宿主机上通过udp协议进行通信,使用udp协议将数据包进行封装,然后接收方解包后在转发到对应实例中。

[root@node1 ~]#  brctl show 
bridge name	bridge id		STP enabled	interfaces
brq5415275c-9c		8000.7e2576bd20b3	no		tap74b9fa42-6a
							vxlan-1
# 可以看到接口为vxlan,id为1,工作在网卡ens8上,和neutron的配置一致,且通信端口为udp 8472
[root@node1 ~]# ip -d link show vxlan-1
14: vxlan-1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master brq5415275c-9c state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 82:a3:88:c3:c2:e3 brd ff:ff:ff:ff:ff:ff promiscuity 1 minmtu 68 maxmtu 65535 
    vxlan id 1 group 224.0.0.1 dev ens18 srcport 0 0 dstport 8472 ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx
    创建两个实例在不同的计算节点上,网络使用vxlan1网络,当实例运行之后,测试网络通信和查看网卡桥接状态
    创建两个实例并查看网络和运行主机信息,可以看到vxlan1-1实例运行在node4上,而vxlan2-2实例运行在node3上

[root@node1 ~]# openstack server list --long
+--------------------------------------+----------+--------+------------+-------------+--------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
| ID                                   | Name     | Status | Task State | Power State | Networks           | Image Name               | Image ID                 | Flavor Name | Flavor ID | Availability Zone | Host  | Properties |
+--------------------------------------+----------+--------+------------+-------------+--------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
| dc828568-f60c-4259-898c-8c43d5c1fe64 | vxlan1-2 | ACTIVE | None       | Running     | vxlan1=172.16.1.17 | N/A (booted from volume) | N/A (booted from volume) | m1.nano     | 0         | nova              | node3 |            |
| fdb2c8a0-4ed4-4842-ac5b-40aa9b6afb48 | vxlan1-1 | ACTIVE | None       | Running     | vxlan1=172.16.1.33 | N/A (booted from volume) | N/A (booted from volume) | m1.nano     | 0         | nova              | node4 |            |
+--------------------------------------+----------+--------+------------+-------------+--------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
    登录vxlan1-1实例的控制台查看IP地址并测试和实例vxlan1-2的网络是可以通信的

    此时查看node4上的网络信息,桥接口brq5415275c-9c和控制节点上的桥接网卡名称一样,且vxlan-1和tap145db8f2-ce为桥接网卡。其中tap145db8f2-ce为虚拟网卡对,一端在宿主机上和vxlan-1作为桥接,另一端在实例中。而node3上的网络情况和node4一样。同时vxlan因为neutron的配置中指定了管理网的IP地址,所以工作在ens18网卡上。

bridge name	bridge id		STP enabled	interfaces
brq5415275c-9c		8000.06bc46f08ed9	no		tap145db8f2-ce
							vxlan-1
[root@node4 ~]# ip -d link show vxlan-1
16: vxlan-1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master brq5415275c-9c state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 06:bc:46:f0:8e:d9 brd ff:ff:ff:ff:ff:ff promiscuity 1 minmtu 68 maxmtu 65535 
    vxlan id 1 local 192.168.31.104 dev ens18 srcport 0 0 dstport 8472 ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx 
    当vxlan1-1实例去ping实例vxlan1-2的IP地址时,在vxlan1-1实例所在的宿主机node4的ens18网卡上抓包,抓包为udp 8472,可以看到如下信息。

[root@node4 ~]# tcpdump  -n -i ens18 udp port 8472
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens18, link-type EN10MB (Ethernet), capture size 262144 bytes
14:16:56.322196 IP 192.168.31.104.47460 > 192.168.31.103.otv: OTV, flags [I] (0x08), overlay 0, instance 1
IP 172.16.1.33 > 172.16.1.17: ICMP echo request, id 49153, seq 0, length 64
14:16:56.322666 IP 192.168.31.103.59652 > 192.168.31.104.otv: OTV, flags [I] (0x08), overlay 0, instance 1
IP 172.16.1.17 > 172.16.1.33: ICMP echo reply, id 49153, seq 0, length 64
14:16:57.322516 IP 192.168.31.104.47460 > 192.168.31.103.otv: OTV, flags [I] (0x08), overlay 0, instance 1
IP 172.16.1.33 > 172.16.1.17: ICMP echo request, id 49153, seq 1, length 64
14:16:57.323099 IP 192.168.31.103.59652 > 192.168.31.104.otv: OTV, flags [I] (0x08), overlay 0, instance 1
IP 172.16.1.17 > 172.16.1.33: ICMP echo reply, id 49153, seq 1, length 64
14:16:58.322837 IP 192.168.31.104.47460 > 192.168.31.103.otv: OTV, flags [I] (0x08), overlay 0, instance 1
IP 172.16.1.33 > 172.16.1.17: ICMP echo request, id 49153, seq 2, length 64
14:16:58.323258 IP 192.168.31.103.59652 > 192.168.31.104.otv: OTV, flags [I] (0x08), overlay 0, instance 1
IP 172.16.1.17 > 172.16.1.33: ICMP echo reply, id 49153, seq 2, length 64
14:16:59.323134 IP 192.168.31.104.47460 > 192.168.31.103.otv: OTV, flags [I] (0x08), overlay 0, instance 1
IP 172.16.1.33 > 172.16.1.17: ICMP echo request, id 49153, seq 3, length 64
14:16:59.323876 IP 192.168.31.103.59652 > 192.168.31.104.otv: OTV, flags [I] (0x08), overlay 0, instance 1
IP 172.16.1.17 > 172.16.1.33: ICMP echo reply, id 49153, seq 3, length 64
14:17:01.329459 IP 192.168.31.104.45810 > 192.168.31.103.otv: OTV, flags [I] (0x08), overlay 0, instance 1
ARP, Request who-has 172.16.1.17 tell 172.16.1.33, length 28
14:17:01.330025 IP 192.168.31.103.55260 > 192.168.31.104.otv: OTV, flags [I] (0x08), overlay 0, instance 1
ARP, Reply 172.16.1.17 is-at fa:16:3e:74:ad:39, length 28
    vxlan网络类型和flat网络类型、vlan网络类型不同。flat网络类型和vlan网络类型可以通过外部的网络设置做路由转发进行通信,而vxlan网络类型和外部网络是无法通信的,只是在宿主机的实例之间进行数据通信,且是通过udp协议进行了封装。
    而不同vxlan网类型的实例之间可以通过OpenStack提供的路由功能进行通信。这里再添加一个vxlan网类型的网络为vxlan2,网络段为172.16.2.0/24,网关为172.16.2.1。修改vxlan网络类型的网络vxlan1和vxlan2为共享网络。在管理员菜单下编辑网络可以修改。

    使用vxlan2网络创建实例vxlan2-1,并测试vxlan2-1是否可以访问vxlan1-1实例。测试结果发现在vxlan1-1中是无法ping同vxlan2-1实例的IP地址。

[root@node1 ~]# openstack server list --long
+--------------------------------------+----------+--------+------------+-------------+--------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
| ID                                   | Name     | Status | Task State | Power State | Networks           | Image Name               | Image ID                 | Flavor Name | Flavor ID | Availability Zone | Host  | Properties |
+--------------------------------------+----------+--------+------------+-------------+--------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
| c3bc87b0-49cb-42c3-ac34-5a73b7222daa | vxlan2-1 | ACTIVE | None       | Running     | vxlan2=172.16.2.19 | N/A (booted from volume) | N/A (booted from volume) | m1.nano     | 0         | nova              | node5 |            |
| dc828568-f60c-4259-898c-8c43d5c1fe64 | vxlan1-2 | ACTIVE | None       | Running     | vxlan1=172.16.1.17 | N/A (booted from volume) | N/A (booted from volume) | m1.nano     | 0         | nova              | node3 |            |
| fdb2c8a0-4ed4-4842-ac5b-40aa9b6afb48 | vxlan1-1 | ACTIVE | None       | Running     | vxlan1=172.16.1.33 | N/A (booted from volume) | N/A (booted from volume) | m1.nano     | 0         | nova              | node4 |            |
+--------------------------------------+----------+--------+------------+-------------+--------------------+--------------------------+--------------------------+-------------+-----------+-------------------+-------+------------+
    在OpenStack中添加路由,vxlan1和vlxna2的添加路由方式相同。添加vxlan1and2的路由如下:

    添加完成后如下所示:

    在vxlan1and2的路由中添加接口,指定子网为vxlan1,并指定IP地址为172.16.1.1,因为在添加网络的时候指定的网关为172.16.1.1

    在vxlan1and2的路由中添加接口,指定子网为vxlan2,并指定IP地址为172.16.2.1,因为在添加网络的时候指定的网关为172.16.2.1

    添加完成后如下所示:

    添加完成后,此时从vxlan1-1访问vxlan2-1的实例的IP地址,已经可以ping通。

OpenStack路由分析

    OpenStack中添加路由,其实就是创建一个虚拟网卡对,一端和命名空间中虚拟网卡对的另一个虚拟网卡所在的桥接口上,另一端在路由命名空间中,且配置IP地址,然后在路由命名空间中进行流量的转发。
查看路由的命名空间

[root@node1 ~]# ip netns ls
qrouter-636634da-8514-4b6a-9a11-43ddf1cb5682 (id: 4)
   查看桥接信息,可以看到在brq5415275c-9c桥接上新添加了一个虚拟网卡tap5855715d-db,该网络和vxlan1网络相通;而在brqe1299b5f-86桥接上新添加了一个tapa374532d-00,该网络和vxlan2网络相通。

[root@node1 ~]# brctl show 
bridge name	bridge id		STP enabled	interfaces
brq5415275c-9c		8000.46ca3d9407da	no		tap5855715d-db
							tap74b9fa42-6a
							vxlan-1
brqe1299b5f-86		8000.2ed0545ab821	no		tapa374532d-00
							taped3f4470-9e
							vxlan-2
    查看路由命名空间qrouter-636634da-8514-4b6a-9a11-43ddf1cb5682中的网络信息,可以看到在Dashboard配置的两个网络的网关IP地址都在改路由命名空间中,此时两个网络就可以相互之间通信。

[root@node1 ~]# ip netns exec qrouter-636634da-8514-4b6a-9a11-43ddf1cb5682 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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-5855715d-db@if26: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:dd:e1:a2 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.1.1/24 brd 172.16.1.255 scope global qr-5855715d-db
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fedd:e1a2/64 scope link 
       valid_lft forever preferred_lft forever
3: qr-a374532d-00@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:a9:bd:74 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.2.1/24 brd 172.16.2.255 scope global qr-a374532d-00
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fea9:bd74/64 scope link 
       valid_lft forever preferred_lft forever
    vxlan网络类型通过路由的方式除了和另一个vxlan网络进行通信外,还可以和其它网络类型的实例通信,原理和上述一样,但是因为默认路由(vxlan和flat网络类型的默认路由都是外部网络设备)的问题,所以可能还需要在路由中添加静态路由,同时实例上也可能需要配置额外的路由信息。
    因为vxlan网络的特殊性,如果外部需要访问vxlan网络类型的实例提供的服务,需要通过浮动IP的方式来访问。
    添加浮动IP时,需要首先设置该vxlan的路由,并指定该路由的外部地址,这里设置为inside,

    因为vxlan1的网段和provider的网段相同,都是使用的172.16.1.0/24,如果设置外部网络为provider则会报错,提示网络冲突

     分配浮动IP

    将分配的浮动IP地址进行关联

    将分配的浮动IP地址10.1.0.50和实例ip地址172.16.1.33进行关联。

    关联之后可以从浮动ip这里看到关联信息。

    此时就可以通过浮动IP地址来访问实例,就是通过iptables做了IP地址的一对一映射。

OpenStack浮动IP分析

    OpenStack的浮动IP地址需要先做路由,然后配置浮动IP地址。通过查看路由的网络命名空间配置可以得知,浮动IP地址就是添加到路由的网络命名空间中。在路由的网络命名空间中添加了一个inside网络的IP地址:10.1.0.83/24,在做数据转发时使用的路由IP地址。
[root@node1 ~]# ip netns exec qrouter-636634da-8514-4b6a-9a11-43ddf1cb5682  ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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-5855715d-db@if26: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:dd:e1:a2 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.1.1/24 brd 172.16.1.255 scope global qr-5855715d-db
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fedd:e1a2/64 scope link 
       valid_lft forever preferred_lft forever
3: qr-a374532d-00@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:a9:bd:74 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.2.1/24 brd 172.16.2.255 scope global qr-a374532d-00
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fea9:bd74/64 scope link 
       valid_lft forever preferred_lft forever
6: qg-adbbc7d0-4e@if30: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:ce:1a:6b brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.1.0.83/24 brd 10.1.0.255 scope global qg-adbbc7d0-4e
       valid_lft forever preferred_lft forever
    inet 10.1.0.50/32 brd 10.1.0.50 scope global qg-adbbc7d0-4e
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fece:1a6b/64 scope link 
       valid_lft forever preferred_lft forever
# 而qg-adbbc7d0-4e虚拟网卡的另一端,tapadbbc7d0-4e和ens20和tapfea707b3-91作为桥接口
brq6f032080-47		8000.4a7c30e1d740	no		ens20
							tapadbbc7d0-4e
							tapfea707b3-91
# 查看inside的网络命名空间可以看到,tapfea707b3-91和ns-fea707b3-91是一对,这样inside网络和vxlan1的网络就可以通信了
[root@node1 ~]# ip netns exec qdhcp-6f032080-473d-4aa8-8cc3-074f23ecc4dd ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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-fea707b3-91@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:02:67:64 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 169.254.169.254/32 brd 169.254.169.254 scope global ns-fea707b3-91
       valid_lft forever preferred_lft forever
    inet 10.1.0.10/24 brd 10.1.0.255 scope global ns-fea707b3-91
       valid_lft forever preferred_lft forever
    inet6 fe80::a9fe:a9fe/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe02:6764/64 scope link 
       valid_lft forever preferred_lft forever
    然后在路由的网络命名空间中配置一个DNAT来完成浮动IP和实例IP的一对一映射

[root@node1 ~]# ip netns exec qrouter-636634da-8514-4b6a-9a11-43ddf1cb5682  iptables -t nat -L neutron-l3-agent-OUTPUT -n
Chain neutron-l3-agent-OUTPUT (1 references)
target     prot opt source               destination         
DNAT       all  --  0.0.0.0/0            10.1.0.50            to:172.16.1.33

实例如何获取IP地址

    这里通过分析vxlan1-1实例获取dhcp分配的IP地址过程,来详解实例时如何获取DHCP分配的IP地址的。其他网络类型的实例获取DHCP分配的IP地址流程是一样的。
当创建vxlan1网络之后,会在控制节点node1上创建一个vxlan-1接口,并工作在ens18网卡上。并创建一个桥接网卡和一对虚拟网卡,虚拟网卡一段在物理机上和vxlan-1进行桥接,另一段分配到网络命名空间中,并设置IP地址,然后启动dnsmasq来启动dhcp服务,对实例分配IP地址。

查看控制节点网络情况

    查看vxlan-1工作在ens18网卡上,启动dev ens18表示工作的网卡
[root@node1 ~]# ip -d link show vxlan-1
14: vxlan-1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master brq5415275c-9c state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 82:a3:88:c3:c2:e3 brd ff:ff:ff:ff:ff:ff promiscuity 1 minmtu 68 maxmtu 65535 
    vxlan id 1 group 224.0.0.1 dev ens18 srcport 0 0 dstport 8472 ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx
    vxlan-1和虚拟网卡tap74b9fa42-6a为桥接。

[root@node1 ~]# brctl show brq5415275c-9c
bridge name	bridge id		STP enabled	interfaces
brq5415275c-9c		8000.46ca3d9407da	no		tap5855715d-db
							tap74b9fa42-6a
							vxlan-1
    而虚拟网卡tap74b9fa42-6a的另一段ns-74b9fa42-6a在网络命名空间中,并启动dnsmasq通过该网卡接受实例的dhcp请求。

[root@node1 ~]# ip netns exec qdhcp-5415275c-9c56-4f09-aab3-3eabde4f4eb0 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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-74b9fa42-6a@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    link/ether fa:16:3e:31:14:a6 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.16.1.10/24 brd 172.16.1.255 scope global ns-74b9fa42-6a
       valid_lft forever preferred_lft forever
    inet 169.254.169.254/32 brd 169.254.169.254 scope global ns-74b9fa42-6a
       valid_lft forever preferred_lft forever
    inet6 fe80::a9fe:a9fe/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe31:14a6/64 scope link 
       valid_lft forever preferred_lft forever
    获取工作在网络命名空间中的进程ID,并查看该进程可以看到进程为dnsmasq,OpenStack使用dnsmasq服务为实例提供dhcp服务。

[root@node1 ~]# ip netns  pids qdhcp-5415275c-9c56-4f09-aab3-3eabde4f4eb0 
83979
[root@node1 ~]# ps -ef | grep 83979
dnsmasq    83979       1  0 15:29 ?        00:00:00 dnsmasq --no-hosts --no-resolv --pid-file=/var/lib/neutron/dhcp/5415275c-9c56-4f09-aab3-3eabde4f4eb0/pid --dhcp-hostsfile=/var/lib/neutron/dhcp/5415275c-9c56-4f09-aab3-3eabde4f4eb0/host --addn-hosts=/var/lib/neutron/dhcp/5415275c-9c56-4f09-aab3-3eabde4f4eb0/addn_hosts --dhcp-optsfile=/var/lib/neutron/dhcp/5415275c-9c56-4f09-aab3-3eabde4f4eb0/opts --dhcp-leasefile=/var/lib/neutron/dhcp/5415275c-9c56-4f09-aab3-3eabde4f4eb0/leases --dhcp-match=set:ipxe,175 --dhcp-userclass=set:ipxe6,iPXE --local-service --bind-dynamic --dhcp-range=set:subnet-b7cf01d1-1331-4d1b-a86a-00e58a0f3c3a,172.16.1.0,static,255.255.255.0,86400s --dhcp-option-force=option:mtu,1450 --dhcp-lease-max=256 --conf-file=/dev/null --domain=openstacklocal
root       87373   84789  0 16:17 pts/0    00:00:00 grep --color=auto 83979
    查看dnsmasq的主机信息,可以看到对外提供指定主机dhcp信息,这个和实例的配置信息是一直的。172.16.1.33为实例vxlan1-1的IP地址

[root@node1 ~]# cat /var/lib/neutron/dhcp/5415275c-9c56-4f09-aab3-3eabde4f4eb0/host
fa:16:3e:de:6e:86,host-172-16-1-33.openstacklocal,172.16.1.33
fa:16:3e:dd:e1:a2,host-172-16-1-1.openstacklocal,172.16.1.1
fa:16:3e:74:ad:39,host-172-16-1-17.openstacklocal,172.16.1.17
[root@node1 ~]# openstack server list
+--------------------------------------+----------+--------+-------------------------------+--------------------------+---------+
| ID                                   | Name     | Status | Networks                      | Image                    | Flavor  |
+--------------------------------------+----------+--------+-------------------------------+--------------------------+---------+
| c3bc87b0-49cb-42c3-ac34-5a73b7222daa | vxlan2-1 | ACTIVE | vxlan2=172.16.2.19            | N/A (booted from volume) | m1.nano |
| dc828568-f60c-4259-898c-8c43d5c1fe64 | vxlan1-2 | ACTIVE | vxlan1=172.16.1.17            | N/A (booted from volume) | m1.nano |
| fdb2c8a0-4ed4-4842-ac5b-40aa9b6afb48 | vxlan1-1 | ACTIVE | vxlan1=172.16.1.33, 10.1.0.50 | N/A (booted from volume) | m1.nano |
+--------------------------------------+----------+--------+-------------------------------+--------------------------+---------+

查看计算节点网络情况

    查看node4网络的vxlan-1工作在ens18,同控制节点一致

[root@node4 ~]# ip -d link show vxlan-1
16: vxlan-1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master brq5415275c-9c state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 06:bc:46:f0:8e:d9 brd ff:ff:ff:ff:ff:ff promiscuity 1 minmtu 68 maxmtu 65535 
    vxlan id 1 local 192.168.31.104 dev ens18 srcport 0 0 dstport 8472 ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx
    vxlan-1和虚拟网卡tap145db8f2-ce为桥接,而tap145db8f2-ce的另一端在实例中,此时实例就可以获取dhcp分配的IP地址

[root@node4 ~]# brctl show  brq5415275c-9c
bridge name	bridge id		STP enabled	interfaces
brq5415275c-9c		8000.06bc46f08ed9	no		tap145db8f2-ce
							vxlan-1
    而OpenStack为了更加的安全,配置了相关的iptables规则。关闭网络的dhcp并启用外部的dhcp服务器,可以获取到IP地址,但是因为有相关的iptables规则导致无法和外部通信。

[root@node4 ~]# iptables -nv -L neutron-linuxbri-i145db8f2-c
Chain neutron-linuxbri-i145db8f2-c (1 references)
 pkts bytes target     prot opt in     out     source               destination         
 1298  118K RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED /* Direct packets associated with a known session to the RETURN chain. */
    2   730 RETURN     udp  --  *      *       0.0.0.0/0            172.16.1.33          udp spt:67 dpt:68  
    0     0 RETURN     udp  --  *      *       0.0.0.0/0            255.255.255.255      udp spt:67 dpt:68
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set NIPv49612db0d-b44e-4eba-9e8e- src
    5   300 RETURN     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
    1    84 RETURN     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            state INVALID /* Drop packets that appear related to an existing connection (e.g. TCP ACK/FIN) but do not have an entry in conntrack. */
    2   658 neutron-linuxbri-sg-fallback  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* Send unmatched traffic to the fallback chain. */
    
Chain neutron-linuxbri-o145db8f2-c (2 references)
target     prot opt source               destination         
RETURN     udp  --  0.0.0.0              255.255.255.255      udp spt:68 dpt:67 /* Allow DHCP client traffic. */
neutron-linuxbri-s145db8f2-c  all  --  0.0.0.0/0            0.0.0.0/0           
RETURN     udp  --  0.0.0.0/0            0.0.0.0/0            udp spt:68 dpt:67 /* Allow DHCP client traffic. */
DROP       udp  --  0.0.0.0/0            0.0.0.0/0            udp spt:67 dpt:68 /* Prevent DHCP Spoofing by VM. */     
RETURN     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED /* Direct packets associated with a known session to the RETURN chain. */
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
DROP       all  --  0.0.0.0/0            0.0.0.0/0            state INVALID /* Drop packets that appear related to an existing connection (e.g. TCP ACK/FIN) but do not
 have an entry in conntrack. */
neutron-linuxbri-sg-fallback  all  --  0.0.0.0/0            0.0.0.0/0            /* Send unmatched traffic to the fallback chain. */
# 这里限制了ip和网卡mac地址,只是无法访问,但是实例是可以获取到dhcp分配的网络IP地址
[root@node4 ~]# iptables -nv -L neutron-linuxbri-s145db8f2-c
Chain neutron-linuxbri-s145db8f2-c (1 references)
 pkts bytes target     prot opt in     out     source               destination         
 1876  164K RETURN     all  --  *      *       172.16.1.33          0.0.0.0/0            MAC FA:16:3E:DE:6E:86 /* Allow traffic from defined IP/MAC pairs. */
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* Drop traffic without an IP/MAC allow rule. */
    同时在ebtable中的nat链中限制了网络的arp信息

ebtable -L -t nat

 

 

 

 

 

 

 

 

posted @ 2022-03-29 18:56  喝杯茶  阅读(759)  评论(0编辑  收藏  举报