网络环境
网络设置采用的是单网络节点、flatDHCP,br100(ip:10.61.2.12)桥接到eth0作为flat interface,fixed_range=10.0.0.0/24,eth1(ip:10.61.5.1)作为public interface, floating_range=10.61.5.128/25,另有eth3(ip:10.17.20.254)连接到网络10.17.20.0/22(该网络中的机器有以下命令添加有永久路由保证对floating ip 的访问: route -p add 10.61.0.0
mask 255.255.0.0 10.17.20.254)
问题
1.实例间无法通过floating ip进行ssh登录而通过fixed ip是可以的。
2.网段10.17.20.0/22的机器可能通过floating ip ping通实例,反之则不通。
原因
flatDHCP模式下,实例通过DHCP从网络节点获取fixed ip,网络节点根据DHCP服务配置的MAC-IP对为实例分配fixed ip,至于floating ip网络节点通过iptables的DNAT和SNAT 实现floating ip与fixed ip的关联,可以说实例对于floating ip是完全不知情的。通过查看网络节点的iptables规则,发现SNAT的规则中指定了出去的接口为配置文件的 public_interface值,形如:-A nova-network-float-snat
-s 10.0.0.6/32 -o eth1 -j SNAT --to-source 10.61.5.144;而DNAT是没有指定接口的。这样原因就清楚了。
问题一解释:以实例A(fixed_ip:10.0.0.6,floating_ip:10.61.5.144) ssh登录实例B(fixed_ip:10.0.0.18,floating_ip:10.61.5.153)为例,A发往B的包(sip:10.0.0.6,dip:10.61.5.153) 从br100进行网络节点通过DNAT变为(sip:10.0.0.6,dip:10.0.0.18)然后由br100转发给B,注意这里出口为br100故不进行SNAT,B收到请求后回包(sip:10.0.0.18,dip:10.0.0.6),
因为源地址和目的地址在同一网段,该包将直接发往A而不会经过网络节点,A收到回应后发现地址不对期望收到的包应该是(sip:10.61.5.153,dip:10.0.0.6)拒收,连接失败。
问题二解释:以刚才的实例A与C(ip:10.17.21.121)互ping为例。C ping A的包(sip:10.17.21.121,dip:10.61.5.144)从eth3进入网络节点经过DNAT变为(sip:10.17.21.121,dip:10.0.0.6) 经br100转发给A,A回应包(sip:10.0.0.6,dip:10.17.21.121)经br100进入网络节点作为前面DNAT的相关包进行逆转化为(sip:10.61.5.144,dip:10.17.21.121)然后经eth3发往C,ping成功。
现在反过来A ping C的包(sip:10.0.0.6,dip:10.17.21.121)从br100进入网络节点经eth3转发给C注意这里的出口为eth3不是eth1所以不会有SNAT。C收到后回应包(sip:10.17.21.121,dip:10.0.0.6) 但是C没有到10.0.0.6的正确路由,ping失败。
解决办法
有效的解决办法是去掉SNAT规则中对出口的限制这需要修改源代码,暂时我通过iptables-save各iptables-restore来实现这个功能,不过这样的话每次nova-network重启后创建新的实例都要重新运行这个命令, 命令为:
iptables-save | sed 's/-o eth1 //g' | iptables-restore
总结
这两个问题是由多网卡及SNAT规则综合导致的,如果是单网卡则两个问题都不会有,如果采用双网卡则会出现第一个问题,第二个问题主要是由于我这里网络的复杂性造成的,没有普遍性。
补充
刚看了下源代码 nova/network/linux_net.py,在Essex版中添加floating ip iptables转发规则的函数如下:
def floating_forward_rules(floating_ip, fixed_ip):
return [('PREROUTING', '-d %s -j DNAT --to %s' % (floating_ip, fixed_ip)),
('OUTPUT', '-d %s -j DNAT --to %s' % (floating_ip, fixed_ip)),
('float-snat',
'-s %s -j SNAT --to %s' % (fixed_ip, floating_ip))]
Folsom版中函数如下:
def floating_forward_rules(floating_ip, fixed_ip, device):
rule = '-s %s -j SNAT --to %s' % (fixed_ip, floating_ip)
if device:
rule += ' -o %s' % device
return [('PREROUTING', '-d %s -j DNAT --to %s' % (floating_ip, fixed_ip)),
('OUTPUT', '-d %s -j DNAT --to %s' % (floating_ip, fixed_ip)),
('float-snat', rule)]
可见SNAT规则中的出口参数是在F版中新添加的,并引起了我所遇到的两个问题,那为什么做这样的改动呢???git log
北方工业大学 |
云计算研究中心 | 姜永
分享到:
相关推荐
有另外一种解决方案:SNAT,原理是选择一台有弹性IP的虚拟机,通过IPTables的SNAT能力,把此虚拟机配置为一台路由器,其他没有弹性IP的虚拟机,通过配
基于阿里 lvs-v2 开发的SNAT网关,类似 iptables SNAT 功能,性能非常好,性能相对iptables提升80%以上。 特性: 支持源ip、目的ip、出口网卡、下一跳网关匹配,规则优先级匹配按照网络地址掩码位数由大到小 ...
SNAT搭建过程 !
1、实验目标 以实验“Linux防火墙配置-SNAT1”为基础,为网关增加外网IP地址,为eth1创建...[root@lyy 桌面]# gedit /etc/sysconfig/network-scripts/ifcfg-eth1 //打开网卡一 1)修改网卡名称和IP,然后点击
F5配置SNAT实例[收集].pdf
VMware之SNAT与DNAT
因为,它甚至可以在CoreOS中运行。 一些基于Docker的操作系统不支持python或其他工具。 因此,我必须使用bash。 用法 要求所有脚本具有root权限。 因为脚本正在处理iptables,docker进程和linux内核名称空间。 ...
xxxxxxxxxxxxxxxxxxxxxxxIPtables中SNAT和MASQUERADE的区别
基于Linux操作系统的SNAT策略.pdf
详见阐述了SNAT搭建的实验步骤,每一步都有截图,详情见Word
SNAT实现方法output_feature_interfaces
短跑比赛测试 nf_conntrack代码用于触发SNAT竞争条件,并因此导致nf_conntrack插入失败。 建造 $ dep ensure $ go build
配置案例_源地址转换SNAT 配置案例_源地址转换SNAT 配置案例_源地址转换SNAT 配置案例_源地址转换SNAT
iptables、SNAT和DNAT实验
关于拿linux系统当路由器做NAT用的。
1、实验目标 以实验“防火墙配置-访问外网WEB”为基础,在WEB... 源地址转换,其作用是将ip数据包的源地址转换成另外一个地址,俗称IP地址欺骗或伪装 内部地址要访问公网上的服务时(如web访问),内部地址会
F5配置SNAT实例.pdf
采用PCR方法扩增得到SNAT2氨基端75个氨基酸的编码序列,构建重组质粒pET28a - SNAT2 - 75aa,并将其转入大肠杆菌BL21( DE3)中,通过IPTG诱导表达重组蛋白.利用组氨酸标签蛋白经镍柱亲和纯化后得到了纯度在95%以上的SNAT...
ISA 2006是一款企业级路由防火墙,它分为标准版和企业版,标准版部署简单,适用于中小企业使用。企业版引入了配置存储服务器,适用于大型企业。 ISA 的代理服务支持三种客户端:WEB 代理客户端;防火墙客户端;SNAT...