`
cloudtech
  • 浏览: 4721375 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Nova-network中发现的一个SNAT问题

 
阅读更多

网络环境

网络设置采用的是单网络节点、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

北方工业大学 | 云计算研究中心 | 姜永

分享到:
评论

相关推荐

    maoxuepeng#b-digest#2017-10-27-华为云配置SNAT使得没有弹性IP的虚拟机可以访问Internet

    有另外一种解决方案:SNAT,原理是选择一台有弹性IP的虚拟机,通过IPTables的SNAT能力,把此虚拟机配置为一台路由器,其他没有弹性IP的虚拟机,通过配

    SNAT网关Lvs-snat.zip

    基于阿里 lvs-v2 开发的SNAT网关,类似 iptables SNAT 功能,性能非常好,性能相对iptables提升80%以上。 特性: 支持源ip、目的ip、出口网卡、下一跳网关匹配,规则优先级匹配按照网络地址掩码位数由大到小 ...

    openstack网络详解.docx

    尽管Neutron提供了更高级的网络功能,但在某些场景下,使用nova-network仍然是一个可行且简化的选择。 1. **Flat模式和FlatDHCP模式** - **Flat模式**:在Flat模式下,所有虚拟机共享同一二层网络,这意味着它们都...

    基于Linux操作系统的SNAT策略.pdf

    "基于Linux操作系统的SNAT策略.pdf" ...本文档为企业解决IP地址资源匮乏问题提供了一种有效的解决方案,即基于Linux操作系统的SNAT策略。该策略可以解决企业面临的IP地址资源匮乏问题,提高网络的可扩展性和可靠性。

    snat.rar_JIRZ_SNAT实现方法_VQW_vpp feature snat

    3. **动态地址分配**:当内部用户发起对外连接时,SNAT设备会从公网IP地址池中选择一个未使用的地址,并将其映射到私有IP地址。 4. **端口映射**:除了IP地址转换,SNAT还可能涉及端口映射,以避免公网IP地址上的...

    搭建SNAT

    在企业或组织网络中,当内部网络的设备想要访问外部网络(比如互联网)时,SNAT允许这些设备共享一个或多个公共IP地址,从而解决了公网IP地址不足的问题。 SNAT的基本工作原理是,它会将内部网络设备的私有IP地址...

    VMware之SNAT与DNAT.docx

    SNAT 主要用于解决多台内部网络设备共享一个公共 IP 地址访问外部网络的问题。在企业环境中,由于公网 IP 地址资源有限,通常会配置一个或多个公网 IP 给内部网络的网关服务器。当内部网络(例如 192.168.10.0/24 ...

    Linux防火墙配置SNAT教程(2)

    1、实验目标   以实验“Linux防火墙配置-SNAT1”为基础,为网关增加外网IP地址,为eth1创建...[root@lyy 桌面]# gedit /etc/sysconfig/network-scripts/ifcfg-eth1 //打开网卡一 1)修改网卡名称和IP,然后点击

    docker-network-tools:Docker网络工具。 支持浮动IP,网络名称空间同步,OVS和linux网桥

    因为,它甚至可以在CoreOS中运行。 一些基于Docker的操作系统不支持python或其他工具。 因此,我必须使用bash。 用法 要求所有脚本具有root权限。 因为脚本正在处理iptables,docker进程和linux内核名称空间。 ...

    Network Associates Guide To Communications Protocols.pdf .pdf

    X.500则是一个定义目录服务的国际标准,用于管理网络中的目录信息。 网络协议的多样性和复杂性确保了数据的正确传输、网络的高效管理以及不同系统和应用程序间的互操作性。掌握这些网络协议的知识对于网络工程师和...

    F5配置SNAT实例[收集].pdf

    F5配置SNAT实例[收集].pdf

    netfilter 五个钩子点实现SNAT和DNAT的方案

    标题中的“netfilter 五个钩子点实现SNAT和DNAT的方案”指的是在Linux内核的网络包过滤框架netfilter中,通过五个不同的钩子点来实现源网络地址转换(Source Network Address Translation, SNAT)和目的网络地址转换...

    NetworkProtocol

    本资料提供了一个详细的网络协议结构图,有助于深入理解网络协议的工作原理。 #### OSI模型与TCP/IP模型对比 在讨论具体的网络协议之前,我们需要了解两种主要的网络模型:OSI七层模型与TCP/IP四层模型。 - **OSI...

    Linux双网卡搭建NAT服务器.pdf

    Linux 双网卡搭建 NAT 服务器是指使用 Linux 操作系统和双网卡来搭建一个 NAT 服务器,实现内网主机访问外网的功能。下面是相关知识点的解释: 一、IP 地址配置 在 Linux 主机上,eth0 网卡的 IP 地址、网关和 DNS...

    SNAT的搭建

    详见阐述了SNAT搭建的实验步骤,每一步都有截图,详情见Word

    关于VS,Profile,iRules,Profile,Pool和SNAT解释

    #### 五、SNAT (Source Network Address Translation) **定义与功能** - **定义**:SNAT 用于在数据包离开 BIG-IP 设备之前执行源地址转换。 - **功能**: - 根据预设策略修改数据包的源 IP 地址。 - 支持基于源 ...

    snat-race-conn-test:一小段代码,用于触发Linux的SNAT中的竞争条件

    短跑比赛测试 nf_conntrack代码用于触发SNAT竞争条件,并因此导致nf_conntrack插入失败。 建造 $ dep ensure $ go build

    配置案例_源地址转换SNAT

    配置案例_源地址转换SNAT 配置案例_源地址转换SNAT 配置案例_源地址转换SNAT 配置案例_源地址转换SNAT

Global site tag (gtag.js) - Google Analytics