我build立了一个OpenStack Folsom(2012.2)多节点单networking基础架构。 一切运行正常,任何计算节点上的实例运行良好,私有networking就像一个魅力,所有实例都可以通过外部的浮动IP访问,并可以到达外部。
但是,当试图通过它的浮动IP执行从虚拟机到自己的networking请求时,它会失败。
ping和ssh都没有工作。
安全组全部打开。
Ping通过浮动IP从一个VM工作到另一个,但SSH 不 。
一些例子的数据
控制器上的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场景现在发生以下情况:
这也适用于ping,也适用于不同VM之间的stream量。
看起来我必须修补nova-network代码并将其提交给openstack项目: – /。