ROS + Debian 13 + daed 旁路由:国外正常、国内网站无法访问的排障记录
问题背景
网络环境如下:
- 主路由:RouterOS(ROS)
- ROS 地址:
10.0.2.1 - 旁路由:Debian 13 + daed
- Debian 地址:
10.0.2.11/24 - Debian 网卡:
eth0 - daed 版本:
v1.27.0 - 客户端、ROS、Debian 均位于
10.0.2.0/24网段
客户端将默认网关切换为 Debian 旁路由 10.0.2.11 后,出现以下现象:
- 国外网站可以正常访问;
- 国内网站全部无法访问;
- Debian 旁路由本机访问国内、国外网站均正常。
最终定位为:同网段旁路由转发国内 DIRECT 流量时没有进行 SNAT/MASQUERADE,导致回程流量绕过 Debian,形成非对称路由。
一、网络拓扑
客户端 10.0.2.x │ │ 默认网关 10.0.2.11 ▼Debian 13 / daed10.0.2.11 │ ▼ROS10.0.2.1 │ ▼Internet国外流量经过 daed 代理时可以正常工作:
客户端 → Debian/daed → 代理节点 → Internet国内 DIRECT 流量则是:
客户端 → Debian → ROS → Internet由于客户端、Debian、ROS 都在 10.0.2.0/24 同一个二层网段,如果 Debian 转发时保留客户端源地址,ROS 返回数据时会发现客户端也是自己的直连主机,于是直接把回包发送给客户端:
去程:客户端 → Debian → ROS → 国内网站回程:国内网站 → ROS → 客户端回程绕过 Debian,形成非对称路径。这正是“国外代理正常,但国内 DIRECT 流量异常”的关键原因。
二、检查 Debian 本机网络
首先确认 Debian 自身是否可以正常访问国内和国外网站:
curl -4 -I https://www.baidu.comcurl -4 -I https://www.qq.comcurl -4 -I https://www.google.com实际测试中 Debian 本机访问均正常,因此可以排除 Debian 到 ROS 的基础网络、默认路由以及 daed 代理节点本身存在严重故障。
三、检查 Debian 路由
执行:
ip routeip rule实际路由:
default via 10.0.2.1 dev eth0 proto static10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.11策略路由:
0: from all lookup local32766: from all lookup main32767: from all lookup default默认网关正确指向 ROS:
10.0.2.11 → 10.0.2.1因此基础路由没有发现异常。
四、检查 IP Forward
旁路由必须允许 Linux 转发 IPv4 数据包。
执行:
sysctl net.ipv4.ip_forwardsysctl net.ipv4.conf.all.forwardingsysctl net.ipv4.conf.eth0.forwarding实际结果:
net.ipv4.ip_forward = 1net.ipv4.conf.all.forwarding = 1net.ipv4.conf.eth0.forwarding = 1说明 Debian 已经开启 IPv4 转发。
如果这里是 0,可以临时开启:
sysctl -w net.ipv4.ip_forward=1需要永久开启时,可创建:
cat > /etc/sysctl.d/99-router.conf <<'EOF2'net.ipv4.ip_forward=1EOF2
sysctl --system五、检查 iptables
执行:
iptables -L -n -viptables -t nat -L -n -v初始状态下:
FORWARD默认策略为ACCEPT;POSTROUTING没有任何 NAT 规则。
也就是说,Debian 虽然允许转发,但转发出去的客户端数据包并没有做源地址转换。
这就是问题的关键。
六、添加 MASQUERADE 解决问题
在 Debian 上执行:
iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -o eth0 -j MASQUERADE然后查看规则:
iptables -t nat -L POSTROUTING -n -v可以看到类似:
Chain POSTROUTING (policy ACCEPT) pkts bytes target prot opt in out source destination 26 1918 MASQUERADE all -- * eth0 10.0.2.0/24 0.0.0.0/0其中 pkts 和 bytes 持续增加,说明客户端流量已经命中这条 NAT 规则。
添加规则后,国内网站恢复正常访问。
MASQUERADE 后的路径
Debian 转发客户端数据包时,会将源地址转换为自己的 10.0.2.11:
客户端 10.0.2.x ↓Debian 10.0.2.11 ↓ SNAT/MASQUERADEROS 10.0.2.1 ↓InternetROS 看到连接来源是 10.0.2.11,因此回包必须发送给 Debian:
Internet ↓ROS ↓Debian 10.0.2.11 ↓ NAT 状态恢复客户端 10.0.2.x这样去程和回程都会经过 Debian,非对称路由问题被解决。
七、持久化 iptables 规则
手工执行的 iptables 规则在系统重启后会消失,因此需要进行持久化。
Debian 13 可以安装:
apt updateapt install -y iptables-persistent安装后保存当前 IPv4 规则:
iptables-save > /etc/iptables/rules.v4也可以使用:
netfilter-persistent save检查保存结果:
cat /etc/iptables/rules.v4本机最终配置如下:
# Generated by iptables-save v1.8.11 (nf_tables)*nat:PREROUTING ACCEPT [0:0]:INPUT ACCEPT [0:0]:OUTPUT ACCEPT [0:0]:POSTROUTING ACCEPT [3:282]-A POSTROUTING -s 10.0.2.0/24 -o eth0 -j MASQUERADECOMMIT核心规则就是:
-A POSTROUTING -s 10.0.2.0/24 -o eth0 -j MASQUERADE八、确认 netfilter-persistent 开机启动
执行:
systemctl enable netfilter-persistentsystemctl status netfilter-persistent服务显示:
Loaded: loaded (...; enabled; preset: enabled)Active: active (exited)说明 netfilter-persistent 已启用。
需要注意:首次安装时日志中可能出现:
Warning: skipping IPv4 (no rules to load)这是因为服务启动发生在 /etc/iptables/rules.v4 被手动创建之前。后续已经执行:
iptables-save > /etc/iptables/rules.v4因此规则已经保存。可以进一步测试加载:
netfilter-persistent reload然后确认:
iptables -t nat -L POSTROUTING -n -v九、IPv6 rules.v6 警告
安装过程中还出现:
cannot open /etc/iptables/rules.v6: No such fileError: IPv6 rules failed test load. New rules NOT loaded这是因为当前没有保存 IPv6 iptables 规则。
如果目前旁路由主要使用 IPv4,这个警告与本次国内网站无法访问的问题无关。
如需消除该提示,可以保存当前 IPv6 规则:
ip6tables-save > /etc/iptables/rules.v6然后:
netfilter-persistent reload十、最终配置
本次问题真正需要的核心配置只有两部分。
1. 开启 IPv4 转发
net.ipv4.ip_forward=1检查:
sysctl net.ipv4.ip_forward2. 对旁路由转发流量进行 MASQUERADE
iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -o eth0 -j MASQUERADE并保存:
iptables-save > /etc/iptables/rules.v4总结
这次问题并不是 daed 的代理功能异常,而是一个典型的同网段单臂旁路由回程问题。
因为:
ROS 10.0.2.1Debian 10.0.2.11客户端 10.0.2.x三者处于同一个 /24 网段。
国外流量进入 daed 代理链路,因此可以正常访问;国内流量选择 DIRECT 后,Debian 直接将客户端原始源地址转发给 ROS,ROS 又可以直接二层访问客户端,从而让回程绕过 Debian。
最终通过:
iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -o eth0 -j MASQUERADE让 ROS 始终将回包发送回 Debian,再由 Debian 根据连接跟踪状态还原并转发给客户端,问题得到解决。
对于 ROS + Debian/daed 单臂旁路由,并且主路由、旁路由、客户端处于同一网段 的部署方式,这是一个非常值得优先检查的点。
发现错误或想要改进这篇文章?
在 GitHub 上编辑此页