对话笔记直发:8.16 路由器OpenClash代理与hindsight单层化。分类:网络基建。
tags:
- nas
- 路由器
- openclash
- 代理
- sing-box
- docker
- hindsight
- telegram
- 故障排查 title: 路由器 OpenClash 代理体系梳理与 hindsight 单层化 date: 2026-08-16
路由器 OpenClash 代理体系梳理与 hindsight 单层化
全程目标:把局域网内所有出网流量收敛为单一代理层(路由器 OpenClash),消除 sing-box / docker / 容器硬编码带来的双层甚至三层代理,并修复 Telegram DNS 污染与 OpenClash 崩溃。
一、环境基线(已做脱敏)
- 路由器(网关):
192.168.*.*(OpenWrt + busybox,无setsid命令),跑 OpenClash(Clash Meta,fake-ip + TUN-mix)。- SSH:
ssh -i ~/.ssh/id_rsa_openwrt root@192.168.*.* - 自定义规则文件:
/etc/openclash/custom/openclash_custom_rules.list - 运行配置:
/etc/openclash/1元.yaml
- SSH:
- NAS:
192.168.*.*(Armbian,root,默认密钥免密 SSHssh root@192.168.*.*),docker 宿主机(约 18 个容器),本地 LLM 服务在192.168.*.*:4000(metapi / openai 兼容)。- 仍运行 sing-box 作为应急回滚(未停)。
- hindsight 容器:
ghcr.io/vectorize-io/hindsight:latest,docker run启动(非 compose),bridge 网络,端口 8888/9999,数据卷hindsight-data:/home/hindsight/.pg0。
二、本次会话累计变更清单
1. Telegram DNS 污染(主路径修复)
- 现象:NAS
resolv.conf指向 Tailscale DNS(100.100.100.100),绕过路由器 fake-ip;api.telegram.org解析到污染 CN IP你的服务器IP(已脱敏)→ GeoIP/CN 走 DIRECT → 超时。 - 修复:在自定义规则里插入
DOMAIN-SUFFIX,telegram.org,PROXY(SNI 嗅探能拿到域名,域名规则在GEOIP,CN,DIRECT之前命中)。 - 关键坑:
- 用
echo >>追加到缺换行的一行,规则粘在注释行末尾 → 用sed -i "/telegram.org,PROXY/d"+printf "\n- DOMAIN-SUFFIX,telegram.org,PROXY\n" >>修正。 - 空行导致 OpenClash 跳过该行 →
sed -i "/^$/d"。 - 只改
.list不会触发配置重建(OpenClash 只在完整重建时重读.list),必须用 awk 注入到运行 yaml 真正位置:awk '/- GEOIP,CN,DIRECT/ { print "- DOMAIN-SUFFIX,telegram.org,PROXY" } { print }',插入到 yaml 第 90 行,rubyYAML.load_file校验通过。
- 用
- 结果:路由器日志
match DomainSuffix(telegram.org) using PROXY[...];NAScurl api.telegram.org返回 HTTP/2 302;hermes-gateway 重启 0 网络错误。
2. OpenClash 崩溃恢复
- 现象:LuCI 守护程序/代理模式均显示”未运行”。
- 根因:残留锁
/tmp/lock/openclash.lock+ “Multiple Restart Scripts Running” 守卫,且此前用setsid重启——busybox 没有setsid,导致所有setsid ... restart静默失败,旧 clash 进程无防火墙链。 - 修复:
kill -9旧 pid →rm -f /tmp/lock/openclash.lock→nohup /etc/init.d/openclash restart >/tmp/oc3.log 2>&1 &(用nohup ... &而非setsid)。新 pid 起来后 nat 链openclash重建。
3. Docker 全局 proxy.conf 清理(双重代理)
- 文件
/etc/systemd/system/docker.service.d/proxy.conf向所有容器注入HTTP_PROXY/HTTPS_PROXY=http://127.0.0.1:7890(指向 NAS sing-box)。 - 已删除(保留备份
.bak),systemctl daemon-reload && systemctl restart docker,18 个容器重启健康;容器内实测api.telegram.org经路由器单层返回 HTTP/2 302。 - 说明:清理的是 Docker 的”指向 sing-box 的开关配置”,不是 sing-box 本身。
4. hermes 双 env 源合并为单层
- hermes 代理变量散在两处:
/etc/hermes/env(dashboard 用)+/opt/data/.env(gateway 真实 Telegram 源)。 - 改为统一走路由器单层代理;留回滚脚本:
/root/hermes_router_restore.sh、/root/hermes_env_A_backup、/root/hermes_dataenv_A_backup。
5. hindsight 硬编码代理 → 单层化(本次执行)
- 发现 hindsight 用
docker run -e硬编码HTTP_PROXY/HTTPS_PROXY=http://172.17.0.1:7890(docker0 桥 → 宿机 sing-box),docker proxy.conf 清理没影响它,仍是双层。 - 用户要求:“先 review 一下方案,确认没有风险之后再去动手。”
- 子代理评审结论:PASS(带 3 处小修正):
- 重建命令加
--log-opt max-size=10m --log-opt max-file=3(对齐现有 LogConfig); - 验收加容器内出口实测
docker exec hindsight curl -sI https://huggingface.co; - 确认 LogConfig 重建后恢复。
子代理确认:8888/9999 无反向代理依赖;
192.168.*.*:4000是本地 LLM(NO_PROXY 直连);数据卷安全;中断秒级。
- 重建命令加
三、本次执行细节(hindsight 重建)
- 复核当前容器配置(env / mounts / ports / LogConfig),确认与计划一致。
docker stop hindsight && docker rm hindsight(保留hindsight-data卷)。- 重建(去掉
HTTP_PROXY/HTTPS_PROXY,保留NO_PROXY=localhost,127.0.0.1,192.168.*.*,加 log-opt):docker run -d --name hindsight --restart unless-stopped --network bridge \ -p 8888:8888 -p 9999:9999 \ -v hindsight-data:/home/hindsight/.pg0 \ --log-opt max-size=10m --log-opt max-file=3 \ -e HINDSIGHT_CP_DATAPLANE_API_URL=http://localhost:8888 \ -e HINDSIGHT_ENABLE_API=true -e HINDSIGHT_ENABLE_CP=true \ -e NO_PROXY=localhost,127.0.0.1,192.168.*.* \ -e HINDSIGHT_API_LLM_API_KEY=sk-xxxx \ -e HINDSIGHT_API_HOST=0.0.0.0 -e HINDSIGHT_API_PORT=8888 \ -e HINDSIGHT_API_LLM_BASE_URL=http://192.168.*.*:4000/v1 \ -e HINDSIGHT_API_LLM_MODEL=step-3.7-flash \ -e HINDSIGHT_API_LLM_PROVIDER=openai -e HINDSIGHT_API_LOG_LEVEL=info \ -e LANG=C.UTF-8 -e NODE_ENV=production -e PYTHONUNBUFFERED=1 \ -e TRANSFORMERS_VERBOSITY=error -e HF_HUB_VERBOSITY=error \ -e TOKENIZERS_PARALLELISM=false -e HF_HUB_DOWNLOAD_TIMEOUT=600 \ ghcr.io/vectorize-io/hindsight:latest - 验收(全部通过):
- env 干净:仅
NO_PROXY,无HTTP_PROXY/HTTPS_PROXY; - LogConfig:
max-size:10m/max-file:3恢复; - 端口 8888 → HTTP 404、9999 → HTTP 307(服务已起);
- 外部出口:
https://huggingface.co→ HTTP/2 200(经路由器);日志Load pretrained SentenceTransformer: BAAI/bge-small-en-v1.5证明无代理下模型加载成功; - 本地 LLM:
Connection verified: openai/step-3.7-flash+http://192.168.*.*:4000返回 401(直连本地,NO_PROXY 生效)。
- env 干净:仅
四、当前代理架构(全量对账)
| 组件 | 状态 |
|---|---|
| 路由器 OpenClash | 唯一代理层,含 telegram.org → PROXY 强制规则 ✅ |
| hermes | 两层 env 已合并为单层(走路由器)✅ |
Docker proxy.conf | 已删 ✅ |
| hindsight | 硬编码 172.17.0.1:7890 已去,改走路由器单层 ✅ |
| NAS sing-box | 仍在跑,作为应急回滚保留(未动) |
五、待办
- (待用户拍板) 是否停掉 NAS sing-box,彻底只留路由器一层?目前保留作应急。
- 观察 hindsight 稳定一段时间后再考虑清 sing-box。
- 若日后 sing-box 停掉,记得把
/etc/systemd/system/docker.service.d/proxy.conf.bak彻底删掉(而非仅停用)。
六、回滚与风险备忘
- hindsight 重建前未单独备份容器(因
docker run无 compose),但数据卷hindsight-data始终保持,重建不丢数据;如需回退旧镜像行为,重新docker run时把HTTP_PROXY/HTTPS_PROXY=http://172.17.0.1:7890加回即可。 - OpenClash 若再崩:先
rm -f /tmp/lock/openclash.lock再nohup /etc/init.d/openclash restart &,勿用setsid。 - Telegram 规则若失效:确认是真重启(kill + nohup)而非仅改
.list;用 awk 注入到GEOIP,CN,DIRECT之前。
注:本文涉及的服务器公网 IP / Tailnet / 局域网 IP 已脱敏,请替换为你自己的地址。