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 网段,导致包直接在虚拟网关处丢弃。

操作:

  1. 修正子网网关:将 OpenStack 外部子网的网关设为宿主机的 IP 192.168.4.100
  2. 添加静态路由:在 OpenStack 路由器中添加规则,指明去往 192.168.1.0/24 的下一跳为 192.168.4.100

阶段二:扫清宿主机障碍 (Linux Bridge)

即使路由正确,宿主机的内核防火墙和网卡模式也会拦截非本地 MAC 地址的包。

操作:

  1. 开启混杂模式:执行 ifconfig eno1 promisc
  2. 放行网桥流量
    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网段的网关就行。
posted @ 2026-01-28 13:30  郭小睿  阅读(0)  评论(0)    收藏  举报