隧道内部
隧道把流量从一个节点(中继)送到其他节点(源节点),再由源节点发往互联网。本页说明表单中看不到的部分:两端如何互相信任、承载同一条隧道的多种方式如何汇成一个池,以及用户如何保持同一个出口地址。设置隧道见 隧道。
点击任意方框,查看那里发生了什么。
两个半边
隧道是位于两类节点上的两个半边,各自独立配置:
- 中继半边 是中继上的一个出站。中继的路由发给它的任何流量都会进入隧道。当中继恰好承载一条隧道时,面板会自动把它设为中继的最终出站,这样模板规则没有处理的所有流量都会走隧道。
- 源节点半边 是每个源节点上的一个入口。它接受中继打开的数据流,并交给源节点自己的路由,后者像对待到达那里的其他任何流量一样把它们送出去。
哪一端监听、哪一端拨号,是另一个独立的选择,即模式。在 反向 模式(默认)下,中继监听,每个源节点向它拨出,所以源节点不需要开放端口,可以位于 NAT 后面。在 正向 模式下,由中继拨号每个源节点。无论哪种方式,流量的方向都相同:用户、中继、源节点、互联网。
两个半边都不涉及节点的用户、入站或路由规则。隧道有自己的端口和自己的凭据;不会为它创建任何账户,也不使用任何入站。
凭据是派生的,从不存储
每个源节点都需要一个中继认可的凭据。面板不会生成凭据再存储起来:它根据面板中保存的一个机密、隧道名称和源节点派生出凭据。两个半边收到的是以同样方式计算出的同一个值,所以不存在可能在两台机器之间失去同步的存储副本。
这也是隧道名称在保存后无法修改的原因:两个半边携带的标签、凭据和证书名称都是由它构建的。
节点之间的链路默认由 REALITY 保护,或由 TLS 保护,所用证书由面板为隧道自己的名称签发,并由另一端固定。两者都在你保存时自动完成;没有需要填写的内容。
配置:进入同一条隧道的多种方式
一个配置(profile)就是承载隧道的一种方式:它自己的端口、自己的安全设置和自己的传输。一条隧道最多可以有八个配置。它们不是独立的隧道:每个配置上的每条链路,都以同一个源节点身份加入同一个会话池。
- 被封锁的协议损失的是吞吐量,而不是隧道。 如果某个配置的端口或协议被封锁,它的链路会断开,其他配置继续承载所有流量。
- 链路数就是权重。 每个源节点为每个配置保持多条链路(默认四条)。有六条链路的配置承载的流量,是有两条链路的配置的三倍。
- 每条链路都有自己的拥塞窗口,所以一个丢包只会让该链路上的数据流停顿。
有两个或更多配置时,负载均衡 决定如何使用这个池:
| 模式 | 由什么承载新连接 |
|---|---|
| 分摊 | 每个已连接的配置;新连接选择打开数据流最少的链路 |
| 优先级 | 列表中第一个已连接的配置;只有当它没有链路时才使用下一个 |
用户固定在一个源节点上
对于每个新连接,中继按以下顺序选择:
- 源节点,根据用户名称选择。只要该源节点保持连接,同一个用户每次都落在同一个源节点上。因此他们的出口地址在不同连接之间不会变化,网站就不会把他们登出或要求输入验证码。
- 配置,按负载均衡模式选择。
- 链路,选最空闲的一条。
两种负载均衡模式都不会改变用户到达哪个源节点。失去一个配置损失的是吞吐量;它永远不会把用户移到另一个出口。整个源节点失去时,只有原来在它上面的用户才会移到另一个源节点。
多个地址:热备切换
拨号一端会以同一个身份同时拨号监听节点的每个链接地址。所有地址都保持连接,所以不存在需要唤醒的备用链路:如果某个地址被封锁,它承载的链路会断开,而其他地址已经在承载流量。无法连接的地址(例如隧道无法穿过的 CDN 地址)会保持退避状态,其他地址照常工作。
变更实时到达节点
创建、编辑、停用或删除隧道,都不会重启任何一个节点的核心。
- 成员 变更实时生效:添加或删除源节点、轮换凭据、对端证书重新签发。已建立的链路保持不变;被删除源节点的链路会断开,并被拒之门外。
- 形态 变更会重建该隧道的半边:它的端口、安全设置、传输、负载均衡或窗口。只有这条隧道受影响;节点上的其他项目继续运行。
- 中继的最终出站 作为一次实时路由更新的一部分而改变。
实时变更和重建的一般工作方式见 无需重启的变更。
流量与计量
用户的流量在他们连接的地方计量:在中继上,计入其账户,只计一次。在源节点上,隧道流量不计入用户,其来源地址也不计入地址数限制,因为那里的来源是中继。隧道自己的流量图表显示经过它的有效载荷,数据从中继读取。
健康状态
隧道的健康状态无法从其设置中读出,所以面板会询问节点。
- 健康 表示中继有链路:显示为 n 个连接。
- 没有连接 表示中继在应答,但没有任何源节点连接到它。
- 中继不可达 表示面板无法访问中继。
实时状态 会询问隧道的每个节点:每个源节点的链路和数据流,以及在拨号一端期望的连接数、距下一次尝试的等待时间和最后一次错误。持续失败的拨号一端会退避,两次尝试之间最长一分钟。
配置正确但没有流量时
已建立却不承载任何流量的链路,或在封锁已解除后仍在等待退避结束的拨号方,恰恰都是面板想要的配置,所以同步找不到需要修改的地方。重置 会根据数据库在每个节点上重建隧道的半边:链路断开,拨号一端立即重新开始。在重新连接之前,该隧道上的流量会中断。
每个中继一条隧道
多个中继访问同一批源节点时,是每个中继一条隧道。这样从一个中继获取的凭据在另一个中继上打不开任何东西,添加中继也是新建一条隧道,而不是修改正在承载流量的隧道。创建副本 会为另一个中继复制一条隧道,并使用它自己的新密钥。
