一套vlan模式的openstack环境,interface_driver使用openvswitch,并在计算节点添加br-ex,用于计算节点虚拟机出外网。linux
一、控制节点网络
a、编辑/etc/neutron/neutron.conf
[DEFAULT]
router_distributed = Trueide
b、重启neutron-server服务学习
二、网络节点测试
a、编辑/etc/neutron/l3_agent.ini
[DEFAULT]
agent_mode = dvr_snatspa
b、编辑
/etc/neutron/plugins/ml2/openvswitch_agent.ini
[agent]
enable_distributed_routing = True3d
c、重启neutron-l3-agent和neutron-openvswitch-agent服务router
三、计算节点server
a、编辑/etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0blog
b、执行命令sysctl –p
c、编辑/etc/neutron/l3_agent.ini
[DEFAULT]
interface_driver=neutron.agent.linux.interface.OVSInterfaceDriver
external_network_bridge =
agent_mode = dvr
d、编辑
/etc/neutron/plugins/ml2/openvswitch_agent.ini
[agent]
enable_distributed_routing = True
e、重启neutron-l3-agent和neutron-openvswitch-agent服务
一、默认状况下,metadata功能经过l3实现,在dvr模式下,若是使用l3实现的话,须要额外配置metadata agent,为了简化,该实验启用dhcp agent来实现metadata功能。
a、在网络节点上编辑/etc/neutron/dhcp_agent.ini
[DEFAULT]
force_metadata = True
b、重启neutron-dhcp-agent服务。
一、建立router,关联到test1网络(网关192.168.1.1),并在test1网络内建立instance(192.168.1.9),网络模型以下:
执行上述操做以后,neutron会在网络节点和计算节点(有instance运行)上都建立一个router的namespace,且配置彻底同样。
也就是说,平台中会出现多个相同的router namespace,那么neutron如何实现虚拟机到网关的流量只到本地的router namespace呢?答案是flow table
二、举个例子:
a、在test1内ping网关(192.168.1.1),虚拟机会先发送arp请求去学习网关的mac地址,arp报文会从qvo-xxx端口进入br-int的table0,匹配arp和in_port,根据流表项,resubmit到table24。
b、在table24中匹配arp、in_port和arp_spa,命中以后,resubmit到table25。
c、在table25中匹配in_port和dl_src,命中以后,resubmit到table60。
d、在table60中,命中table-miss flow entry,根据action执行NORMAL。
e、网关地址是配置在router namespace中的qr-xxx上,而qr-xxx是br-int上的。
端口,因此qr-xxx会收到arp请求,并进行相应,arp相应报文会从qr-xxx端口再次进入br-int table0,命中table-miss flow entry,从而进行NORMAL转发,将报文转发给虚拟机的qvo-xxx。
f、虚拟机学到网关的mac地址以后,将icmp报文经过流表,转发给网关,ping流程完成。
三、如今分析neutron如何经过flow table 实现虚拟机到网关的流量只到本地的router namespace。
在上述的d步骤中,命中table-miss flow entry,根据action执行NORMAL,报文可能经过正常转发,到达br-vlan。
a、报文到达br-vlan后,会进入table=0,匹配in_port,命中后,resubmit到table1
b、在table1中,匹配dl_vlan、arp_tpa(arp报文)或者dl_dst,从而把到网关的报文,所有drop。
c、经过上述流表,保证到达网关的报文所有终结在宿主机本地。
DVR模式下,虚拟机的内网通讯通常有四种场景:同网络同宿主机,同网络不一样宿主机,不一样网络同宿主机,不一样网络不一样宿主机,下面将对这四种场景逐一进行分析:
一、同网络同宿主机,不须要经过router,实验模型以下:
test1和test2运行在同一台宿主上,执行test1 ping test2。
a、test1经过arp学习到test2的mac地址,流表匹配过程和步骤4(DVR到网关流表分析)中arp学习相同,而后封装icmp报文,从qvo-xxx port进入br-int的table0,匹配in_port,命中后,resubmit到table25。
b、在table25中,匹配in_port和dl_src,命中后,resubmit到table60。
c、在table60,命中table-miss,执行NORMAL转发。
d、test2的qvo-yyy port也在br-int上,报文经过qvo-yyy发送到test2,test2回包给test流程和test1到test2相同。ping流程结束。
二、同网络不一样宿主机,不须要router,实验模型以下:
test1和test2运行在不一样宿主上,执行test1 ping test2。
此场景下,步骤a,b,c和同网络同宿主机场景步骤彻底相同,报文会在br-int的table60执行NORMAL,此处再也不赘述。
d、执行NORMAL后,报文会从phy-br-vlan port进入br-vlan的table0,匹配in_port,命中后,resubmit到table1。
e、在table1中,命中table-miss,resubmit table2。
f、在table2中,匹配in_port和dl_vlan,命中后,修改local vlan 1为全局vlan 196,而后执行NORMAL,此时报文会离开宿主机,从业务口发出去。
g、报文会被送到运行test2的宿主机业务口,而后进入br-vlan的table0,命中后,resubmit到table3。
h、在table3中,命中后,执行NORMAL,报文被送到br-int。
i、在br-int的table0中,匹配in_port和dl_vlan,命中后,修改全局vlan 196 为local vlan 1,而后执行NORMAL,报文会从qvo-yyy进入虚拟机test2。
j、test2回包和test1发包过程相同,至此,ping操做完成。
三、不一样网络同宿主机,须要router,实验模型以下:
建立router分别链接两个网络,每一个网络上个各建立一台instance,执行上述操做以后,neutron会在网络节点和计算节点(有instance运行)上都建立一个router的namespace,且配置彻底同样,qr-设备会被配置上对应网关ip地址。
test1和test2运行在同宿主上,执行test1 ping test2。
a、test1 经过计算知道要到达test2须要走三层,它会先发arp请求,学习网关的mac地址,而后封装icmp报文(目的ip是test2的ip,目的mac是网关的mac地址),经过默认路由,将报文送到本地的router namespace。
(学习网关过程当中匹配流表的过程请参考 <四、DVR到网关流表分析>章节)。
b、报文从qr-test1进入router的PREROUTING链,而后查找到test2的路由,命中以后,进入POSTROUTING链,并从qr-test2从新进入br-int的table0。
c、在table0中,命中table-miss,resubmit到table60。
d、在table60中,命中后,执行NORMAL,将报文从qvo-xxx送到test2。
e、test2回包的过程和test1发包过程相同,至此,ping操做完成。
四、不一样网络不一样宿主机,须要router,实验模型以下:
test1和test2运行在不一样宿主上,执行test1 ping test2。
此场景下,步骤a,b,c和不一样网络同宿主机场景步骤彻底相同,
报文从qr-test2出来以后,在br-int的table60执行NORMAL,此处再也不赘述。
d、在c中执行NORMAL以后,报文经过int-br-vlan port进入br-vlan的table0。
e、在table0中,匹配in_port,命中以后,resubmit到table1。
f、在table1中,匹配dl_vlan和dl_src,命中以后,修改源mac地址为neutron分配给宿主机mac,resubmit到table2。
注:开启DVR以后,neutron会给每一个compute节点分配一个惟一的mac地址,避免物理交换机出现mac地址冲突的问题。
g、在table2中,匹配in_port和dl_vlan,命中以后,修改local vlan 2为全局
vlan 148,执行NORMAL,此时报文会从业务口eth1离开宿主机。
h、报文会进入运行test2的宿主机的业务口eth1进入br-vlan的table0。
i、在table0中,命中以后,resubmit到table3。
j、在table3中,匹配dl_src(neutron分配给宿主机的mac),将报文从phy-br-vlan送出给br-int table0。
k、在br-int的table0中,匹配in_port和dl_src(neturon分配给宿主机的mac),resubmit给table2。
l、在table2中,匹配dl_vlan和dl_dst,修改源mac为test2网关的mac,resubmit到table60。
m、在table60中,匹配dl_vlan和dl_dst ,剥去vlan,经过output将报文直接送到test2。
n、test2回包的过程和test1发包过程相同,至此,ping操做完成。
一、建立一个router,并绑定内部网络test1,设置路由器的网关外网为external,在内网,外网上各建立一台虚拟机,用于测试,实验模型以下:
执行上述操做以后,neutron会在网络节点建立三个namespace:qrouter-xxx、fip-yyy、snat-xxx。
计算节点(instance运行)建立qrouter-xxx、fip-yyy。
ps:各节点的namespace会在接下来的分析中说明其做用。
二、虚拟机test1的报文被送到本宿主机router namespace的qr-xxx设备上(上述已经说明,此处再也不赘述),进入PREROUTING链(未命中,不作任何修改),查看策略路由,使用默认路由准备进行转发,而后进入POSTROUTING链(未命中),报文从qr-xxx发出,送往192.168.1.11进行处理(流表所有命中NORMAL)。
三、可能有人会有疑问,这里的192.168.1.11是啥?
事实上这个ip地址是neutron分配给snap-yyy namespace的一个ip,被配置在sg-zzz上,snap-yyy namespace在网络节点上,neutron经过策略路由和sg-zzz port将计算节点router namespace中的报文,转发到网络节点的snat-yyy中。
四、此时报文到达网络节点的snat-yyy namespace中的sg-zzz port上,在路由以前报文会进入PREROUTING链(未命中),而后查找路由。
随后进入POSTROUTING链,进行snat,并作链接跟踪,以后报文进行转发。
五、通过上述操做,虚拟机经过snat-yyy中的qg-设备出外网,经过链接跟踪返回(流表命中NORMAL)。
一、在章节6的基础上,从外网分配一个floating ip(10.100.0.7),并关联到虚拟机test1(192.168.1.9)上,并须要自行配置br-ex,用于虚拟机出外网,实验模型以下:
执行上述操做以后,neutron会在对应的namespace里面添加若干策略,下面的分析中会逐一说明:
一、虚拟机test1的报文被送到本宿主机router namespace的qr-xxx设备上(上述已经说明,此处再也不赘述),进入PREROUTING链(未命中,不作任何修改),查看策略路由。
经过策略路由,将报文经过rfp-6347c62b-2转发给169.254.109.47处理,随后进入POSTROUTING链,作snat修改。
二、到这里,你们可能会有一个疑问,这个rfp-6347c62b-2设备是啥?
事实上这个是veth pair的一端,它的另外一端在fip-xxx namespace里面
neutron 使用这对veth pair,将报文从router的namespace里面,经过策略路由,转发到fip-yyy的namespace里。
三、至此,报文到达fip-yyy namespace,进入PREROUTING链(未命中),查看路由。
再进入POSTROUTING链(未命中),从而将报文从fg-7ec56cee-b5设备转发到外网。
四、至此,报文顺利从fg port发送到外网(流表命中NORMAL)。
五、如今开始分析外网设备经过floating ip进入虚拟机的状况。
假设存在一台外网设备external(10.100.0.14)去ping floating ip(10.100.0.7),外网设备首先会经过arp学习10.100.0.7的mac地址,而上述描述中,neutron并无配置10.100.0.7的ip地址在任何设备上,也就是说,10.100.0.7并不存在,那报文是如何准确的送到fg口的呢?
事实上,neutron在fg port上开启了arp_haproxy功能,至关于进行了arp欺骗,这样,外网设备就将fg的mac地址学习成10.100.0.7的mac,并更新到本身的mac表中。
六、外网报文到达fg口以后,进入PREROUTING链(未命中),查看route表,准备将目的ip为floating ip的报文从fpr-6347c62b-2发送169.254.109.46。
随后进入POSTROUTING链(未命中),报文转发到router的namespace中。
七、报文到达router的namespace中的rfp-6347c62b-2设备,进入PREROUTING链,进行dnat操做。将目的ip从floating ip转换成内部fix ip(192.168.1.9)
随后查看route,准备将报文从qr-xxx port转发。
而后进入POSTROUTING链(未命中),将报文从qr- port转发到虚拟机test1。
八、至此,实现外网设备到内部ip的转发完成。