Skip to content

Latest commit

 

History

History
132 lines (115 loc) · 9.94 KB

CONFIG.md

File metadata and controls

132 lines (115 loc) · 9.94 KB

高级配置

settings.json 键位契约

位置固定:exe 同目录(与 routes.json 同级)。启动读一次,任一开关变更即整份重写。

{
  "closeToTray": true,
  "mitm": true,
  "winRect": [641, 278, 1820, 1394],
  "githubPAC": true,
  "proxyBackup": "",
  "lastIp": {
    "core/all": "20.27.177.114",
    "api/all": "140.82.114.6",
    "edge/content": "185.199.110.133",
    "edge/assets": "185.199.108.154",
    "edge/io": "",
    "edge/auth": ""
  }
}
  • lastIp 的 6 个键由 pool::circle_keys() 派生(SERIAL_POOLS × POOL_ROUTES 族表),从上到下顺序固定、不可调换;写盘恒为全量 6 位,未驻留的族写 ""
  • "" / 缺键 / 整段 lastIp 缺失,三者行为等价:该族游标为空,串发从表序 0 号位起步。写空串的唯一意义是让 schema 一眼看全、diff 稳定
  • 手改容错:漏键 → 该键回默认;某字段类型写坏(如 winRect 写成字符串)→ 只回退该字段,不连坐整份配置;lastIp 读兼容对象与 [[k,v],…] 数组两种形态(写只写对象)
  • 布尔键缺失 = false;winRect 缺失或宽高小于 400×300 时按默认位置开窗

routes.json 手改指南

{
  "routes": {
    "api.github.com": {
      "pac": "api.github.com",
      "plans": [
        { "ip": "140.82.112.5", "sni": "baidu.com" }
      ]
    },
    "github.com": {
      "pac": "github.com",
      "plans": [
        { "ip": "140.82.112.3", "sni": "baidu.com" },
        { "ip": "20.205.243.166" }
      ]
    },
    "*.githubusercontent.com": {
      "pac": "githubusercontent.com",
      "content": true,
      "fallback": "mirror",
      "plans": [ { "ip": "185.199.108.133", "sni": "baidu.com" } ],
      "realPlans": [ { "ip": "185.199.108.154", "sni": "" } ]
    },
    "objects-origin.githubusercontent.com": {
      "pac": "objects-origin.githubusercontent.com",
      "action": "direct"
    }
  },
  "mirrors_big": {
    "codeload.github.com": ["https://gh-proxy.com", "https://ghfast.top"],
    "release-assets.githubusercontent.com": ["https://gh-proxy.com"]
  },
  "mirrors_small": {
    "raw.githubusercontent.com": ["https://gh-proxy.com", "https://ghfast.top"]
  }
}
  • 键就是域名,只有两种写法:github.com = 自己 + 任意级子域;*.github.com = 只认子域(裸域不命中)

  • 多条同时命中时取最长的键,所以 api.github.com 天然压过 github.com——不用操心书写顺序

  • plans 是伪装腿的候选 IP,realPlans 是真名腿(隧道 / real: true)额外可用的候选;条目顺序 = 优先级,第一行是表头,ip/sni 写法见下

  • action: "direct" 不进代理;real: true 真名 + ClientHello 分片;content: true 走内容域熔断与短响应预算;donor: true 允许被借道

  • fallback:省略 = dns(全灭后走系统 DNS 兜底腿);mirror = 全灭后走镜像链

  • pac 决定这个域名进不进 PAC 名单:不写就等于系统直连,代理完全看不到它

  • 老版本(0.5.3 及以前)的 routes 数组 + match 正则写法仍能读,启动时自动折算成域名键,下次落盘就变成上面的格式;只认程序当年生成的三种形态((.*\.)?x、.*\.x、字面量),手写的其他正则会连同原文件备份后丢弃

  • 镜像链分两个字典:mirrors_big = 大文件域(objects / release-assets,分片竞速),mirrors_small = 图片与文本资源域(raw / gist / avatars / user-images / media / codeload);分类权在域名,条目放错字典启动时也会被归位

  • 「自定义镜像」列表 = 镜像链的全部内容(不是追加项):手改进 routes.json 的条目重启后会被收编进列表,此后以列表为准;界面保存前会自动合并服务端最新清单,旧页面不会覆盖新收编条目

  • 默认安装不带任何镜像(双字典为空):小文件走直连兜底;大文件域无链时候选仅直连(伪装 SNI 直拨),直连也被阻断才 502——502 页面会指引补镜像

  • 旧版单字典 "mirrors" 仍可读(启动自动按域名归类),下次落盘转为双字典

  • 大文件域选谁不按链序硬排:代理按「预计最早下完」在镜像与直连之间动态分流(ECT 时间槽);链序只决定失败时的顺延次序。codeload 已并入小文件派发:直连优先,失败按校准链序逐家

  • 条目顺序 = 优先级,第一行是表头;sni 原样透传进 TLS 握手,代理不解释:带点域名 = 伪装(SNI=所写值,哪怕碰巧写真名);"" = 无 SNI(ClientHello 不带扩展);要真名就把 host 名写进 sni。非法字符(防注入)该条剥除

  • 表序固定、运行时零重排:串发从 settings.json 记忆的游标(上次驻留 IP)起步,沿表顺序转圈——成功驻留、失败沿圈前进(dead 表跳过死位);想让某条先被试,把它排到前面即可。运行时唯一写盘 = 故障转移时 settings.json 里几字节的游标更新

  • 手改重启生效;运行中的轮换 2 秒内自动写回(手改请先关代理,避免被写回覆盖)

  • 表会自愈:缺 IP 时启动自动从内置种子补齐(只追加尾部,不打乱你排的顺序);池外镜像/未知 host 写了也会被剥掉

  • 镜像链数据权威:任何支持拼接的 https 镜像都可写(含自部署),顺序 = 优先级;无白名单校验,坏镜像运行期自然失败沉底;缺链 host = 无镜像腿

  • seeds.json 是生成物:routes.json 的全量快照(路由表 + 镜像链),仅用于全新安装引导和补缺,勿手改——更新方式 = 停代理后用调好的 routes.json 覆盖它

