Compare commits

..

2 Commits

Author SHA1 Message Date
YANG JIANKUAN
f741aeeccd feat: add telegram rules 2026-10-12 00:11:46 -07:00
YANG JIANKUAN
4c16575578 feat: add telegram rules 2026-10-12 00:08:43 -07:00
5 changed files with 145 additions and 1 deletions

View File

@@ -136,6 +136,22 @@ Clash 节点必须明确下发 UDP 能力:VMess/Trojan/纯 TCP SS/HY2
未匹配的 `/api/*` 显式返回 404,不落到 SPA 回退(否则会拿到一页 HTML,调接口时极难排查)。
### Surge Mac 与 Tailscale 共存
修改增强模式、DNS、STUN 或 VPN 路由前,先读 [docs/SURGE-TAILSCALE.md](docs/SURGE-TAILSCALE.md)。2026-10-06 已实测:独立 Tailscale 客户端设置 `--accept-dns=false`,Surge 仅将具体 tailnet 域名交给 `100.100.100.100`,配合 always-real-ip 和实际 Tailscale 网络扩展/CLI 的优先 DIRECT 规则。保留原有公网代理、AI DNS 和其他应用的 STUN 阻断;不使用 Exit Node,不需要向项目保存 Tailscale auth key。
**不能机械套用 `tun-excluded-routes = 100.64.0.0/10`**:本机实测该项创建指向物理网关的路由,覆盖 Tailscale 路由。最终配置不添加这些排除项。skip-proxy、DIRECT 和 VIF 路由排除是不同层次,必须检查实际路由表及普通应用连接。
tailscale ping 可通不代表 curl/SSH 可通;客户端显示 Running 也不代表公网未受影响。测试必须同时覆盖原代理、AI DNS、MagicDNS、普通 tailnet 服务和外网入站 SSH。使用 Tailscale CLI 做 netcheck 时也需进程例外,避免把自身 STUN 被阻断误判为网络不支持 UDP。测试 VPN 重连前设置失败自动 tailscale down 的恢复措施,并确认用户未同时手动切换。
现有订阅的持久来源是生产 settings/rules,模板仅供首次初始化;通过 update-db 技能先备份再走 API,不直接改托管文件或重置规则。结论仅限实测环境与场景:两种启动顺序、IPv4/IPv6 服务和蜂窝网络入站 SSH 已通过;睡眠唤醒、长期运行及网络切换尚未验证,不宣称“完美兼容”。
同账号/同 Surge 订阅不会同步 Tailscale 的本机 `accept-dns` 与 Exit Node 设置。新 Mac 必须逐台检查;MacBook Air 使用相同配置时仍曾保留 accept-dns=true,需在该机单独关闭。不要仅凭 Surge 自带探测成功认定普通应用正常,须另外测不使用显式代理的 curl。
### Telegram 跨平台分流(2026-10-11)
最新修复记录见 [docs/TELEGRAM-RULES.md](docs/TELEGRAM-RULES.md),规则快照见 [rules/telegram.list](rules/telegram.list)。生产已通过管理 API 添加 37 条高优先级自定义规则,Telegram 域名及 IPv4/IPv6 地址统一交给 `🚀 Proxy`;本机更新订阅后登录二维码恢复显示。仅配置 `osx.telegram.org` 不足以覆盖数据中心连接。此变更晚于上面的 2026-10-04 生产盘点,历史数量与规则顺序不能视为当前值;维护前仍须经 API 重读。规则快照不会自动跟随上游更新。
## 前端约定
UI 走「站牌导视」设计方向(轨道交通导视系统语言):白底 `#f7f7f4`、深藏青重点色 `#2b3f5c`、**琥珀 `#b26a00` = 直连出口、青 `#007a72` = WARP 净出口**,协议各有线路色圆标。颜色只在承载信息时出现——避免发光、亮边条、装饰性渐变。四个方向的设计对比留在 `docs/design-demos.html`。

53
docs/SURGE-TAILSCALE.md Normal file
View File

