在Neutron中通过 floating IP 功能实现公网IP到内网IP的一对一映射,其实质上就是NAT,In做DNAT,Out做SNAT(从虚机的角度)。
-A neutron-l3-agent-PREROUTING -d 120.197.94.83/32 -j DNAT --to-destination 10.13.42.179
-A neutron-l3-agent-float-snat -s 10.13.42.179/32 -j SNAT --to-source 120.197.94.83
这与LVS的NAT模式原理一致,都需要在虚拟机(对应LVS的real server)的默认路由指向NAT网关,在Neutron中就是虚拟Router上连接private network的interface。这就造成一个问题,我要是没有那么多的公网IP怎么办?同时Neutron的vRouter在DVR(分布式路由器)没成熟之前可扩展性、可用性也是一个大难题。
最直接的想法就是端口转发。
最简单的办法就是直接用Neutron的LB服务,然后当成端口转发来用,虽然很别扭。现在开源可选的还是Haproxy。
另外一种就是直接在Neutron L3层的vRouter的基础上增加端口转发功能(如ustack就是这么干的),这种方式的实现还是会受到现有vRouter的架构的一些约束,比如扩展性,可用性。
为了性能和扩展性,我们选择了(Fullnat模式)LVS+OSPF。需要做的事就是:
1)集成LVS到Neutron的网络中。
2)解决客户网络地址不透明的问题(这是FullNAT的原因)
关于问题1)管理面的东西好说,关键是在基于VXLAN或者GRE的隧道技术的时候需要加、解协议头。
关于问题2)对于虚拟机系统是Linux系统都好办,打个TOA patch(hook getname() 获取client addr)。要是遇到Windows怎么办,暂时还在想办法。