OpenStack 网络实战:打通外部网络与物理路由器的全过程记录
环境: CentOS / OpenStack (Linux Bridge 模式)
核心问题: 虚拟路由器(qrouter)无法 Ping 通外部物理网关,提示“目标主机不可达”。
1. 网络拓扑背景
- 物理网段:
192.168.1.0/24(网关为192.168.1.254) - OpenStack 宿主机:
192.168.1.70 - OpenStack 外部子网:
192.168.4.0/24 - 虚拟路由器外部接口 (qg):
192.168.4.74
2. 问题排查逻辑
阶段一:打通“去程”路由
最初,虚拟路由器不知道如何到达 1.x 网段,导致包直接在虚拟网关处丢弃。
操作:
- 修正子网网关:将 OpenStack 外部子网的网关设为宿主机的 IP
192.168.4.100。 - 添加静态路由:在 OpenStack 路由器中添加规则,指明去往
192.168.1.0/24的下一跳为192.168.4.100。
阶段二:扫清宿主机障碍 (Linux Bridge)
即使路由正确,宿主机的内核防火墙和网卡模式也会拦截非本地 MAC 地址的包。
操作:
- 开启混杂模式:执行
ifconfig eno1 promisc。 - 放行网桥流量:
echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables echo 0 > /proc/sys/net/bridge/bridge-nf-call-arptables
阶段三:补全“回程”路由(最关键一步)
核心结论: 即使去程包到达了物理网关(1.254),如果物理网关不知道 4.0/24 网段的存在,回包将无法返回,导致 100% 丢包。
3. 终极解决方案:配置物理路由器 (OpenWrt)
在物理网关(192.168.1.254)上添加一条静态路由,让整个物理网络识别虚拟网络:
| 参数项 | 配置值 | 说明 |
|---|---|---|
| 目标网络 | 192.168.4.0 |
虚拟网络的 CIDR |
| 子网掩码 | 255.255.255.0 |
|
| 下一跳/网关 | 192.168.1.70 |
包交回给 OpenStack 宿主机进行二次转发 |
| 接口 | lan |
对应物理内网接口 |
4. 验证命令
在 qrouter 命名空间内执行:
# 测试物理网关连通性
ip netns exec qrouter-<ID> ping 192.168.1.254
# 最简单的方法
# 直接openstack宿主机ping 4网段的网关就行。

浙公网安备 33010602011771号