家里有台闲置的九联 UNR030H1。我想给它单独开一张 Wi-Fi:平时还是用原来的网络,需要代理的设备再连过去。这样就算折腾失败,也不会影响家里其他人上网。
现在这台路由器已经能跑 sing-box。Windows 笔记本连上新 Wi-Fi 后,国内网站正常打开,IPv4 TCP 流量也确实从代理出口走了。手机还没这么省心,后面会说到。
先想办法进路由器
我当时不是直接 SSH 进去的。先在浏览器登录路由器后台,登录后再访问下面这个地址,然后才进入 SSH:
http://192.168.2.1/cgi-bin/getGateWay.cgi
这是我手上这台设备的操作顺序,不确定别的固件是否一样。进入系统后,我先看了 uname -a、/proc/cpuinfo 和挂载信息。它是 Linux 3.18.21,MIPS 小端,使用 soft-float。这个细节不能猜:程序架构弄错了,传上去也跑不起来。
程序跑起来,比想象中绕一点
我为这台机器交叉编译了 sing-box 1.14.2,先用 sing-box version 确认二进制能执行。原文件约 38 MB,压缩后约 11 MB,再通过局域网传过去。旧固件的工具和证书都不太完整:从 GitHub 在线下载规则集时,我碰到了 x509: certificate signed by unknown authority,最后改为提前下载规则文件,放在本地使用。
代理没有一开始就上透明转发。我先开 1080 的 SOCKS 入口,确认路由器连得上代理节点;这段通了,再开 7892 的 redirect 入口,接 iptables 转过来的 TCP。每次改配置,我都会先跑 sing-box check -c config.json,确定配置能解析,再动防火墙规则。
新 Wi-Fi 有了,流量却不一定经过它
我把九联接到主路由后面,给它的 Wi-Fi 起名 5101-Proxy。主网络还是 192.168.1.x,代理侧用 192.168.2.x,九联在这侧的地址是 192.168.2.1。iptables 只接管来自 192.168.2.0/24 的 IPv4 TCP,避开局域网地址后转到 7892;原来的防火墙规则没有整表清空。
一开始我看到代理没流量,差点以为是 iptables 写错了。后来才发现,电脑还有别的网络连接,或者客户端拿到了上游 DHCP 分配的 192.168.1.x 地址。流量根本没按预想从九联走,自然也不会命中那条规则。
测试笔记本最后连到 5101-Proxy,手动设为 192.168.2.3/24,网关和首选 DNS 都指向 192.168.2.1,并暂时断开其他会抢默认路由的连接。这时国内网页能打开,IPv4 TCP 的出口也变了。排查这类问题时,我现在会先看客户端的 IP 和默认网关,再看 7892 有没有监听、SINGBOX 链的计数有没有增长。
电脑通了,手机还是卡
手机连接同一张 Wi-Fi,有时却会拿到主路由分配的 192.168.1.x,直接绕开代理规则。改成 192.168.2.x 后,部分国外应用依然会卡住。这次做的只是 IPv4 TCP 透明代理;UDP/QUIC 和 IPv6 没有一起接管。笔记本上的网页能用,不代表手机应用已经全部可用。
我还把程序和启动文件放到了设备的持久化分区,运行时再恢复到 /tmp。手动结束进程和重启路由器后,sing-box 都能重新起来。所以这台旧路由器现在算是一台能用的 TCP 代理 AP,但还谈不上“连上就什么都能代理”。
下一步要解决的是把 WAN 与 LAN/WLAN 真正分开,让代理侧自己发 DHCP,再认真处理 UDP、DNS 和 IPv6。眼下我最确定的一条经验是:别只盯着代理配置。先确认设备到底走了哪条路。