diff --git a/CLAUDE.md b/CLAUDE.md index e4da94a..d77f658 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -30,15 +30,15 @@ docker/ │ ├── .env.example # 复制为 .env 填入真实 token │ └── runner/ │ └── config.yaml # act-runner 配置 -└── proxy/ - ├── docker-compose.yml # mihomo 容器 - ├── mihomo/ - │ ├── config.yaml # 透明代理规则(uuid 用 占位) - │ └── .env.example # 复制为 .env 填入真实 UUID - └── dnsmasq/ - └── dnsmasq.conf # 预备 DHCP 配置(暂未启用) +├── frp/ +│ ├── docker-compose.yml # 历史遗留(实际部署走二进制+systemd,见 scripts/) +│ └── frpc.toml.example # frpc 配置模板(token 占位,真值在 Bitwarden) +└── derp/ # Tailscale 自建 DERP(可选,未部署) ``` +> mihomo 透明代理 + dnsmasq 已于 2026-07-05 下线删除(配置见 git 历史 `docker/proxy/`)。 +> ⚠️ 若 Windows(192.168.3.88)网关/DNS 仍指向 NAS,需改回路由器,否则断网。 + NAS 上实际路径:`/volume1/docker/<服务名>/`,与仓库 `docker/` 目录一一对应。 ## Docker 服务 @@ -65,46 +65,20 @@ NAS 上实际路径:`/volume1/docker/<服务名>/`,与仓库 `docker/` 目 ssh nas "tail -f /volume1/docker/forgejo/data/gitea/log/gitea.log" ``` -### mihomo(透明代理) +### frp 内网穿透(frpc,systemd 常驻) -局域网透明代理网关,Windows 设备(192.168.3.88)以 NAS 为默认网关。 +在外经 `nas/git/win.yanmeiai.com` 访问家里(frps 锚点在 ali 北京,方案见 `docs/remote-access-frp.html`): -**架构:** -``` -Windows (192.168.3.88) - └─ 网关 = 192.168.3.200,DNS = 192.168.3.200 - -NAS mihomo (TUN 模式, Meta 接口) - ├─ 国内流量 → DIRECT(GEOSITE/GEOIP CN 匹配) - └─ 国外流量 → ec2-sg(新加坡 AWS,VLESS + Reality) -``` - -**关键配置:** -- 配置文件:`/volume1/docker/proxy/mihomo/config.yaml` -- DNS:端口 53,fake-ip 模式,范围 198.18.0.0/15,`fake-ip-persist: true` -- 混合代理端口:7890(HTTP/SOCKS5,局域网可用) -- 管理 API:`http://192.168.3.200:9090` -- 代理节点:VLESS + Reality(**不使用** `flow: xtls-rprx-vision`,客户端和服务端均已移除) +- **frpc 二进制** `/usr/local/bin/frpc`,配置 `/volume1/docker/frp/frpc.toml`(root:600,含 token 不入 git,模板见 `docker/frp/frpc.toml.example`) +- systemd 服务 `frpc.service`(Restart=always + MemoryLimit=64M);转发:git SSH/Web、DSM 5001、NAS SSH→10022、Windows RDP 3389 / SSH→10023 +- 一键部署/重装:Mac 上跑 `bash scripts/setup-frp-remote.sh`(自动从 Bitwarden 取 token、代下载二进制、经 ssh 推送执行) ```bash -# 热重载配置(不重启容器) -ssh nas "curl -s -X PUT 'http://127.0.0.1:9090/configs?force=true' \ - -H 'Content-Type: application/json' \ - -d '{\"path\":\"/root/.config/mihomo/config.yaml\"}'" - -# 测试代理节点 -ssh nas "curl -s 'http://127.0.0.1:9090/proxies/ec2-sg/delay?timeout=5000&url=https://www.cloudflare.com/cdn-cgi/trace'" - -# 测试出口 IP -ssh nas "curl -s --max-time 10 --proxy 'socks5h://127.0.0.1:7890' https://ifconfig.me" - -# 查看实时日志 -ssh nas "curl -s http://127.0.0.1:9090/logs -N --max-time 10" +# 查看 frpc 状态与日志(NAS 上) +sudo systemctl status frpc +sudo journalctl -u frpc -n 20 --no-pager ``` -**dnsmasq(预备,未启用):** -配置文件已就绪(`docker/proxy/dnsmasq/dnsmasq.conf`),待未来启用 DHCP 自动分发时使用。启用前需将 mihomo DNS 端口从 53 改为 1053,并将 dnsmasq 加入 docker-compose.yml。 - ### jiu-db 自动备份 每天 02:00(UTC+8)自动备份 jiu 项目 PostgreSQL,存至 `/volume1/docker/backups/jiu-db/`,格式 `jiu_db_YYYYMMDD_HHmmss.sql.gz`,保留约 16 天。 @@ -118,18 +92,17 @@ ssh nas "ls -lh /volume1/docker/backups/jiu-db/" | 端口 | 服务 | |------|------| | 22 | SSH | -| 53 | mihomo DNS(fake-ip) | | 80 / 443 | Synology nginx(反代 + DSM 重定向) | | 2222 | Forgejo SSH | | 3000 | Forgejo HTTP | | 5000 / 5001 | DSM Web UI(HTTP / HTTPS) | | 5432 | PostgreSQL(localhost only) | | 6690 | Synology Drive | -| 7890 | mihomo 混合代理(HTTP/SOCKS5) | -| 9090 | mihomo 管理 API | | 41641/udp | Tailscale WireGuard | | 445 / 139 | SMB 文件共享 | +(frpc 无入站监听——只出站长连接到 ali:7000) + ## Synology 反向代理 通过 DSM 内置 nginx 管理:**Control Panel → Login Portal → Advanced → 反向代理服务器** diff --git a/docs/index.html b/docs/index.html index ebafd09..41a6592 100644 --- a/docs/index.html +++ b/docs/index.html @@ -37,8 +37,8 @@ 文档状态说明 家庭内网远程访问 —— frp 反向隧道 × pangolin × 分流 DNS - 执行中 - 内外同域名访问 NAS/Windows:frpc(NAS)→frps(pangolin1) 反向隧道 + split-horizon DNS + pangolin 客户端分流;NAS 侧一键脚本 scripts/setup-frp-remote.sh + 在外链路已上线 + 内外同域名访问 NAS/Windows:frpc(NAS,systemd)→frps(ali) 反向隧道 + SG 限源 + split-horizon DNS;家内直连与客户端分流规则待做;一键脚本 scripts/setup-frp-remote.sh diff --git a/docs/remote-access-frp.html b/docs/remote-access-frp.html index c574349..49959b2 100644 --- a/docs/remote-access-frp.html +++ b/docs/remote-access-frp.html @@ -51,7 +51,18 @@
← 文档索引

