对话笔记直发: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
  • NAS:192.168.*.*(Armbian,root,默认密钥免密 SSH ssh 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 行,ruby YAML.load_file 校验通过。
  • 结果:路由器日志 match DomainSuffix(telegram.org) using PROXY[...];NAS curl 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 处小修正):
    1. 重建命令加 --log-opt max-size=10m --log-opt max-file=3(对齐现有 LogConfig);
    2. 验收加容器内出口实测 docker exec hindsight curl -sI https://huggingface.co;
    3. 确认 LogConfig 重建后恢复。 子代理确认:8888/9999 无反向代理依赖;192.168.*.*:4000 是本地 LLM(NO_PROXY 直连);数据卷安全;中断秒级。

三、本次执行细节(hindsight 重建)

  1. 复核当前容器配置(env / mounts / ports / LogConfig),确认与计划一致。
  2. docker stop hindsight && docker rm hindsight(保留 hindsight-data 卷)。
  3. 重建(去掉 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
  4. 验收(全部通过):
    • 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 生效)。

四、当前代理架构(全量对账)

组件状态
路由器 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 已脱敏,请替换为你自己的地址。


相关: 00-索引-AI工程索引 8.21 Open WRT OpenClash中cloudflared隧道修复记录