链式代理
链式代理复用已有出站协议:每一跳完成自己的认证、加密和目标协商,下一跳需要上游连接时向前一跳申请字节流。它不引入额外 relay 协议。
完整配置
yaml
outbounds:
first:
type: socks
server: first.example:1080
username: alice
password: change-me
second:
type: http
server: second.example:8080
detour: first
exit:
type: shadowsocks
server: exit.example:8388
method: none
password: ""
detour: second
route:
final: exit
dns:
servers:
real: {type: udp, address: 1.1.1.1:53}
final: real两种写法
detour: first直接描述“这个出站怎么够到服务器”。type: chain按数组顺序串起至少两跳,后一跳可作代理承载。
链的非首跳不能自行拨号,也不能再写相冲突的 detour。naive 的 cronet carrier、Imina 的 cronet HTTP/2/3 等自行拨服务器的后端只能作为链首跳。
安全与协议边界
SOCKS5 和 HTTP CONNECT 本身通常不加密;链中的每一层只提供该协议自身的安全属性。Shadowsocks 的端到端加密也只能覆盖它实际承载的流,不隐藏链所有节点的时序和流量形状。
原生 UDP 不会因为 TCP detour 存在而自动可穿透。经 detour 时,能走 over-tcp/xudp 的代理才可继续承载 UDP;Imina 的流内数据报是例外。
失败契约
首包未发送时通常可以改试下一个成员;目标已明确回答时换成员无意义;首包可能已发出时必须报 Unknown,不能透明重放。可复用 mux/H2/L3 会话按实际路径和认证上下文隔离,selector 切换不会把旧路径会话交给新路径。