家庭内网远程访问方案
frp 反向隧道 × pangolin × 分流 DNS

-

2026-07-15 · 执行中 P0–P2 已完成(frps@pangolin1 运行中、hairpin 实测 OK、CF 三条 A 记录已生效);P3 待跑 scripts/setup-frp-remote.sh · 相关:Tailscale 公网访问(现状,保留作应急后门)

+

2026-07-15 · 在外链路已上线(锚点 ali)· 家内直连(P5/P6)待做 · 相关:Tailscale 公网访问(保留作应急后门)

+ +
+

⚠️ 2026-07-15 落地修正(与下文原设计的差异)

+
    +
  • 锚点从 pangolin1 迁到 ali(182.92.213.171):实测发现 sing-box 客户端 auto_route 会把自己服务器的 IP排除出 TUN(内核级防环路,Apple 端 NE excludedRoutes),客户端永远无法经隧道回连 pangolin1——「hairpin 到 VPN 机自身」的原设计不成立。迁 ali 后链路:Mac→隧道→pangolin1 出口→公网→ali:frps←frpc←NAS。限源改用阿里云安全组(业务端口仅允许 103.119.13.48/32),负向测试已验证。frpc 家→北京为纯国内长连接,更稳。
  • +
  • NAS 上 mihomo 已不存在(2026-07-05 随 ec2 退役下线,本文 §6.2 的 mihomo hosts 方案作废):家内 DNS 覆盖改用群晖 DNS Server 套件(为 nas/git/win.yanmeiai.com 建单主机权威 zone,不劫持父域),待回家后落地。
  • +
  • frpc 用二进制 + systemd(非 docker):NAS 无出国通道拉不了 Docker Hub 镜像;顺带消除对 Container Manager 的依赖。
  • +
  • smartRoute 暂需关闭:ali 是国内 IP,smartRoute 开着会把它分流成直连、被安全组限源拦截。根治=P6 客户端规则(这几个域名强制走隧道 + 私网结果直连),落地前先关 smartRoute。
  • +
  • Windows(192.168.3.88)当前不在线(LAN 内 no route),RDP/SSH 转发待它开机即用,无需重配。
  • +
