作者:张华 发表于:2014-08-19
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明
(http://blog.csdn.net/quqi99 )
Neutron中具有DNAT(floating ip)的概念,一个虚机可以绑定一个公网IP,但这比较浪费公网IP吧。那么可以使用基于端口的NAT(NAPT, Network Address and Port Translation)来减少公网IP。
当然,人工添加端口映射也是可以的,不过UPnP提供可以自动完成端口映射的工作。使用UPnP,设备可以动态加入网络,自动获得一个IP地址,向其他设备公布它的能力或者获知其他设备的存在和服务,所有这些过程都是自动完成的,此后设备能够彼此直接通讯。必须同时满足三个条件:1, NAT网关设备必须支持UPnP功能;如果Neutron L3-agent要支持它的话方法见附录一。
2, 操作系统必须支持UPnP功能;我们常见的Windows XP是支持UPnP的;
3, 应用软件必须支持UPnP功能;比如BC、电骡eMule、MSN软件都是支持的;如何编写程序参见附录[2]
但UPnP据说有很大的安全问题,如果对网络安全要求较高或要求高可控制性的网络,则不要安装配置UPnP支持,否则会导致网络NAT映射比较混乱,从而引发许多问题。建议小型网络或者家庭网络使用UPnP.
实际上通过下列简单的iptables规则也可以实现NAPT, 缺点是对于一些如SIP协议在协商过程中动态确定后续port的可能预先无法知道这个port并去配置。
ip netns exec qrouter-xxx iptables -t nat -A neutron-l3-agent-PREROUTING -p tcp/udp -d gateway_ip --dport outside_port -j DNAT --to inside_addr:inside_port
ip netns exec qrouter-xxx iptables -t nat -A neutron-l3-agent-snat -p tcp/udp -s inside_addr --sport inside_port -j SNAT --to outside_addr:outside_port
附件一,在Linux上配置UPnP网关
1, 下载下列软件并执行标准三步曲命令安装(./configure && make && sudo make install)
UPnP SDK for Linux, http://sourceforge.net/projects/upnp/
LinuxIGD, http://sourceforge.net/projects/linux-igd/files/linux-igd/linuxigd-1.0/
2, 使用root用户启动UPnP软件网关,实际上基于Linux的硬件路由器上集成的也是它
export LD_LIBRARY_PATH=/usr/local/lib
upnpd <外网接口> <内网接口>
参考:
[1], http://linux.chinaunix.net/docs/2007-01-04/3594.shtml