From d070a5d22d1544068cf87f8e72307823c84e3088 Mon Sep 17 00:00:00 2001 From: salmonstill Date: Thu, 8 Oct 2026 18:27:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 0 -> 6148 bytes README.md | 194 ++++++++++++++++++++++++---- dsh-local-403-fix/.DS_Store | Bin 0 -> 6148 bytes tun模式下的主机mihomo config.yaml | 30 ++++- xray-代理服务器-config.json | 50 ++++++- xray-旁路由-config.json | 53 ++++++++ 代理vps-stream.conf | 8 +- 旁路由的mihomo config.yaml | 30 ++++- 非tun模式下的主机mihomo config.yaml | 30 ++++- 9 files changed, 360 insertions(+), 35 deletions(-) create mode 100644 .DS_Store create mode 100644 dsh-local-403-fix/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..54cb2034fcc2b3d31e306a4d86a21fdcb2e81eb7 GIT binary patch literal 6148 zcmeHKJxc>Y5S`T%gBC_eAvRtmh(rw0QoMv%Y7;^1@^wZb;esY07IN5#h2Wp?FQnCU zVr}K0@D~Wa*S~Zm~2lYl@q#dvdSOtEg0{rbdv_@4rp=RX!^;Y*yUp>g>O0}SbvDj;S>!6c< z%0&H@q5j6Pu{UJyK*gp~p&FGbNlo&pPL0U?95Eoq%;S0Kdh=1`(f6);(9367TqG|w z=REQ{qhsV%qX798fl1n+bxH$|pwzjUsaSq^0dWkLnfrG8($l$*#q3q{J*HWoxRJWg zL2DnH7g5bAwNRapdWWsT2!>hLMdJQ*O-8bMHI2_Q>ru-^Q-0_6t(7{Q-g`IKg=qH* z5r)^yb8)4cXC$JR)8L5c`~{uDp9GxQY_VB|wzmpc1*`&H1$cjO(HK3Ap+dQJpp#bs zpo3v)c;>qVb6ky{#!w+VFrlbGMHTvrAru|su8#9Gh6)v(gq#`g(K8EuLlJUzjJq)-a<#Sn-q|esA;`pp}(F$m692Y8- l6m 所有显式端口规则优先于 catch-all,现有端口转发不受影响。 -### 搬瓦工 VPS (`xray-代理服务器-config.json`) +### 搬瓦工 / 东京 VPS (`xray-代理服务器-config.json`) -极简:VLESS+Reality 入站 `:9443`(SNI=www.cloudflare.com, dest=www.cloudflare.com),freedom 出站。 -所有客户端(Spark、旁路由、macOS)直连此服务器,不再经北京 VPS 中转。 +**这台现在同时干三件事**(已从美国迁到日本东京,IP `74.82.200.116`,主机 `classic-hops-2`,Ubuntu 24.04): + +| 职责 | 入口 | 出站 | 说明 | +|---|---|---|---| +| 代理出口 | nginx `443` SNI=`www.cloudflare.com` → `vless-jp:9443` | `direct` | Mihomo 客户端直连,Reality(dest=www.cloudflare.com),不经北京中转 | +| NAS 转发入口 | nginx `443` SNI=`drive-jp.salmonstill.cn` → `nas:38653` → `external_nas_jp` | `portal-jp` | 香港访问 NAS 的快速通道,反向隧道回旁路由 | +| SearXNG | `0.0.0.0:8080`(docker,compose 在 `/opt/searxng`) | — | 公网可直接访问;无反代、无 TLS,服务器上也没有防火墙 | + +**Xray 配置**:`inbounds` = `vless-jp(9443)` + `external_nas_jp(38653)`;`reverse.portals` = `portal-jp`;`routing` 三条: + +```jsonc +{ "inboundTag": ["external_nas_jp"], "outboundTag": "portal-jp" }, // NAS 流量送进隧道 +{ "inboundTag": ["vless-jp"], "domain": ["full:reverse-proxy-jp.xray.internal"], "outboundTag": "portal-jp" }, // bridge 注册 +{ "inboundTag": ["vless-jp"], "outboundTag": "direct" } // 其余 = 代理客户端 +``` + +> ⚠️ **两条 `vless-jp` 规则里,带 domain 的那条不能省**:东京这台 **Reality 入站是「代理客户端 + bridge」共用的**(不像北京那台 `interconn` 是 bridge 专用)。只写 `vless-jp → portal-jp` 而不按域名区分,会把你**正常的代理流量也推进隧道**,代理立刻断掉。**这是本架构里唯一不能照抄北京的地方。** + +### 香港 → NAS 快速入口 (`drive-jp.salmonstill.cn`) + +**背景**:走老的 `drive.salmonstill.cn`(北京入口)进 NAS,瓶颈在腾讯云的峰值带宽。改用搬瓦工(东京,大带宽)做入口,香港侧更快。 + +**链路** + +``` +香港 → drive-jp.salmonstill.cn (74.82.200.116:443, SNI=drive-jp.salmonstill.cn) + → nginx 按 SNI 分流 → 127.0.0.1:38653 (dokodemo external_nas_jp) + → portal-jp → 反向隧道(旁路由 bridge-jp 主动注册) + → bridge-jp : 38653 → to_nas → 192.168.1.188:9443 +``` + +**两侧改动**(均已部署验证) + +| 侧 | 文件 | 改动 | +|---|---|---| +| 东京 | `/etc/nginx/nginx.conf` 的 stream 块(**内联,不是独立 conf 文件**) | map 加 `drive-jp.salmonstill.cn nas;`,新增 `upstream nas → 127.0.0.1:38653` | +| 东京 | `/usr/local/etc/xray/config.json` | `reverse.portals: portal-jp`、入站 `external_nas_jp`(dokodemo 38653)、上面那三条 routing | +| 旁路由 | `/etc/xray/config.json` | 第二个 bridge `bridge-jp`、出站 `interconn-jp`(直连东京 Reality)、2 条 `bridge-jp` 路由规则 | + +**关键设计** + +- 两条路的 `38653` **共用同一个出站 `to_nas`** → **NAS 侧(端口、证书)完全不用改** +- TLS 全程**透传到 NAS**,出示的是 NAS 那张自签 `CN=UGREEN` 证书;新域名走新 SNI,与老路径互不影响 +- 旁路由原有 **20 条 bridge 规则、`interconn-balancer`、`socks-lan` 全部未动**(`git diff --numstat` = `53 0`,纯新增) +- 两条路可以并存:老的 `drive.salmonstill.cn` 仍走北京,新的 `drive-jp.salmonstill.cn` 走东京 + +**验收** + +```bash +# 端到端(应完成 TLS 握手并返回 307;NAS 是自签证书,所以要 -k) +curl -vkI --resolve drive-jp.salmonstill.cn:443:74.82.200.116 https://drive-jp.salmonstill.cn + +# 东京侧:dokodemo 在听 + bridge 已注册 +ss -tlnp | grep 38653 +journalctl -u xray | grep -E 'portal-jp|reverse-proxy-jp' | tail +``` + +**备份(东京)**:`/etc/nginx/nginx.conf.bak-20261008-083207`、`/usr/local/etc/xray/config.json.bak-20261008-083207` + +**部署顺序**:官方建议**先起 bridge、再起 portal** 最稳。反过来(portal 先起)时实测出现过「bridge 注册成功但数据不通」的半死状态,**重启一次 bridge 即可恢复**。 --- @@ -148,22 +212,22 @@ | 端口 | 类型 | 路由 | 用途 | |---|---|---|---| | `7890` | mixed | 按规则分流 | 本地服务默认代理 | -| `7891` | mixed | 全部走 US-Direct | 全局国外代理 | +| `7891` | mixed | 全部走 US-Direct(内网/保留网段直连) | 全局国外代理 | | `7892` | mixed | 全部直连 | 全局国内直连 | 配合 **fake-ip DNS**(`enhanced-mode: fake-ip`),DNS 请求返回 `198.18.x.x` 假 IP,强制流量进入代理路由。 **代理节点**: -- `US-Direct` — VLESS+Reality → `67.230.189.235:443`(默认国外出口,客户端直连搬瓦工,SNI=www.cloudflare.com) +- `US-Direct` — VLESS+Reality → `74.82.200.116:443`(默认国外出口,客户端直连搬瓦工,SNI=www.cloudflare.com) > `Xray-Real` 代理节点(经北京 VPS 中转)已移除,Mihomo 全部直连搬瓦工。 **关键策略组**: - 国外 → `[US-Direct, 直连]` -**防死循环 IP**:`49.232.242.90`(北京 VPS)、`67.230.189.235`(搬瓦工 VPS)强制直连。 +**防死循环 IP**:`49.232.242.90`(北京 VPS)、`74.82.200.116`(搬瓦工 VPS)强制直连。 -**额外监听器**:`:7891`(全局→US-Direct)、`:7892`(强制直连) +**额外监听器**:`:7891`(全局→US-Direct,内网/保留网段直连)、`:7892`(强制直连) ### macOS (`非tun模式的主机mihomo config.yaml`) @@ -179,6 +243,42 @@ launchctl load ~/Library/LaunchAgents/com.mihomo.proxy.plist 本地 TUN 模式(`stack: system`),不依赖旁路由网关。设备重启后 `auto-route` 自建路由表,稳定可靠。监听器 `:7890` + `:7891` + `:7892`,节点直连 US-Direct。 +### 内网网段直连(三份配置一致) + +内网/保留网段**永远直连**,绝不出国: + +| 网段 | 用途 | +|---|---| +| `192.168.0.0/16` | 家庭 LAN(NAS `1.188`、旁路由 `1.199`、Spark `1.166`、qBit `1.200`、Windows `1.177`) | +| `10.0.0.0/8` | WireGuard 虚拟网段(`10.0.0.1~10.0.0.4`) | +| `172.16.0.0/12` | Docker bridge(Spark `172.20.0.1` 等) | +| `100.64.0.0/10` | CGNAT / 运营商大内网 | +| `127.0.0.0/8`、`169.254.0.0/16` | 本机回环、链路本地 | +| `224.0.0.0/4`、`240.0.0.0/4` | 组播(mDNS/SSDP 发现)、保留段 | + +**实现方式(两处改动同时生效)**: + +1. `rules:` **最顶部**的 8 条显式 `IP-CIDR,<网段>,直连,no-resolve`。 + 不依赖 `RULE-SET,Private_IP`(该 rule-provider 是启动时从 GitHub 下载的,下载失败/被墙时为空,内网流量会一路落到 `MATCH,其他 → 国外` 被送出国——这正是加显式规则的原因)。`no-resolve` 避免为内网 IP 触发公网 DoH 解析。 +2. `sub-rules.lan-direct-global` + `listeners: global-mixed` 的 `rule: lan-direct-global`。 + `:7891` 原来的 `proxy: US-Direct` 会**完全绕过 rules**,所以经 7891 访问 `192.168.x` 一定被送到搬瓦工;改成子规则后:内网/保留网段 → `直连`,其余仍 `MATCH,US-Direct`(全局代理语义不变)。注意 `proxy` 与 `rule` 同时存在时 `proxy` 优先,排查时先确认 7891 上没有残留 `proxy:` 字段。 + +> `fake-ip` 段 `198.18.0.0/16` **不能**加进直连,否则代理路由失效。 +> `sub-rules` / listener `rule` 需要 mihomo ≥ v1.19(本机验证版本 `Mihomo Meta v1.19.22`)。若某台设备版本过低,`mihomo -t` 会直接报错:此时保留 `rules` 里的显式 `IP-CIDR`(所有版本都支持),把该台 7891 还原成 `proxy: US-Direct`,内网访问改用 `7890`。 + +**验收**: + +```bash +# 内网直连(应成功,且 mihomo 日志出站为 直连):把 换成同网段任意内网设备 +curl -x http://127.0.0.1:7891 http://:5005 -I +# 全局代理语义不变(应返回搬瓦工出口 IP) +curl -s -x http://127.0.0.1:7891 https://ip.sb +# 查看活跃连接的实际出站链 +curl -s http://127.0.0.1:9090/connections | grep -E '192\.168|10\.' +# mihomo 日志里可直接看到匹配到的规则 +# [TCP] 127.0.0.1:xxxxx --> 192.168.x.x:5005 match IPCIDR(192.168.0.0/16) using 直连 +``` + ## qBittorrent 透明代理 @@ -668,7 +768,9 @@ PersistentKeepalive = 25 #### Mac -同上,`Address = 10.0.0.4/32`,PrivateKey 换成 Mac 的。 +配置同上,`Address = 10.0.0.4/32`,PrivateKey 换成 Mac 的。 + +> ⚠️ **实际状态(2026-10-08 核对)**:Mac 上 `WireGuard.app` 已安装,但**没有任何隧道配置、也没有活跃的 WG 接口**(`ifconfig` 里看不到 `10.0.0.4`)。需要远程进内网时,先在 app 里添加上面这份配置。 > AllowedIPs 只含虚拟网段和内网网段 → split tunnel,仅内网流量走隧道,不影响正常上网。 @@ -990,7 +1092,7 @@ sudo tcpdump -i bridge0 udp port 19132 -n ### 路径 2:代理翻墙(直连搬瓦工) ``` -Mihomo 客户端 → 67.230.189.235:443 (SNI=www.cloudflare.com) +Mihomo 客户端 → 74.82.200.116:443 (SNI=www.cloudflare.com) → Nginx 分流 → Xray :9443 → freedom → 互联网 ``` @@ -1016,21 +1118,58 @@ BT Peer → salmonstill.cn:51413 → portal → 隧道 → bridge → to_qbit → bridge → catch-all direct → 任意 LAN IP:PORT ``` +### 路径 7:香港 → NAS 快速入口(东京) +``` +香港 → drive-jp.salmonstill.cn (74.82.200.116:443, SNI=drive-jp.salmonstill.cn) + → nginx 按 SNI 分流 → 127.0.0.1:38653 (external_nas_jp) → portal-jp + → 反向隧道(旁路由 bridge-jp 主动注册) + → bridge-jp : 38653 → to_nas → 192.168.1.188:9443 +``` + +> 与路径 1 的区别:入口从北京换到东京(大带宽),旁路由侧走 `bridge-jp`,**其余完全一样**,两条路并存。 + | 文件 | 目标设备 | 部署路径 | |---|---|---|---| | `北京vps-stream.conf` | 北京 VPS | `/etc/nginx/nginx.conf` 的 `stream {}` 块 | | `xray-北京vps-config.json` | 北京 VPS | `/usr/local/etc/xray/config.json` | -| `代理vps-stream.conf` | 搬瓦工 VPS | `/etc/nginx/nginx.conf` 的 `stream {}` 块 | -| `xray-代理服务器-config.json` | 搬瓦工 VPS | `/usr/local/etc/xray/config.json` | +| `代理vps-stream.conf` | 搬瓦工 / 东京 VPS | `/etc/nginx/nginx.conf` 的 `stream {}` 块(**内联**) | +| `xray-代理服务器-config.json` | 搬瓦工 / 东京 VPS | `/usr/local/etc/xray/config.json` | | `xray-旁路由-config.json` | 旁路由 | `/etc/xray/config.json` | | `旁路由的mihomo config.yaml` | 旁路由 | `/opt/mihomo/config.yaml` | -| `非tun模式的主机mihomo config.yaml` | macOS | `~/Library/Application Support/mihomo/config.yaml` (launchctl 管理) | -| `tun模式的主机mihomo config.yaml` | Spark (Ubuntu) | `/opt/mihomo/config.yaml` -| `subscribe-7891-only.yaml` | 通用 | 精简版模板(单独 7891 端口) | -| `qbittorrent流量转发.md` | — | 方案文档(已合并到 README,可删除) | -| `我的世界udp转发.md` | — | 方案文档(已合并到 README,可删除) | +| `非tun模式的主机mihomo config.yaml` | macOS | **`/opt/mihomo/config.yaml`**(launchd `com.mihomo.proxy`,plist 里 `-d /opt/mihomo`;另有 `/opt/mihomo/start.sh` 可手动起) | +| `tun模式的主机mihomo config.yaml` | Spark (Ubuntu) | `/opt/mihomo/config.yaml` | +| `my_deepseek.sh` | macOS | 本机辅助脚本 | +| `qbittorrent流量转发.md` / `我的世界udp转发.md` | — | 方案文档,内容已并入 README;**文件仍保留在仓库里** | +| `旁路由备份/` | — | ImmortalWrt 配置备份 tar.gz | +| `dsh-local-403-fix/` | — | DSH 本地补丁工程(与本套网络无关) | + +--- + +## 远程运维约定(tmux) + +**在香港远程改旁路由的 xray / 网络配置,一律先开 tmux:** + +```bash +tmux new -s x +# 在里面改配置、重启服务 +``` + +原因:香港到旁路由的 SSH **走的就是那条反向 bridge**(`salmonstill.cn:38657 → portal → 隧道 → bridge → to_router_ssh → 192.168.1.199:22`)。一重启 xray 隧道就断,你自己的会话立刻死;命令跑到一半被杀,可能留下半残状态。tmux 挂在机器上,会话断了命令照样跑完。 + +**救援通道(xray 挂了、SSH 进不去时用)** + +``` +香港 → ssh root@49.232.242.90 # 北京 VPS,公网直连,不经任何隧道 + → ping -c3 10.0.0.2 # WireGuard 到旁路由(10.0.0.2 能通) + → ssh @192.168.1.166 # Spark(走 WG 转发进 LAN) + → ssh root@192.168.1.199 # 旁路由(LAN 内,防火墙放行) +``` + +> ⚠️ **不能直接 `ssh 10.0.0.2`**:WG 那块的 zone 只放行了「转发到 LAN」,到**路由器自己**的 INPUT 是 REJECT,会得到 `Connection refused`(但 `ping` 通,别被误导)。 + +**重建隧道**:`/etc/init.d/xray restart`;配置有问题时回滚 `/etc/xray/config.json.bak`。 --- @@ -1042,14 +1181,20 @@ BT Peer → salmonstill.cn:51413 → portal → 隧道 → bridge → to_qbit 3. 北京 VPS: 部署 Xray → systemctl restart xray 4. 北京 VPS: 部署 WireGuard → wg-quick@wg0 5. 北京 VPS: 部署 socat → systemctl start mc-forward -6. 搬瓦工 VPS: 部署 Nginx + Xray +6. 搬瓦工 / 东京 VPS: + 6.1 部署 Nginx(stream 块内联在 /etc/nginx/nginx.conf)→ nginx -t && systemctl reload nginx + 6.2 部署 Xray(含 portal-jp)→ xray run -test -c /usr/local/etc/xray/config.json && systemctl restart xray + 6.3 SearXNG: docker compose -f /opt/searxng/docker-compose.yml up -d 7. 旁路由: 部署 Xray → /etc/init.d/xray restart + ⚠️ 顺序:先 6.2(portal)再 7(bridge);反了可能「注册成功但数据不通」,重启一次 bridge 即恢复 8. 旁路由: 部署 Mihomo → /etc/init.d/mihomo restart 9. 旁路由: 配置 WireGuard + 端口转发 + SNAT(LuCI) 10. NAS: 创建 macvlan 网络 → 启动 qBittorrent 容器 11. NAS: 启动 Minecraft 容器 ``` +> 所有远程改动都在 `tmux` 里做(见上)。 + --- ## 验证命令 @@ -1059,9 +1204,12 @@ BT Peer → salmonstill.cn:51413 → portal → 隧道 → bridge → to_qbit ss -tlnp | grep -E '944[345]|3865[3-8]|51413|10809' systemctl status nginx xray wg-quick@wg0 mc-forward -# 搬瓦工 VPS -ss -tlnp | grep -E '443|9443' +# 搬瓦工 / 东京 VPS +ss -tlnp | grep -E '443|9443|38653' # 443 nginx / 9443 Reality / 38653 NAS dokodemo systemctl status nginx xray +journalctl -u xray | grep -E 'portal-jp|reverse-proxy-jp' | tail # bridge 注册情况 +curl -skI https://drive-jp.salmonstill.cn/ # 应返回 307(香港侧执行) +docker ps | grep searxng # SearXNG # 旁路由 ss -tlnp | grep -E '789[0-2]|1080' # Mihomo 端口 + Xray socks-lan diff --git a/dsh-local-403-fix/.DS_Store b/dsh-local-403-fix/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..202b42215ba85084767b53207d5e81acc9d7862b GIT binary patch literal 6148 zcmeHKy-veG4F0aEXb~MMCdM$ZQz7