无需网桥即可对veth对等设备的流量进行伪装?及互联网连通性问题排查求助
无需网桥即可对veth对等设备的流量进行伪装?及互联网连通性问题排查求助
首先先给你吃个定心丸:完全可以不用网桥就对veth设备的流量做伪装,你的iptables规则思路是对的,但咱们先确认几个细节,再一步步排查外网不通的问题~
关于你的iptables规则合理性
这条规则逻辑没问题:针对10.1.2.0/24网段的流量,只要不是发往veth设备本身的,就做MASQUERADE。这个排除项! -o my-veth很关键,它避免了对veth本地互访的流量做无用的伪装,完全符合咱们的需求。
外网连通性排查步骤(按顺序来,大概率能找到问题)
- 先查IP转发功能有没有开!
这是新手最容易踩的坑!在root命名空间里执行:
sysctl net.ipv4.ip_forward
如果输出是net.ipv4.ip_forward = 0,那就是没开,临时开启用:
sysctl -w net.ipv4.ip_forward=1
要永久生效的话,编辑/etc/sysctl.conf或者/etc/sysctl.d/99-sysctl.conf,把net.ipv4.ip_forward=1加进去,再执行sysctl -p加载配置。
- 检查命名空间里的默认路由
先进入你的网络命名空间(假设你的netns叫my-ns):
ip netns exec my-ns bash
然后看路由表:
ip route show
你需要看到类似default via 10.1.2.1 dev <命名空间侧的veth设备名>的默认路由。如果没有的话,流量根本不知道往哪发,赶紧加一条:
ip netns exec my-ns ip route add default via 10.1.2.1 dev <你的veth设备名>
- 检查iptables的FORWARD链规则
有时候NAT规则加了,但FORWARD链默认策略是DROP,直接把转发的流量拦了。在root命名空间里执行:
iptables -L FORWARD -v
看看有没有允许10.1.2.0/24网段流量通过的规则。如果默认策略是DROP,而且没相关允许规则,就加两条:
# 允许从命名空间出来的流量转发出去 iptables -A FORWARD -s 10.1.2.0/24 -j ACCEPT # 允许外网回来的响应包进入命名空间 iptables -A FORWARD -d 10.1.2.0/24 -m state --state RELATED,ESTABLISHED -j ACCEPT
- 检查主机的防火墙工具(比如ufw/firewalld)
要是你用了这类上层防火墙,它们可能会覆盖iptables规则。比如ufw默认是禁止转发的,你需要编辑/etc/default/ufw,把DEFAULT_FORWARD_POLICY="ACCEPT"改成ACCEPT,然后重启ufw:
ufw reload
如果是firewalld,需要开启伪装功能或者添加转发规则,具体可以用firewall-cmd来配置。
- 抓包定位流量断点
要是上面几步都没问题,咱们就抓包找问题:
- 在root命名空间的外网出口网卡(比如
eth0或者wlan0)上抓包,看请求包有没有发出去:tcpdump -i eth0 host 8.8.8.8 - 同时在命名空间的veth设备上抓包,看请求包有没有发出、有没有回包:
ip netns exec my-ns tcpdump -i <命名空间侧veth名> host 8.8.8.8
如果外网出口能看到请求包但没回包,可能是上游路由的问题;如果连请求包都看不到,那回头再查路由和iptables的转发规则。
备注:内容来源于stack exchange,提问作者Alex Flint
相关产品推荐
相关产品推荐

