终于还是用了旁路由

2026 年 07 月 02 日

装了 OpenWRT 之后,R8500 其实还是蛮好用的。

我本来以为,R8500有足够的性能冗余,但前几天 nas 跑迅雷的时候,机器被搞垮了,负载高企,连无线都会断开。

要亡羊补牢,还是把最重要的科学上网挪到别的机器来跑吧。

碰巧这几天看到飞牛提供了 QWRT 应用,花了点时间配好,学到了不少知识。

关于 QWRT

一句话解释,运行在 Docker 里的 OpenWRT 改版。

由于用 Docker,理论上吃不了主机太多资源,还能省一台独立机器。

飞牛安装 QWRT 时要求配 3 个参数:网卡/子网/网关。这个没啥好说的。

网络用的是 macvlan,简单说就是虚拟一块有独立 mac 的网卡。但由于技术限制,虚拟出来的网卡跟原来的物理网卡无法直接通信,需要用一个变通措施。

默认安装好后,QWRT 是通过主路由 DHCP 获取,无 IPv6 支持(暂时也不想加)。所以 QWRT 本身的初始化工作只包括:

  1. 确认 DHCP 服务是否开启(飞牛提供的 QWRT 默认未开启),如果开启需要关闭。
  2. 连接到 QWRT 的 sh,查看 IP,通过 IP 连接其 Web 界面。
  3. 作为局域网里的旁路由,默认密码我都懒得改了。只改固定 IP 就好。
  4. 终端执行命令:echo 0xdeadbeef /etc/config/google_fu_mode,开启几个必要的插件。
  5. 装个 Privoxy,因为某必要插件只提供了 socks 代理,所以还需要这个来转成 http 代理。

基本上不需要别的了。这样,局域网其他机器(除了运行 QWRT 的主机),只要把路由走到 QWRT 的 IP 就可以了。

关于主机和 QWRT 的互通

问题本质是 macvlan 的限制,假设物理网卡是 192.168.1.2,docker 里的虚拟网卡是 192.168.1.3,那么这两个 ip 无法直接互通。

解决办法是,在主机系统里,用 macvlan 再虚拟一个 192.168.1.4,然后指定目标路由。

也就是说,物理网卡 A,主机用虚拟网卡 B,Docker 用虚拟网卡 C。AB 和 AC 之间无法通信,但 BC 之间可以。

这样,对于主机来说,连 192.168.1.3 时,是通过 192.168.1.4 这个虚拟地址出去的。对于 docker,虽然仍然无法连通主机物理网卡 192.168.1.2,但可以通过连192.168.1.4 达到同样目的。

我是在 crontab -e 里面添加了这段:

@reboot sleep 10 && ip link add macvlan-proxy link bond1 type macvlan mode bridge && ip addr add 192.168.1.4/24 dev macvlan-proxy && ip link set macvlan-proxy up && ip route add 192.168.1.3/32 dev macvlan-proxy

脚本解释:

  • @reboot:重启之后触发
  • sleep 10:等待 10s,让物理网卡先工作
  • ip link add macvlan-proxy link bond1 type macvlan mode bridge:在 bond1 物理网卡上,添加一个名为 macvlan-proxy 的虚拟网卡
  • ip addr add 192.168.1.4/24 dev macvlan-proxy:给 macvlan-proxy 指定 ip 为 192.168.1.4,子网为 255.255.255.0
  • ip link set macvlan-proxy up:启动 macvlan-proxy 虚拟网卡
  • ip route add 192.168.1.3/32 dev macvlan-proxy:添加主系统路由,对地址 192.168.1.3,走 macvlan-proxy

关于指定设备走旁路由

旁路由是局域网的一台独立机器,因此其他设备跟它没有直接联系。但自己手动配总是感觉别扭。

所以这里要靠主路由来帮忙。原理是,在 DHCP 分配 IP 时,同时告知目标设备使用旁路由做网关。这时候就显示出主路由跑 OpenWRT 的必要性了,因为普通路由系统一般不会允许你做这类修改。

这里有个注意事项,由于现代设备经常使用随机 MAC 地址,会导致主路由无法识别设备。因此要用这个功能前,需要固定 MAC,也就是关闭随机 MAC 地址功能,该功能有时候叫做别的名字(比如苹果的私有 MAC 地址)。

具体改动是在 /etc/dnsmasq.conf 中添加如下代码段:

### 自定义的走旁路由的设备配置
dhcp-mac=set:bypass_gateway,AA:BB:CC:DD:EE:FF
dhcp-option=tag:bypass_gateway,3,192.168.1.3
dhcp-option=tag:bypass_gateway,6,192.168.1.3

原理是:将特定 MAC(例子里是:AA:BB:CC:DD:EE:FF)的设备打一个 bypass_gateway 标签,再通知拥有这个标签的设备,将 DNS 和网关都设置成目标值(例子里是 192.168.1.3)

总结

说实话,不想折腾,但没办法。

就这几台设备,一根入户网线,需求还不一样。我需要方便可配置优先,如果稳定性出了问题可以自己调整。但家人上网需要稳定性大于可连通性。

目前看来,旁路由已经是相对最好的办法了。

Top