netvirt-浮动ip之流表实现分析

1.基于iptables的浮动ip实现

openstack社区基于iptables规则来实现浮动ip功能,通过在相关路由命名空间中添加iptable规则对进出的包做NAT转换。当外网访问绑定浮动ip的虚机时,目的IP地址为虚机的浮动IP地址,因此必须配置iptables规则将其转化为虚拟机的私有固定IP地址,然后再将它路由到虚机;虚拟机回包的时候,也需要配置iptables规则将虚拟机的私有固定ip地址转化为浮动ip地址,然后路由回去。实现浮动ip功能的iptables规则主要设置在iptables nat表中。

下面是某个路由命名空间中的iptable规则:

root@ubuntu:~# ip netns exec qrouter-05bf6a27-5901-4c67-bfef-89bde3d2bc67 iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT                 #以上为默认的链规则
-N neutron-postrouting-bottom
-N neutron-vpn-agen-OUTPUT
-N neutron-vpn-agen-POSTROUTING
-N neutron-vpn-agen-PREROUTING
-N neutron-vpn-agen-float-snat
-N neutron-vpn-agen-snat             #以上为neutron增加的chain
-A PREROUTING -j neutron-vpn-agen-PREROUTING
-A OUTPUT -j neutron-vpn-agen-OUTPUT
-A POSTROUTING -j neutron-vpn-agen-POSTROUTING
-A POSTROUTING -j neutron-postrouting-bottom
-A neutron-postrouting-bottom -m comment --comment "Perform source NAT on outgoing traffic." -j neutron-vpn-agen-snat
-A neutron-vpn-agen-OUTPUT -d 192.168.30.34/32 -j DNAT --to-destination 192.168.10.7                #本机访问浮动IP(192.168.30.34)修改为固定IP(192.168.10.7)
-A neutron-vpn-agen-POSTROUTING -s 192.168.10.0/24 -d 192.168.20.0/24 -m policy --dir out --pol ipsec -j ACCEPT
-A neutron-vpn-agen-POSTROUTING ! -i qg-084adea8-05 ! -o qg-084adea8-05 -m conntrack ! --ctstate DNAT -j ACCEPT
-A neutron-vpn-agen-PREROUTING -d 192.168.30.34/32 -j DNAT --to-destination 192.168.10.7           #外部访问浮动IP的traffic的目的IP转换成虚机的固定IP
-A neutron-vpn-agen-PREROUTING -d 169.254.169.254/32 -i qr-+ -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9697
-A neutron-vpn-agen-float-snat -s 192.168.10.7/32 -j SNAT --to-source 192.168.30.34                #绑定浮动IP后,虚拟机出去的包做SNAT,转换为浮动ip    
-A neutron-vpn-agen-snat -j neutron-vpn-agen-float-snat
-A neutron-vpn-agen-snat -o qg-084adea8-05 -j SNAT --to-source 192.168.30.29
-A neutron-vpn-agen-snat -m mark ! --mark 0x2/0xffff -m conntrack --ctstate DNAT -j SNAT --to-source 192.168.30.29
root@ubuntu:~# 

由上可见:每个浮动ip ,增加如下三个规则

-A neutron-vpn-agent-PREROUTING -d <floatingip> -j DNAT --to-destination <fixedip> 
#从别的机器上访问虚机,DST IP 由浮动IP改为固定IP 
-A neutron-vpn-agent-OUTPUT -d <floatingip> -j DNAT --to <fixedip>                 
#从本机访问虚机,Dst IP 由浮动IP该为访问固定IP
-A neutron-vpn-agent-float-snat -s <fixedip> -j SNAT --to <floatingip>
#虚机访问外网,将Src IP 由固定IP改为浮动IP

这里可以看到当设置了浮动IP以后,SNAT不在使用External Gateway的IP,而是使用浮动IP。虽然entires依然存在,但是因为链neutron-vpn-agent-float-snat 比 neutron-vpn-agent-snat靠前而优先得到执行。

2.基于流表实现浮动ip

本文档分析opendaylight netvirt采用纯流表实现浮动ip功能,netvirt三层路由实现采用DVR模式,东西向流量在计算节点通过流表路由转发,南北向流量也直接从计算节点发出。所有流表规则仅仅配置在运行有虚拟机的计算节点上,这样基于纯流表转发可以实现更高的转发性能。其采用流表实现浮动ip的功能.

2.1 openstack与odl对接环境搭建

2.1.1.对接环境信息

本次对接版本信息如下

openstack:mitaka controller(1)+copute(2)+ network(2)

opendaylight:boron-sr1

networking-Odl:mitaka

对接文档可以参考如下:

http://www.sdnlab.com/19336.html

http://www.sdnlab.com/18099.html

本文档主要探求odl三层网络功能,3层路由功能不再由L3-agent提供,采用odl netvirt提供三层网络功能。这需要在控制节点上neutron.conf修改service_plugins,同时sdn控制器中安装netvirt的feature。原有openstack环境网络节点上最终只存在dhcp-agent,metadata-agent。

修改为service_plugins = odl-router

控制器中安装的feature

feature:install odl-netvirt-openstack odl-dlux-core

2.1.2 外网配置

odl和openstack环境对接成功后,每个节点会自动生成br-int网桥,这里将生成的br-int既作为集成网桥,又作为外部网桥,然后绑定外部网卡用于虚拟机外部网络出口

配置如下:

ovs-vsctl add-port br-int eth2

ovs-vsctl set Open_vSwitch eba4b3eb-c957-402a-b0d0-8931567b18eb other_config:provider_mappings=external:eth2

这里eth2为外网网卡,external为flat映射的物理网络名称。最后eth2作为br-int的端口后,需要将eth2的外网ip配置到br-int网桥上

参考配置脚本如下:

计算节点:


rm -rf /etc/openvswitch/conf.db
service openvswitch-switch restart

sdn_controller=192.168.26.6
db_id=`ovs-vsctl show | awk 'NR==1{print}'`
local_ip='192.168.10.22'
external_bridge=br-int
external_nic=eth2
provider_mappings=external:$external_nic

ovs-vsctl set-manager tcp:$sdn_controller:6640
sleep 3
ovs-vsctl set Open_vSwitch $db_id other_config={
  'local_ip'=$local_ip}
ovs-vsctl add-port $external_bridge $external_nic
ovs-vsctl set Open_vSwitch $db_id other_config:provider_mappings=$provider_mappings

如果配置了控制器集群,连接如下:
ovs-vsctl set-manager tcp:{192.168.26.6,192.168.26.5,192.168.26.4}:6640

网络节点:

原有网络节点不需要添加外部网卡,虚拟机外部流量直接从计算节点出去。
这里网络节点只提供dhcp,metadata服务。


rm -rf /etc/openvswitch/conf.db
service openvswitch-switch restart

sdn_controller=192.168.26.6
db_id=`ovs-vsctl show | awk 'NR==1{print}'`
local_ip='192.168.10.23'
external_bridge=br-int
external_nic=eth2
provider_mappings=external:$external_nic

ovs-vsctl set-manager tcp:$sdn_controller:6640
sleep 3
ovs-vsctl set Open_vSwitch $db_id other_config={
  'local_ip'=$local_ip}

2.2 组网拓扑图

对接成功后,创建网络,虚拟机,创建路由,路由连接到flat类型的外网,虚拟机绑定floatingip后,可以

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值