HomeProxy 的页面只是入口。真正影响 DNS 和路由的是 UCI 配置、生成脚本、sing-box JSON、procd 进程、dnsmasq 片段和 firewall4 规则。页面显示运行,仍可能卡在生成文件、进程拉起或 nft 规则加载中的某一层。
官方仓库描述 HomeProxy 是 powered by sing-box 的 ImmortalWrt 代理平台。init 脚本里写得更具体:它调用 /usr/bin/sing-box,生成客户端配置 /var/run/homeproxy/sing-box-c.json,再由 procd 启动 sing-box-c。
先查哪 5 个文件和命令?
/etc/init.d/homeproxy status
logread -e homeproxy
ls -l /var/run/homeproxy/
sing-box check -c /var/run/homeproxy/sing-box-c.json
fw4 print | grep -i homeproxy
| 位置 | 作用 | 异常时的表现 |
|---|---|---|
/etc/config/homeproxy | UCI 持久配置 | 页面保存后字段没变 |
/var/run/homeproxy/sing-box-c.json | 客户端运行配置 | sing-box 启动失败或仍在跑旧配置 |
/var/run/homeproxy/homeproxy.log | HomeProxy 主日志 | 生成脚本报错 |
/tmp/dnsmasq.d/dnsmasq-homeproxy.d/ | dnsmasq 片段目录 | DNS 没转到预期端口 |
/var/run/homeproxy/fw4_post.nft | 生成的 nft 规则 | 透明转发或回流异常 |
/var/run 和 /tmp 都是运行期目录。重启后会重新生成,所以不要只看文件存在,还要看时间戳是否晚于你最后一次保存配置。
procd 有没有真的拉起 sing-box?
init 脚本里启用了 USE_PROCD=1。客户端实例的命令是:
/usr/bin/sing-box run --config /var/run/homeproxy/sing-box-c.json
状态页说运行,但 ps 里没有 sing-box-c.json,先查这三处:
ps | grep sing-box
cat /var/run/homeproxy/sing-box-c.log
logread -e sing-box
日志里出现 JSON parse、outbound tag 不存在、rule-set 下载失败,都属于 sing-box 配置层。此时先修生成出来的 JSON,不要急着改 LuCI 的 DNS 页面。
DNS 请求到底有没有进 HomeProxy?
HomeProxy 可能会写 dnsmasq 配置片段。第一步不是换上游 DNS,而是确认片段是否生成:
ls -l /tmp/dnsmasq.d/dnsmasq-homeproxy.d/
cat /tmp/dnsmasq.d/dnsmasq-homeproxy.d/dnsmasq-homeproxy.conf
再用同一个域名测试路由器地址:
nslookup example.com 192.168.1.1
logread -e dnsmasq
如果 dnsmasq 片段没生成,DNS 请求未必进 HomeProxy。如果片段存在但查询超时,再看 sing-box JSON 里的 dns.servers、dns.rules 和出站 tag。
路由规则该看哪些 sing-box 字段?
sing-box route 文档里,几个字段最容易影响实际出口:
| 字段 | 作用 | 常见错法 |
|---|---|---|
route.rules | 逐条匹配连接 | 规则引用不存在的 outbound |
route.rule_set | 远程或本地规则集 | 下载失败后页面仍显示旧状态 |
route.final | 默认 outbound | 留空时使用第一个 outbound,排错时容易误判 |
auto_detect_interface | 自动绑定默认网卡 | 多出口设备可能选错接口 |
default_interface | 指定默认网卡 | 和自动检测混用时看不出效果 |
用 jq 看配置比在页面里逐项找更快:
jq '.dns, .route, .outbounds[]?.tag' /var/run/homeproxy/sing-box-c.json
没有 jq 就把 JSON 拷到电脑上格式化。先确认所有 tag 都存在,再看规则顺序;否则 route 命中了也可能指向一个不存在的 outbound。
firewall4 要不要一起查?
要。DNS 正常但透明入口不通,常见原因是 nft 规则没刷新或加载顺序不对。
fw4 print | grep -i homeproxy
ls -l /var/run/homeproxy/fw4_post.nft
service firewall restart
logread -e firewall
重启 firewall 后短时间恢复,说明问题偏规则生成或加载顺序。把 HomeProxy 日志、fw4_post.nft 时间戳和 /etc/config/firewall 一起记录,后面才好对比。
怎么做最小复测?
只拿一台测试设备,固定一个域名和一个 App:
- 设备 DNS 指向路由器。
- 清空该设备 DNS 缓存或重连 Wi-Fi。
- 打开测试域名。
- 看 dnsmasq 日志。
- 看 sing-box 连接和 route 命中。
先别把所有设备都纳入测试,也不要同时启用多份订阅。多端要同步时,可以留一份配套订阅线路作为输入基线;HomeProxy 本身仍然按路由器日志排。
相关阅读
FAQ
HomeProxy 页面显示运行就一定生效吗?
不一定。init 脚本会生成 sing-box JSON 并交给 procd 运行。页面状态正常,也要确认 /var/run/homeproxy/sing-box-c.json、进程和日志。
HomeProxy 的客户端 sing-box 配置在哪里?
官方 init 脚本里的客户端实例叫 sing-box-c,运行参数是 run --config /var/run/homeproxy/sing-box-c.json。排错时先看这个文件是否存在、时间戳是否正确。
DNS 问题先查 HomeProxy 还是 dnsmasq?
先查生成的 dnsmasq 配置和 HomeProxy 日志。/tmp/dnsmasq.d/dnsmasq-homeproxy.d/dnsmasq-homeproxy.conf 没生成时,DNS 请求可能根本没进入预期链路。
规则不命中要看哪些 sing-box 字段?
重点看 route.rules、route.rule_set、route.final、auto_detect_interface 和 default_interface,这些字段决定连接进哪个 outbound。