@@ -0,0 +1,53 @@
# Surge Mac 与独立 Tailscale 客户端共存
Surge 使用增强模式与原有公网代理、AI DNS 分流;Tailscale 负责 tailnet 路由。独立客户端保持原有登录,不需要在 Proxy Station 保存 auth key。
## 已验证的配置
本机 Tailscale 禁用系统 DNS 接管:`tailscale set --accept-dns=false`。tailnet 管理端仍启用 MagicDNS,本机 Quad100 仍回答显式发给它的查询。不要选 Exit Node。
这是逐设备的本机设置,不随 Tailscale 账号或 Surge 订阅同步。每台新 Mac 都需检查 accept-dns=false、Exit Node 未选择、实际网络扩展进程匹配直连例外。2026-10-06 MacBook Air 虽已载入相同 Surge 配置,accept-dns 仍为 true,随后单独关闭。未安装 CLI launcher 时使用 `TAILSCALE_BE_CLI=1 /Applications/Tailscale.app/Contents/MacOS/Tailscale set --accept-dns=false`。
生产 settings 的 General 在现有 skip-proxy 中追加 tailnet 域名、子域和 `fd7a:115c:a1e0::/48`;always-real-ip 追加 tailnet 域名、子域以及 Tailscale 控制服务域名。保留原有公共 DNS、DoH、AI DNS、include-all-networks=false。
Host 的具体值只写入生产设置,仓库示例使用占位符:
```ini
[Host]
tailXXXXX.ts.net = server:100.100.100.100
*.tailXXXXX.ts.net = server:100.100.100.100
```
删除持久 Host 设置中同域名旧的公共 DNS 映射,并检查最终生成配置的优先级。线上生成器还可能在后面追加同域名的公共 DNS 映射;Surge Host 首条匹配生效,因此显式 MagicDNS 映射必须在它们之前,实际 DNS 日志必须显示 Quad100。诊断优先使用完整 MagicDNS 名称;短名称依赖系统搜索域,禁用系统 DNS 接管后不保证可用。
将以下 DIRECT 规则置于 STUN 阻断之前:实际 Tailscale 网络扩展进程、`/Applications/Tailscale.app/`(包含 CLI)、tailnet 域名、`100.64.0.0/10` 和 `fd7a:115c:a1e0::/48`(IP 规则带 no-resolve)。其他应用的 STUN 阻断保持开启。
**不要在这台 Mac 上将整个 100.64.0.0/10 写入 tun-excluded-routes。** 实测 Surge 为该范围创建指向物理网关的路由,覆盖 Tailscale 的 /10 路由,造成内部 tailscale ping 可通但普通 TCP 服务不可达。移除额外排除项、禁用 Tailscale 系统 DNS 接管后,普通应用访问恢复。其他系统、版本和子网路由应重新检查实际路由表,不可照搬排除项。
模板用于新库初始化,现有订阅从数据库实时生成;通过 update-db 技能备份并更新 settings/rules,不修改客户端的托管文件,不重置规则。
## 验证与恢复
检查 Surge 增强模式开启、Tailscale Running;确认公网请求仍命中原代理,DNS 日志显示 tailnet 名称使用 100.100.100.100 并返回真实 IP。使用普通 curl/SSH 访问 peer 服务;tailscale ping 是附加检查,不能替代普通应用验证。检查 IPv4 和 IPv6 路由,不能仅看客户端显示已连接。
检查 tailscale netcheck 的 UDP 状态和 tailscale ping 的 direct/DERP/peer-relay 路径。中继可正常工作,是否直连还取决于两端 NAT 和防火墙。
2026-10-06 本机验证:增强模式开启,tailnet 普通 HTTP 服务经 IPv4、IPv6 均返回 200;MagicDNS 使用 Quad100,ChatGPT DNS 继续使用 AI 策略下的 Cloudflare DoH;公网代理请求返回 200。netcheck UDP=true,peer-relay 约 5 ms。两种启动顺序均通过真实服务访问。Tailscale 应用的 STUN 匹配 DIRECT,其他应用仍匹配 STUN REJECT。用户确认 iPhone 经蜂窝网络成功 SSH 到 Mac Studio;本机查看该 iPhone 的活动 peer 路径为 NJCQ-Relay 的 peer-relay,探测 RTT 为 53–69 ms。睡眠唤醒尚未验证。
本次变更前的生产在线备份为 `data/backups/before-tailscale-coexist-20261006-145847.db`;节点、策略组、订阅数量不变,新增 5 条直连规则。系统 DNS 接管原值为 true,现值为 false;恢复旧配置时需一并考虑该本机设置。
如果重载 Surge 后 Tailscale 已断开,等 Surge 稳定后重新连接 Tailscale。公网中断时先 tailscale down 恢复网络,再检查 DNS 与路由。未来增加子网路由、Exit Node 或更换客户端时重新验证。
## 排查过程中的教训
- 初始方案只依据通用路由排除说明,未考虑本机 Network Extension 的实际路由冲突。必须以 `route -n get <peer-IP>`、路由表和普通 TCP 服务为准;不能把官方通用机制当作本机已验证方案。
- Tailscale 系统 DNS 接管与 Surge 的 DNS 管理在本次环境中发生干扰。最终同时撤掉额外排除路由并禁用 Tailscale 系统 DNS 接管后恢复,不应将所有整机断网现象归因于单一因素。
- tailscale up 返回或接口就绪时,控制连接与 peer 路径仍可能在恢复。使用 `tailscale wait --timeout=25s`,并对真实服务做有限重试;保留公网失败时自动关闭 Tailscale 的恢复措施。
- CLI netcheck 的 STUN 不一定来自网络扩展进程。仅豁免网络扩展时 netcheck 曾显示 UDP=false;增加 Tailscale 应用路径例外后显示 UDP=true。测试其他应用的 STUN 阻断时避开已有特殊 IP 规则(如 AI DNS 的 1.1.1.1),否则命中的可能是更靠前的规则。
- 用户手动关闭 Tailscale 曾造成状态变化;日志的 userInitiated 不能直接解释成软件故障。先与用户协调测试窗口,不反复擅自重连导致用户再次断网。
- 判断是否经过自建 relay,应检查目标 peer 的 Active、PeerRelay、CurAddr 和探测输出,再用网络映射确认 relay 身份。访问 relay 节点本身可通,不能证明 iPhone 到 Mac 的连接经过它;显示 DERP 区域也不能覆盖当前 PeerRelay 的实际路径。经过 relay 不等于已测得相对 DERP 的性能提升。
- 入站 SSH 失败先检查 SSH 服务是否监听。此次 Mac 的 22 端口起初拒绝连接;用户开启远程登录后,蜂窝网络 SSH 成功,并在 Mac 看到来自 iPhone tailnet IP 的 ESTABLISHED 会话。
本次环境:Surge Mac 6.9.1、独立安装版 Tailscale 1.102.4、Mac Studio 的 macOS 27.0.1。睡眠唤醒、长期运行及网络切换恢复尚未覆盖;升级后应重新验证,不能据此承诺所有版本永久兼容。
参考:[Surge 虚拟网卡配置](https://manual.nssurge.com/profile/general.html)、[Surge 进程规则](https://manual.nssurge.com/rules/process.html)、[Tailscale Quad100](https://tailscale.com/docs/reference/quad100)、[Tailscale 手动 DNS 配置](https://tailscale.com/s/resolvconf-overwrite/)、[多 VPN 共存限制](https://tailscale.com/docs/reference/faq/other-vpns)。

21
docs/TELEGRAM-RULES.md Normal file
View File

@@ -0,0 +1,21 @@
# Telegram 跨平台分流
2026-10-11 排查发现:生产数据库虽然保留了 Sukka Telegram 规则集元数据,但没有引用它们的分流规则,也没有 Telegram 策略组。只有自定义 `osx.telegram.org → 🚀 Proxy`;其他 Telegram 域名和数据中心 IP 命中 `🎯 NoAuto → 🇨🇳 Mainland → DIRECT`。
本机失败请求包括 `pluto-1.web.telegram.org`、`venus-1.web.telegram.org`、`vesta-1.web.telegram.org`、`149.154.167.50`、`149.154.167.91`、`149.154.175.50`、`95.161.76.100` 和 `194.221.250.50`,当时收发量均为零。二维码登录需要先调用 `auth.exportLoginToken`,客户端拿到令牌后才生成二维码,见 [Telegram 官方说明](https://core.telegram.org/api/qr-login)。
## 已应用规则
规则快照在 [telegram.list](../rules/telegram.list),共 37 条:21 条域名后缀、11 条 IPv4、5 条 IPv6。通过管理 API 写入生产数据库,策略统一为 `🚀 Proxy`,来源为 `custom`,位于序号 0–36。IP 规则附带 `no-resolve`。这些规则随 Surge、Shadowrocket 配置和 Clash/Mihomo 订阅下发,覆盖 macOS、iOS、Android、Desktop 和 Web 共用的 Telegram 服务地址。
参考 [Sukka 域名规则](https://ruleset.skk.moe/List/non_ip/telegram.conf)、[Sukka IP 规则](https://ruleset.skk.moe/List/ip/telegram.conf)及 [blackmatrix7 规则](https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Surge/Telegram/Telegram.list)。官方 IP 段以 [Telegram CIDR 清单](https://core.telegram.org/resources/cidr.txt)为准,另补 Sukka 收录且本机实际出现的备用/探测地址。未整体导入第三方客户端、宽泛 ASN 或进程规则。
这是审核后的固定快照,不会自动跟随上游变化;未来新增地址需重新核对。原来的 osx.telegram.org 规则保留,已被 telegram.org 后缀覆盖。无需发布源码或重启生产服务。模板重置会保留自定义规则。
## 备份与验证
首次写入前在线 SQLite 备份:`/opt/proxy-station/data/telegram-before-20261012-112406.db`。写入后逐条核对数据库中的策略、启用状态、参数和顺序,并验证 Surge、Shadowrocket、Clash 三种输出全部包含这 37 条规则,生产健康检查正常。
本机执行 `surge-cli managed-profile update` 后,Telegram 域名、数据中心、备用地址均解析到 `🚀 Proxy → 🇺🇸 United States → 🇺🇸 US LA Trojan Direct`;`https://telegram.org` HTTP 探测返回 200。移动端需更新各自订阅/规则配置后生效。
客户端实测:Telegram 数据中心连接恢复双向流量,登录页完整二维码已显示;未执行扫码或账号登录。

45
rules/telegram.list Normal file
View File

@@ -0,0 +1,45 @@
# Telegram cross-platform routing snapshot, reviewed 2026-10-11.
# Domains: Sukka Telegram + blackmatrix7 Telegram (official ecosystem subset).
# IPs: https://core.telegram.org/resources/cidr.txt
# Additional fallback/probe IPs: Sukka Telegram IP list; observed on this Mac.
# https://ruleset.skk.moe/List/non_ip/telegram.conf
# https://ruleset.skk.moe/List/ip/telegram.conf
# https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Surge/Telegram/Telegram.list
# Append the production Proxy policy when importing; keep no-resolve on IP rules.
DOMAIN-SUFFIX,telegram.org
DOMAIN-SUFFIX,t.me
DOMAIN-SUFFIX,tx.me
DOMAIN-SUFFIX,tg.dev
DOMAIN-SUFFIX,legra.ph
DOMAIN-SUFFIX,graph.org
DOMAIN-SUFFIX,telega.one
DOMAIN-SUFFIX,telegra.ph
DOMAIN-SUFFIX,telesco.pe
DOMAIN-SUFFIX,telegram.me
DOMAIN-SUFFIX,tdesktop.com
DOMAIN-SUFFIX,telegram.dog
DOMAIN-SUFFIX,telegram.space
DOMAIN-SUFFIX,cdn-telegram.org
DOMAIN-SUFFIX,comments.app
DOMAIN-SUFFIX,contest.com
DOMAIN-SUFFIX,quiz.directory
DOMAIN-SUFFIX,stel.com
DOMAIN-SUFFIX,telegram-cdn.org
DOMAIN-SUFFIX,telegramdownload.com
DOMAIN-SUFFIX,usercontent.dev
IP-CIDR,91.108.56.0/22,no-resolve
IP-CIDR,91.108.4.0/22,no-resolve
IP-CIDR,91.108.8.0/22,no-resolve
IP-CIDR,91.108.16.0/22,no-resolve
IP-CIDR,91.108.12.0/22,no-resolve
IP-CIDR,149.154.160.0/20,no-resolve
IP-CIDR,91.105.192.0/23,no-resolve
IP-CIDR,91.108.20.0/22,no-resolve
IP-CIDR,185.76.151.0/24,no-resolve
IP-CIDR,95.161.64.0/20,no-resolve
IP-CIDR,194.221.250.50/32,no-resolve
IP-CIDR6,2001:b28:f23d::/48,no-resolve
IP-CIDR6,2001:b28:f23f::/48,no-resolve
IP-CIDR6,2001:67c:4e8::/48,no-resolve
IP-CIDR6,2001:b28:f23c::/48,no-resolve
IP-CIDR6,2a0a:f280::/32,no-resolve

View File

@@ -26,9 +26,11 @@ allow-hotspot-access = true
# --- COMPATIBILITY / 兼容性 ---
compatibility-mode = 1
# --- NETWORK / 网络 ---
skip-proxy = localhost, *.local, captive.apple.com, guzzoni.apple.com, 0.0.0.0/8, 10.0.0.0/8, 17.0.0.0/8, 100.64.0.0/10, 127.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.0.0.0/24, 192.0.2.0/24, 192.168.0.0/16, 192.88.99.0/24, 198.18.0.0/15, 198.51.100.0/24, 203.0.113.0/24, 224.0.0.0/4, 240.0.0.0/4, 255.255.255.255/32
skip-proxy = localhost, *.local, captive.apple.com, guzzoni.apple.com, 0.0.0.0/8, 10.0.0.0/8, 17.0.0.0/8, 100.64.0.0/10, 127.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.0.0.0/24, 192.0.2.0/24, 192.168.0.0/16, 192.88.99.0/24, 198.18.0.0/15, 198.51.100.0/24, 203.0.113.0/24, 224.0.0.0/4, 240.0.0.0/4, 255.255.255.255/32, fd7a:115c:a1e0::/48
exclude-simple-hostnames = true
read-etc-hosts = true
# Tailscale: keep its own routes; a /10 exclusion can override them on macOS.
# Configure tailnet-specific MagicDNS mappings as documented in docs/SURGE-TAILSCALE.md.
# --- DNS / 域名系统 ---
use-local-host-item-for-proxy = true
encrypted-dns-follow-outbound-mode = false
@@ -107,6 +109,13 @@ Speedtest = select, Mainland, Automatic, AllServer, no-alert=0, hidden=0, includ
[Rule]
# Tailscale transport must precede STUN blocking (Surge Mac only).
PROCESS-NAME,/Applications/Tailscale.app/,DIRECT
PROCESS-NAME,io.tailscale.ipn.macsys.network-extension,DIRECT
PROCESS-NAME,IPNExtension,DIRECT
PROCESS-NAME,tailscaled,DIRECT
IP-CIDR,100.64.0.0/10,DIRECT,no-resolve
IP-CIDR6,fd7a:115c:a1e0::/48,DIRECT,no-resolve
# 阻断 STUN,避免未匹配请求落到直连兜底
PROTOCOL,STUN,REJECT
AND,((PROTOCOL,UDP), (DOMAIN-SUFFIX,googlevideo.com)),REJECT-NO-DROP