+
目标:①在家直连内网、不出外网;②在外开着 pangolin 就能穿透回家(不装第二个 VPN 客户端);③内外用同一套地址——git.yanmeiai.com(Forgejo)、nas.yanmeiai.com(DSM/Photos)、win.yanmeiai.com(Windows RDP/SSH)。
diff --git a/scripts/fix-mihomo-tailscale.sh b/scripts/fix-mihomo-tailscale.sh deleted file mode 100644 index f33bf86..0000000 --- a/scripts/fix-mihomo-tailscale.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh -# 让 Tailscale 域名在 mihomo 里解析为真实 IP(绕开 fake-ip 劫持), -# 否则 tailscaled 连不上控制服务器、登录时拿不到 URL。 -# 该脚本在 NAS 上运行;config.yaml 归 wangjia 所有,无需 root。 -# 幂等:重复执行不会重复插入。改前自动备份,并热重载生效(不重启容器)。 -set -e - -CFG=/volume1/docker/proxy/mihomo/config.yaml - -echo "==> 1/4 备份配置" -cp "$CFG" "$CFG.bak.tailscale" -echo " 备份: $CFG.bak.tailscale" - -echo "==> 2/4 写入 fake-ip-filter(幂等)" -python3 - "$CFG" <<'PY' -import sys -p = sys.argv[1] -text = open(p).read() -if "+.tailscale.com" in text: - print(" 已存在,跳过插入") - sys.exit(0) -lines = text.splitlines(True) -add = [ - " - '+.tailscale.com'\n", - " - '+.tailscale.io'\n", - " - '+.tailscale-dns.com'\n", -] -out, done = [], False -for ln in lines: - out.append(ln) - if (not done) and "+.pool.ntp.org" in ln: - out.extend(add) - done = True -if not done: - print(" !! 没找到锚点 '+.pool.ntp.org',未修改,请人工检查") - sys.exit(1) -open(p, "w").writelines(out) -print(" 已插入 3 条 tailscale 域名") -PY - -echo "==> 3/4 热重载 mihomo" -curl -s -X PUT 'http://127.0.0.1:9090/configs?force=true' \ - -H 'Content-Type: application/json' \ - -d '{"path":"/root/.config/mihomo/config.yaml"}' -echo " reload 已请求" - -echo "==> 4/4 验证解析(期望是真实公网 IP,不再是 198.18.x)" -sleep 1 -nslookup controlplane.tailscale.com 2>&1 | tail -3 - -echo "==> 完成。现在回到卡住的窗口按 Ctrl+C,重新执行:" -echo " sudo /var/packages/Tailscale/target/bin/tailscale up --reset --operator=wangjia"