我无法让浮动 IP 在我的 OpenStack 设置上正常工作。看起来控制器节点(运行 nova-network)没有将流量转发到实例。
我有一个使用 FlatDHCP 的 Folsom 部署,没有运行多主机,而是在 Ubuntu 12.04 上运行。
举例来说,这里有一个正在运行的实例,其固定 IP 为 10.40.0.2,浮动 IP 为 10.20.0.3:
$ nova list
+-------+---------+--------+------------------------------+
| ID | Name | Status | Networks |
+-------+---------+--------+------------------------------+
| 3d292 | quantal | ACTIVE | private=10.40.0.2, 10.20.0.3 |
+-------+---------+--------+------------------------------+
如果我登录到控制器,我可以从任一 IP ping 和 ssh 到 VM 实例。但是,我无法从外部机器 ping 或 ssh 到该实例。
如果我尝试从不同网络(192.168.3.5)上的机器 ping 通,我可以看到数据包到达其公共接口(eth3)上的控制器,但这些数据包不会被转发到连接到私有接口的网桥(br100):
# tcpdump -i any icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
20:33:12.908188 IP 192.168.3.5 > 10.20.0.3: ICMP echo request, id 58378, seq 0, length 64
20:33:13.910759 IP 192.168.3.5 > 10.20.0.3: ICMP echo request, id 58378, seq 1, length 64
20:33:14.910591 IP 192.168.3.5 > 10.20.0.3: ICMP echo request, id 58378, seq 2, length 64
我已将 nova-network 配置为使用“no-op”防火墙驱动程序,因此这里不应该存在任何安全组问题:
firewall_driver=nova.virt.firewall.NoopFirewallDriver
我已确认已启用 IP 转发:
$ cat /proc/sys/net/ipv4/ip_forward
1
我不太熟悉 iptables,但是看一下规则(见https://gist.github.com/lorin/5209761),我看不出有什么明显的错误。
我假设从控制器连接到虚拟机时此规则有效:
-A nova-network-OUTPUT -d 10.20.0.3/32 -j DNAT --to-destination 10.40.0.2
并且在执行前进时要遵守这些规则
-A nova-network-PREROUTING -d 10.20.0.3/32 -j DNAT --to-destination 10.40.0.2
-A nova-network-FORWARD -o br100 -j ACCEPT
此刻,我不知道为什么它不能正确地进行 NAT 并转发数据包。
这些接口包括:
eth0
:(这里不涉及)eth1
:连接到内部 VM 专用网络,br100 桥接到该网络。数据包最终应从该接口发出eth2
:(这里不涉及)eth3
:面向公众的接口。它具有控制器的 IP(10.20.0.2)以及实例的浮动 IP(10.20.0.3)。
下面是“ip a”的输出,其中MAC被隐藏。
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet 169.254.169.254/32 scope link lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
inet 10.30.0.131/24 brd 10.30.0.255 scope global eth0
inet6 ef23::2345:3aff:fe86:50c8/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br100 state UP qlen 1000
link/ether 11:22:33:44:55:66 brd ff:ff:ff:ff:ff:ff
inet6 ef23::2345:3aff:fe86:50c9/64 scope link
valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 77:88:99:00:11:22 brd ff:ff:ff:ff:ff:ff
inet 10.10.0.131/24 brd 10.10.0.255 scope global eth2
inet6 ef23::2345:3aff:fe68:b4b6/64 scope link
valid_lft forever preferred_lft forever
5: eth3: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 33:44:55:66:77:88 brd ff:ff:ff:ff:ff:ff
inet 10.20.0.2/24 brd 10.20.0.255 scope global eth3
inet 10.20.0.3/32 scope global eth3
inet6 ef23::2345:3aff:fe68:b4b7/64 scope link
valid_lft forever preferred_lft forever
6: br100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 54:78:1a:86:50:c9 brd ff:ff:ff:ff:ff:ff
inet 10.40.0.1/16 brd 10.40.255.255 scope global br100
inet6 ef23::2345:3aff:fed1:cd55/64 scope link
valid_lft forever preferred_lft forever
路由表:
~$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.10.0.1 0.0.0.0 UG 100 0 0 eth2
10.10.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
10.20.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth3
10.30.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
10.40.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br100
桥梁设置:
# brctl show
bridge name bridge id STP enabled interfaces
br100 8000.54781a8650c9 no eth1
以下是 /etc/nova/nova.conf 中的一些网络行
network_manager=nova.network.manager.FlatDHCPManager
flat_interface=eth1
flat_network_bridge=br100
public_interface=eth3
firewall_driver=nova.virt.firewall.NoopFirewallDriver
答案1
您在“接口是”下说 eth2 没有参与,但从路由输出来看,网关似乎是为 eth2 设置的。
我认为您希望将其设置在 eth3 上。我会检查 /etc/network/interfaces 是否已设置以反映这一点。