为什么Openstack VM无法通过浮动IP访问?

我build立了一个OpenStack Folsom(2012.2)多节点单networking基础架构。 一切运行正常,任何计算节点上的实例运行良好,私有networking就像一个魅力,所有实例都可以通过外部的浮动IP访问,并可以到达外部。

但是,当试图通过它的浮动IP执行从虚拟机到自己的networking请求时,它会失败。

ping和ssh都没有工作。

安全组全部打开。

Ping通过浮动IP从一个VM工作到另一个,但SSH

一些例子的数据

  • 10.0.0.0/24是专用networking
  • 10.0.0.1是控制器
  • 10.1.100.0/24是浮动IPnetworking
  • 具有10.0.0.13的VM具有浮动IP 10.1.100.4

控制器上的iptables条目(关于10.1.100.4/10.0.0.13)(包括networking在内的所有服务):

-A nova-network-2.7-OUTPUT -d 10.1.100.4/32 -j DNAT --to-destination 10.0.0.13 -A nova-network-2.7-PREROUTING -d 10.1.100.4/32 -j DNAT --to-destination 10.0.0.13 -A nova-network-2.7-float-snat -s 10.0.0.13/32 -o eth0 -j SNAT --to-source 10.1.100.4 

计算节点上的iptables条目:

关于10.1.100.4/10.0.0.13:

 -A nova-compute-2.7-local -d 10.0.0.13/32 -j nova-compute-2.7-inst-143 

关于nova-compute-2.7-inst-143:

 -N nova-compute-2.7-inst-143 -A nova-compute-2.7-inst-143 -m state --state INVALID -j DROP -A nova-compute-2.7-inst-143 -m state --state RELATED,ESTABLISHED -j ACCEPT -A nova-compute-2.7-inst-143 -j nova-compute-2.7-provider -A nova-compute-2.7-inst-143 -s 10.0.0.1/32 -p udp -m udp --sport 67 --dport 68 -j ACCEPT -A nova-compute-2.7-inst-143 -s 10.0.0.0/24 -j ACCEPT -A nova-compute-2.7-inst-143 -p tcp -m tcp --dport 22 -j ACCEPT -A nova-compute-2.7-inst-143 -p tcp -m tcp --dport 3389 -j ACCEPT -A nova-compute-2.7-inst-143 -p tcp -m multiport --dports 1:65535 -j ACCEPT -A nova-compute-2.7-inst-143 -p udp -m multiport --dports 1:65535 -j ACCEPT -A nova-compute-2.7-inst-143 -p icmp -j ACCEPT -A nova-compute-2.7-inst-143 -j nova-compute-2.7-sg-fallback 

任何build议在哪里寻找这个问题是值得欢迎的。 当然我会提供任何必要的数据来解决这个问题。 目前我不太确定哪些数据会有帮助。

TILO,

这在https://bugs.launchpad.net/nova/+bug/1096259中被捕获得很好,目前正在对nova( https://review.openstack.org/#/c/19139/ )进行修补今天(2013年1月7日)。

完整的修补程序还与错误1096987( https://bugs.launchpad.net/nova/+bug/1096987 )和1096985( https://bugs.launchpad.net/nova/+bug/1096987 )以覆盖更多常见的部署scheme,您正在使用预定义的外部网关或利用nova-network linux / iptablesnetworking公共网桥设置。

好的,我发现了这个问题:

所有到浮动IP的数据包(在我的情况下为10.1.100.0/24)都被DNAT到私有networking目的地(在我的情况下为10.0.0.0/24)。 ssh数据包通过控制器循环,直接返回到虚拟机。 ssh服务器应答,但发送包的私人地址作为源(当然,它没有其他)。 因此,ssh客户端从10.0.0.13获得一个数据包,作为对10.1.100.4的请求的回应,它将忽略它。

那么,从Private发送数据包到浮动IP时,不仅目的地必须是NAT,而且也是源。 但是这不是直接的,因为当SNAT处于POSTROUTE时,DNAT处于PREROUTE状态。 可以使用连接跟踪模块完成:

 iptables -t nat -A nova-network-2.7-float-snat -s 10.0.0.13/32 -d 10.0.0.0/24 -j SNAT --to-source 10.1.100.4 -m conntrack --ctstate DNAT 

这对我来说(当然每一个浮动IP)的技巧。 它将从私钥到私钥的每个数据包都已经被DNATed(然后它应该转到浮动IP),使它看起来像来自一个浮动IP。

在我的SSH场景现在发生以下情况:

  • 客户端从10.0.0.13发送到10.1.100.4
  • 数据包被DNATed为10.0.0.13
  • 数据包被SNATed到10.1.100.4
  • 服务器应答数据包到10.1.100.4
  • 数据包被DNATed为10.0.0.13
  • 数据包被SNATed到10.1.100.4
  • 客户从10.1.100.4得到答案,很高兴

这也适用于ping,也适用于不同VM之间的stream量。

看起来我必须修补nova-network代码并将其提交给openstack项目: – /。