Neutron外部网络和浮动IP需物理网卡绑定、ML2 provider映射、L3 agent状态三者严格对齐:须清空物理网卡IP、桥接br-ex、配置flat_networks与bridge_mappings一致、external subnet禁用DHCP、验证L3 agent运行及iptables DNAT/SNAT规则,并确保subnet CIDR与物理网关网段完全匹配。

Neutron 外部网络(External Network)和浮动 IP(Floating IP)不是“开箱即用”的功能,必须显式配置物理网卡绑定、ML2 provider 映射、L3 agent 启动状态三者全部对齐,缺一不可。常见失败根本原因不是命令输错,而是这三项中某一项未生效或值不匹配。
确认物理网卡已桥接到 br-ex 且无 IP 冲突
外部网络依赖一个真实可达的物理出口,这个出口不能还挂着旧 IP——否则 br-ex 启动后会抢走网卡 IP,导致控制节点失联。
-
ovs-vsctl add-br br-ex和ovs-vsctl add-port br-ex eth2必须执行,但仅此不够 - 必须删除物理网卡原有 IP:运行
ip addr flush dev eth2,再检查ip addr show eth2确认输出中无inet行 - 确保
/etc/sysconfig/network-scripts/ifcfg-eth2中有BOOTPROTO=none和DEVICETYPE=ovs,否则 network service 重启时会试图重配 IP -
br-ex自身需配置 IP(如10.86.10.1/23),该 IP 必须属于你外网子网的网关段,且不能与物理网关冲突
检查 ml2_conf.ini 中 flat_networks 和 bridge_mappings 是否一致
Neutron 不会自动猜你用哪个物理网络名。如果创建 external network 时指定 --provider:physical_network external,但配置里写的是 flat_networks = provider,就会报 No Network found for provider。
- 打开
/etc/neutron/plugins/ml2/ml2_conf.ini,确认[ml2_type_flat]下的flat_networks值(如external)与创建网络时的--provider:physical_network参数完全一致(大小写敏感) - 同时检查
[ovs]段中bridge_mappings是否为external:br-ex(冒号前是物理网络名,后是 OVS bridge 名) - 改完必须重启
neutron-server和所有 agent(neutron-openvswitch-agent、neutron-l3-agent),仅 reload 不生效
neutron router-gateway-set 失败?先验证 L3 agent 是否正常运行
即使 external network 创建成功,router-gateway-set 报错 “No valid host was found” 或直接卡住,大概率是 L3 agent 没在任何节点上 running,或者它所在节点没连通 br-ex。
- 运行
openstack network agent list | grep l3,确认状态为up且host是你期望的网络节点(通常是 controller) - 登录该节点,检查
systemctl status neutron-l3-agent,常见错误日志含Failed to bind port或Cannot find bridge br-ex - 若 L3 agent 在 controller 上,确保
br-ex已存在且ovs-vsctl show能看到它;若在独立网络节点上,需同步配置br-ex和ml2_conf.ini - 不要跳过
neutron subnet-create的--no-dhcp参数——external subnet 绝对不能开 DHCP,否则 L3 agent 启动时会拒绝挂载
Floating IP 分配后 ping 不通?重点查 iptables 和安全组
分配 FIP 成功只代表 Neutron DB 记录了映射,实际数据包能否进出取决于三层命名空间里的 iptables 规则和租户安全组放行策略。
- 进入 L3 agent 所在节点,找到对应 router namespace:
ip netns list | grep qrouter,然后ip netns exec qrouter-xxx iptables -t nat -S,确认有类似-A POSTROUTING -s 192.168.10.0/24 -d 10.86.10.0/23 -j SNAT --to-source 10.86.10.1的规则 - 检查
neutron security-group-rule-create是否添加了允许 ICMP 和 SSH 流入 FIP 的规则,注意目标端口是0.0.0.0/0,不是私网段 - 若使用 Linux Bridge(非 OVS),确认
/etc/neutron/plugins/ml2/linuxbridge_agent.ini中physical_interface_mappings也指向external:eth2,否则 L2 层不通
最易被忽略的一点:external network 的 subnet CIDR 必须和物理网关实际所在的网段完全一致,哪怕只差一个掩码位(比如配成 /24 而物理是 /23),FIP 的 DNAT 就会失效,从外网 ping 通但无法 ssh 或返回 ICMP unreachable。

















