终于还是用了旁路由
2026 年 07 月 02 日
装了 OpenWRT 之后,R8500 其实还是蛮好用的。
我本来以为,R8500有足够的性能冗余,但前几天 nas 跑迅雷的时候,机器被搞垮了,负载高企,连无线都会断开。
要亡羊补牢,还是把最重要的科学上网挪到别的机器来跑吧。
碰巧这几天看到飞牛提供了 QWRT 应用,花了点时间配好,学到了不少知识。
关于 QWRT
一句话解释,运行在 Docker 里的 OpenWRT 改版。
由于用 Docker,理论上吃不了主机太多资源,还能省一台独立机器。
飞牛安装 QWRT 时要求配 3 个参数:网卡/子网/网关。这个没啥好说的。
网络用的是 macvlan,简单说就是虚拟一块有独立 mac 的网卡。但由于技术限制,虚拟出来的网卡跟原来的物理网卡无法直接通信,需要用一个变通措施。
默认安装好后,QWRT 是通过主路由 DHCP 获取,无 IPv6 支持(暂时也不想加)。所以 QWRT 本身的初始化工作只包括:
- 确认 DHCP 服务是否开启(飞牛提供的 QWRT 默认未开启),如果开启需要关闭。
- 连接到 QWRT 的 sh,查看 IP,通过 IP 连接其 Web 界面。
- 作为局域网里的旁路由,默认密码我都懒得改了。只改固定 IP 就好。
- 终端执行命令:
echo 0xdeadbeef /etc/config/google_fu_mode,开启几个必要的插件。 - 装个 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)
总结
说实话,不想折腾,但没办法。
就这几台设备,一根入户网线,需求还不一样。我需要方便可配置优先,如果稳定性出了问题可以自己调整。但家人上网需要稳定性大于可连通性。
目前看来,旁路由已经是相对最好的办法了。