认 IP 速查

条目放哪个段不影响行为——代码按 IP 末段路由,段只是容器:

看到这种 IP 它是谁 干什么活 SNI 形态
140.82.x.3 / .4 主站边缘 github.com 网页 伪装
140.82.x.5 / .6 API 专用边缘 api.github.com(与网站 IP 互斥) 伪装
140.82.x.29 / .30 授权边缘 githubapp.com 登录/OAuth 回调 伪装
20.205.243.161 上传源站(alambic) uploads.github.com(直连白名单,代理不拨它) —
20.x.x.x、4.237.x、172.182.x 等杂段 主站边缘备选 github.com 网页 伪装
185.199.x.133 Fastly 内容边缘 avatars / raw / gist / camo 等 伪装(2026-10-19 晚起,原真名)
185.199.x.215 Fastly 静态边缘(新) githubassets 的 CSS/JS 伪装
185.199.x.154 Fastly 静态边缘(旧代,状态波动以实测为准) 同上 伪装
185.199.x.153 Fastly Pages 边缘 github.io 站点 伪装
140.82.x.9、20.205.243.165、20.27.177.114 codeload 专用边缘 源码包打包服务(2026-11-02 起 codeload 直连优先,失败走校准镜像链;2026-10-19 测绘发现) 伪装
4.249.131.160 Azure(Copilot 代理) copilot-proxy.githubusercontent.com 真名 + 分片(wl_azure 族专用)

白名单域名例外:docs / support / resources / desktop / pages / skills / archiveprogram / socialimpact / raw.github.com 也落在上面这几个 Fastly 段,但它们不用伪装——走真名 SNI + ClientHello 分 3 片,由 edge 的 wl* 四族接管(见 路由表 第 3 节)。同一段 IP 被两组族共用,各按自己判据筛。

即:末段 .3/.4 = 网页,.5/.6 = API,.29/.30 = 授权,.9 = codeload;185.199 段看末段——.133 = 内容(真名),.215 = 静态(新),.154 = 静态(旧),.153 = Pages。此分工由边缘行为实测标定,routes.json 里的段位置改变不了它。

2026-10-19 晚全量测绘补充:① web 族(.3/.4 与 Azure 杂段)对其余 vhost 一律 301 正确重定向——接得住但不交付,不可当多面手使;唯一的全服务 IP 是 140.82.113.22(objects-origin 的 GLB 族,9/10 服务直出 200)。② Fastly 四段(.133/.153/.154/.215)服务互通:raw/avatars/io/assets 在四段上都有响应,按段分族是负载与历史划分,非服务边界。③ 伪装 SNI 在 .133 上亦出内容且默认证书 SAN 覆盖 *.githubusercontent.com(证书校验可过)——2026-10-19 晚 content 族已切换为伪装(当时真名反遭 RST);若某窗口伪装失效,应急回退 = 手改 routes.json 该条 "sni": "sni"(关代理改,重启生效)。④ IP 退役清单机制已整体删除——死活全凭串发实测(失败沉底、成功置顶),routes.json 写什么就试什么,代码不再持有任何 IP 名单。

分流域名总表

流量 上游路径
github.com 及其余子域 主站候选直连串发 + gh_defuse
api.github.com api 池直连串发(API 专用边缘,与网站 IP 互斥)
uploads.github.com 直连白名单(DNS 直达 alambic .161)
viewscreen.githubusercontent.com 直连白名单(mermaid 渲染)
githubapp.com、githubassets、github.io edge 池直连串发
avatars/camo/gist/raw 等内容域 edge 直连优先 → 熔断后镜像链
codeload 直连优先,失败按校准镜像链逐家(已并入小文件派发)
objects / release-assets 镜像 only(分片竞速,ECT 时间槽派发)
github.com 的 /archive、/releases/download(含 latest) release-assets / codeload 专属镜像链,全灭 502
objects-origin.* 直连白名单(该 vhost 仅 GLB 族服务,主站边缘对其 301 无 CORS)
docs / support / resources / desktop / pages / skills / archiveprogram / socialimpact / raw.github.com 主路由白名单:进 edge 池,真名 SNI + 首包分片;段内 IP 连不上自动换候选,全灭退回系统 DNS
copilot-proxy.githubusercontent.com 主路由白名单:同上,走 Azure 4.249.x 段
其余一切域名 系统 DNS 直连,不经任何表

详细判据与实测数据见 路由表。