background
1502 字
8 分钟
ROS + Debian 13 + daed 旁路由:国外正常、国内网站无法访问的排障记录

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 / daed
10.0.2.11
ROS
10.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 自身是否可以正常访问国内和国外网站:

Terminal window
curl -4 -I https://www.baidu.com
curl -4 -I https://www.qq.com
curl -4 -I https://www.google.com

实际测试中 Debian 本机访问均正常,因此可以排除 Debian 到 ROS 的基础网络、默认路由以及 daed 代理节点本身存在严重故障。


三、检查 Debian 路由#

执行:

Terminal window
ip route
ip rule

实际路由:

default via 10.0.2.1 dev eth0 proto static
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.11

策略路由:

0: from all lookup local
32766: from all lookup main
32767: from all lookup default

默认网关正确指向 ROS:

10.0.2.11 → 10.0.2.1

因此基础路由没有发现异常。


四、检查 IP Forward#

旁路由必须允许 Linux 转发 IPv4 数据包。

执行:

Terminal window
sysctl net.ipv4.ip_forward
sysctl net.ipv4.conf.all.forwarding
sysctl net.ipv4.conf.eth0.forwarding

实际结果:

net.ipv4.ip_forward = 1
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.eth0.forwarding = 1

说明 Debian 已经开启 IPv4 转发。

如果这里是 0,可以临时开启:

Terminal window
sysctl -w net.ipv4.ip_forward=1

需要永久开启时,可创建:

Terminal window
cat > /etc/sysctl.d/99-router.conf <<'EOF2'
net.ipv4.ip_forward=1
EOF2
sysctl --system

五、检查 iptables#

执行:

Terminal window
iptables -L -n -v
iptables -t nat -L -n -v

初始状态下:

  • FORWARD 默认策略为 ACCEPT
  • POSTROUTING 没有任何 NAT 规则。

也就是说,Debian 虽然允许转发,但转发出去的客户端数据包并没有做源地址转换。

这就是问题的关键。


六、添加 MASQUERADE 解决问题#

在 Debian 上执行:

Terminal window
iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -o eth0 -j MASQUERADE

然后查看规则:

Terminal window
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

其中 pktsbytes 持续增加,说明客户端流量已经命中这条 NAT 规则。

添加规则后,国内网站恢复正常访问。

MASQUERADE 后的路径#

Debian 转发客户端数据包时,会将源地址转换为自己的 10.0.2.11

客户端 10.0.2.x
Debian 10.0.2.11
↓ SNAT/MASQUERADE
ROS 10.0.2.1
Internet

ROS 看到连接来源是 10.0.2.11,因此回包必须发送给 Debian:

Internet
ROS
Debian 10.0.2.11
↓ NAT 状态恢复
客户端 10.0.2.x

这样去程和回程都会经过 Debian,非对称路由问题被解决。


七、持久化 iptables 规则#

手工执行的 iptables 规则在系统重启后会消失,因此需要进行持久化。

Debian 13 可以安装:

Terminal window
apt update
apt install -y iptables-persistent

安装后保存当前 IPv4 规则:

Terminal window
iptables-save > /etc/iptables/rules.v4

也可以使用:

Terminal window
netfilter-persistent save

检查保存结果:

Terminal window
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 MASQUERADE
COMMIT

核心规则就是:

-A POSTROUTING -s 10.0.2.0/24 -o eth0 -j MASQUERADE

八、确认 netfilter-persistent 开机启动#

执行:

Terminal window
systemctl enable netfilter-persistent
systemctl status netfilter-persistent

服务显示:

Loaded: loaded (...; enabled; preset: enabled)
Active: active (exited)

说明 netfilter-persistent 已启用。

需要注意:首次安装时日志中可能出现:

Warning: skipping IPv4 (no rules to load)

这是因为服务启动发生在 /etc/iptables/rules.v4 被手动创建之前。后续已经执行:

Terminal window
iptables-save > /etc/iptables/rules.v4

因此规则已经保存。可以进一步测试加载:

Terminal window
netfilter-persistent reload

然后确认:

Terminal window
iptables -t nat -L POSTROUTING -n -v

九、IPv6 rules.v6 警告#

安装过程中还出现:

cannot open /etc/iptables/rules.v6: No such file
Error: IPv6 rules failed test load. New rules NOT loaded

这是因为当前没有保存 IPv6 iptables 规则。

如果目前旁路由主要使用 IPv4,这个警告与本次国内网站无法访问的问题无关。

如需消除该提示,可以保存当前 IPv6 规则:

Terminal window
ip6tables-save > /etc/iptables/rules.v6

然后:

Terminal window
netfilter-persistent reload

十、最终配置#

本次问题真正需要的核心配置只有两部分。

1. 开启 IPv4 转发#

net.ipv4.ip_forward=1

检查:

Terminal window
sysctl net.ipv4.ip_forward

2. 对旁路由转发流量进行 MASQUERADE#

Terminal window
iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -o eth0 -j MASQUERADE

并保存:

Terminal window
iptables-save > /etc/iptables/rules.v4

总结#

这次问题并不是 daed 的代理功能异常,而是一个典型的同网段单臂旁路由回程问题

因为:

ROS 10.0.2.1
Debian 10.0.2.11
客户端 10.0.2.x

三者处于同一个 /24 网段。

国外流量进入 daed 代理链路,因此可以正常访问;国内流量选择 DIRECT 后,Debian 直接将客户端原始源地址转发给 ROS,ROS 又可以直接二层访问客户端,从而让回程绕过 Debian。

最终通过:

Terminal window
iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -o eth0 -j MASQUERADE

让 ROS 始终将回包发送回 Debian,再由 Debian 根据连接跟踪状态还原并转发给客户端,问题得到解决。

对于 ROS + Debian/daed 单臂旁路由,并且主路由、旁路由、客户端处于同一网段 的部署方式,这是一个非常值得优先检查的点。

发现错误或想要改进这篇文章?

在 GitHub 上编辑此页
ROS + Debian 13 + daed 旁路由:国外正常、国内网站无法访问的排障记录
https://blog.bianco.cat/posts/ros_debian13_daed旁路由国内网站无法访问排障记录/
作者
BiancoCat
发布于
2026-09-19
许可协议
CC BY-NC-SA 4.0