CentOS7网络命名空间(netns)内IP转发失效问题排查求助
我来帮你一步步定位问题,结合你的VM→Router1→Router2→外网拓扑,咱们从最核心的配置开始排查:
1. 先确认IP转发功能是否真的开启
这是路由转发的基础前提,先检查Router2所在命名空间的IP转发状态:
ip netns exec qrouter-d3dcb2df-f3ca-4079-a434-491b23f84b5a sysctl net.ipv4.ip_forward
如果输出是net.ipv4.ip_forward = 0,说明转发没开,先临时启用测试:
ip netns exec qrouter-d3dcb2df-f3ca-4079-a434-491b23f84b5a sysctl -w net.ipv4.ip_forward=1
要是临时启用后问题解决,记得把配置写到命名空间对应的sysctl文件里(或者全局配置)实现永久生效。
2. 检查路由表是否存在正确的转发路径
Router2需要两条关键路由才能完成转发:一条指向Router1侧的网段,一条指向外部网络的默认路由。执行命令查看完整路由表:
ip netns exec qrouter-d3dcb2df-f3ca-4079-a434-491b23f84b5a ip route
重点确认:
- 存在到VM/Router1网段的路由,下一跳是Router1对接Router2的接口IP
- 存在默认路由
default via <外网网关IP> dev <Router2的外网接口>
如果缺了某条路由,手动补上,比如添加默认路由:
ip netns exec qrouter-d3dcb2df-f3ca-4079-a434-491b23f84b5a ip route add default via 192.168.x.x dev eth0
(替换成实际的外网网关IP和Router2的外网接口名)
3. 排查防火墙规则是否阻断了转发流量
很多场景下iptables的FORWARD链默认会拒绝转发,先检查Router2的防火墙规则:
ip netns exec qrouter-d3dcb2df-f3ca-4079-a434-491b23f84b5a iptables -L FORWARD -v
如果看到policy DROP,或者没有允许Router1侧网段与外网互访的规则,就添加允许规则:
ip netns exec qrouter-d3dcb2df-f3ca-4079-a434-491b23f84b5a iptables -A FORWARD -s <Router1侧网段> -j ACCEPT ip netns exec qrouter-d3dcb2df-f3ca-4079-a434-491b23f84b5a iptables -A FORWARD -d <Router1侧网段> -j ACCEPT
另外注意:Router1已经做了SNAT,Router2这里纯转发不需要额外SNAT,但要确保没有其他规则误拦截流量。
4. 验证接口连通性和状态
先确认Router2的所有业务网卡(对接Router1和外网的接口)都是<UP,LOWER_UP>状态,你给出的ip a只显示了lo,得检查其他接口状态。
然后测试基础连通性:
- 测试Router2到Router1的连通性:
ip netns exec qrouter-d3dcb2df-f3ca-4079-a434-491b23f84b5a ping <Router1对接Router2的IP>
- 测试Router2到外网的连通性:
ip netns exec qrouter-d3dcb2df-f3ca-4079-a434-491b23f84b5a ping 8.8.8.8
如果这两步都不通,先解决链路连通问题,再排查转发。
5. 检查ARP表是否正常解析
ARP解析失败也会导致流量无法转发,查看Router2的ARP表:
ip netns exec qrouter-d3dcb2df-f3ca-4079-a434-491b23f84b5a ip neigh
确认Router1的IP和对应MAC、外网网关的IP和对应MAC都存在,要是缺失,先手动触发ARP请求或者检查链路物理状态。
如果以上步骤排查完还是没解决问题,建议补充Router2完整的ip a输出、ip route输出以及iptables-save的结果,我再帮你精准定位。
内容的提问来源于stack exchange,提问作者flagon

