从模板到链接
用户的订阅在其应用请求时,根据面板当时掌握的内容构建。不做任何缓存,也不向节点发送任何东西,所以对地址、前置或名称模板的修改在下一次获取时即生效。本页跟随构建过程,从用户的模板一直到应用收到的字节。相关设置见 订阅与订阅页面。
1. 用户能访问哪些入站
面板从账户开始:
有些入站会在途中被省略或调整:
- ingress 后面的入站 通过 ingress 的端口、以其路由匹配的名称访问,因为用户的应用首先与 ingress 通信。同时保留自己端口的入站会得到两个条目:一个直连,一个经由 ingress。两种方式都无法访问的入站会被省略。
- 入站开启 仅经由前置 后,对于每个有前置成功生成条目的用户,会去掉它的直连条目。
- 应用无法使用的条目 会被丢弃,而不是写成损坏的条目,因为一个坏条目会让某些应用拒绝整个文件。
端点(WireGuard、OpenVPN、OpenConnect)以应用拨号的隧道形式出现。WireGuard 密钥和用户在隧道内的地址由面板根据用户的 id 生成,所以文件与节点总是一致。
2. 地址与前置:相加,绝不相乘
每个节点上的每个入站,按该节点的每个链接地址各生成一个条目。然后入站上的每个域名前置再增加一个条目,只加一次,与节点数量无关。
3 nodes × 2 link addresses = 6 direct entries
2 fronts on the inbound = 2 front entries
8 entries原因在于每个条目属于谁。链接地址是访问某一台机器的另一种方式,所以它按节点重复。前置是 CDN 为该入站起的名称,由 CDN 选择转发到哪台源服务器,所以一个前置覆盖提供该入站的所有节点。
- 第一个链接地址是主地址。 WireGuard、OpenVPN 和 OpenConnect 条目,以及可下载的
.conf和.ovpn文件,都只使用它,因为保存下来的文件无法携带备选地址。 - 面板拨号访问节点所用的地址 与节点的链接地址是分开的。面板可以通过私有地址访问节点,而用户通过公网地址访问。
- 前置会替换 条目的地址、端口、服务器名称、Host 头、ALPN 和指纹,并去掉证书固定值和任何端口跳跃范围:CDN 出示自己的证书,并只在一个端口上监听。
3. 每个入站的客户端选项
入站有给节点的设置,也有给应用的设置。第二类位于 客户端设置(链接与订阅) 下,只在构建链接时使用,永远不会发送给节点。它可以(但不限于):
- 公布一个不同于节点的地址或端口,用于需要经过前面某样东西才能访问的入站;
- 设置服务器名称、ALPN、指纹或其他客户端 TLS 选项;
- 设置只有客户端读取的选项,例如端口跳跃间隔。
如果条目的地址是入站客户端设置中指定的,就不会复制到节点的其他链接地址上:那个地址是你特意指定的。
4. 客户端 TLS:三层,逐字段合并
应用得到的 TLS 信息来自三个地方。每个字段取自设置了它的最具体的那一层:
| 优先级 | 设置位置 | 典型用途 |
|---|---|---|
| 1(优先) | 入站的 客户端设置(链接与订阅) | 某一个入站的服务器名称或 ALPN |
| 2 | 节点证书的客户端设置 | 对使用该节点证书的每个入站都相同的设置 |
| 3 | 面板证书的客户端设置 | 多个节点共用的证书的共享默认值 |
三层之下是从证书本身推导出的值:服务器名称是证书上的第一个 DNS 名称(从不使用通配符),自签名证书会被标记为需要固定。REALITY 入站完全跳过证书这几层:它们携带的是自己的公钥和 short id。
5. 证书固定值
固定值(pin)是客户端应接受的那张证书的指纹。面板在签发或续期证书时计算它;你永远不需要手动输入。
- 自签名证书总是被固定,所以应用校验的是那一张确切的证书,而不是接受任何证书。
- 上传的证书 只有在其客户端设置关闭了校验时才会被固定。
- ACME 证书从不固定:有公共证书机构为它担保,而且它每次续期都会变化。
每种格式都以其应用能读取的形式携带固定值;对于支持固定值的应用,会优先提供固定值,而不是关闭校验。自签名证书续期时,其固定值会改变,应用在下一次刷新时获得新的固定值。参见 证书的签发与续期。
6. 名称
每个条目都需要一个应用显示的名称。链接名称 下的 名称模板 为空时,条目使用面板的固定名称。像 {USER} · {ROUTE} · {REMAINING} 这样的模板会按条目填入账户、入站、节点、路线(链接地址或前置的标签)、拨号地址、用量和到期时间。为空的变量会连同其分隔符一起去掉,未知的变量按原样保留,解析后为空的名称会退回固定名称。应用按名称记住用户选择的条目,所以模板应该选定一次,而不要经常修改。
7. 每个应用读取的格式
同一个订阅地址可以按多种格式应答:
| 格式 | 读取方 |
|---|---|
| 分享链接,base64(默认) | 大多数应用:v2rayNG、v2rayN、Streisand、Happ、Shadowrocket |
| 纯文本分享链接 | 任何按每行一个链接读取的程序 |
| Clash | Clash Meta 和 Stash 应用 |
| sing-box 配置 | sing-box 应用:SFA、SFI、Hiddify、Karing |
| Xray JSON 配置 | 导入完整配置的 Xray 客户端 |
| 订阅页面 | 浏览器 |
格式按以下顺序选择:地址中指定的格式(格式路径或 ?format=)总是优先。否则,浏览器得到订阅页面,应用则按其名称识别并得到对应格式。结构化格式基于一份你可以在 订阅默认配置 中替换的基础文档;生成的条目会合并进去,并带有一个测试所有条目的默认分组。
8. 随文件一起传递的内容
订阅响应还携带一些头部,应用无需用户打开任何东西就能显示:配置标题、额度和到期进度条、刷新间隔、公告、支持链接,以及返回页面的链接。其他文字系统的文本会按这些应用期望的方式编码。详情见 订阅与订阅页面。
9. 交付文件之前
- 设备数限制。 标识了自身设备的应用,会在发送任何内容之前计入用户的 设备数限制。超出限制的设备会被拒绝,已计入的设备则继续获取。除非开启了严格设置,否则不发送设备 id 的应用照常获得服务。这是设备数限制唯一生效的地方;节点永远看不到设备。参见 流量、额度与限制。
- 获取会被记录。 交付正文时会写入时间、应用和地址。账户的首次获取会发出一个事件。在浏览器中打开页面会单独记录,所以它永远不会覆盖用户用来连接的应用名称。
地址从哪里来
订阅地址本身构建在你的第一个订阅域名上,或在通配符域名下为每个订阅者生成的主机名上,或在面板的公开地址上。列表中的每个域名都会继续为它签发过的链接提供服务,所以替换被封锁的域名时,要先添加一个新域名。在这些名称上,面板只在其基础路径下应答,所以客户持有的地址不会透露面板在哪里管理。参见 订阅与订阅页面 和 域名前置。
