9. 出站协议配置#
出站协议决定 Link1 最终如何连接目标或上游服务。所有静态出站节点写在 proxies 中;订阅、文件、内联或 WARP 动态节点写在 proxy-providers 中。
本章把每个协议当成“用户要配置的一种出口”来讲,不只列字段。读每个协议时请同时看四件事:
- 它解决什么问题:普通代理、加密代理、L3 VPN、企业 VPN、还是特殊出口。
- 一条连接如何走:Link1 到上游之间使用 TCP、UDP、QUIC、TLS、WireGuard、OpenVPN 还是企业专有协议。
- 字段改变什么行为:认证、证书、传输层、DNS、UDP、路由、性能参数分别会影响哪一段。
- 常见误区:哪些字段不是这个协议的字段,哪些字段看起来相似但含义不同。
如果你是第一次配置某个协议,建议先复制本章示例,只改服务商给你的账号、地址、端口、密码/密钥;跑通后再调整高级字段。
出站节点通用结构#
proxies:
- name: node-name
type: socks5
server: 127.0.0.1
port: 1080
通用字段:
| 字段 | 含义 | 实际影响 |
|---|---|---|
name | 节点名称 | 必须唯一,可被策略组和规则引用 |
type | 协议类型 | 决定使用哪个出站协议实现 |
server / address | 远端地址 | 大多数协议使用 server;少数协议兼容 address |
port | 远端端口 | 0 通常视为未配置 |
dialer-proxy | 前置代理 | 先通过另一个节点拨号,再连接本节点远端 |
interface-name | 绑定网卡 | 多网卡/路由器场景控制出口网卡 |
routing-mark | Linux mark | 配合策略路由 |
ip-version | IP 选择策略 | 控制解析/拨号偏向 IPv4/IPv6 |
tfo | TCP Fast Open | 支持的 TCP 协议可减少握手延迟 |
mptcp | Multipath TCP | 支持的平台/协议可使用多路径 TCP |
udp | UDP 支持 | 影响 UDP 转发、游戏、QUIC、DNS 等 |
不是每个协议都支持所有通用字段。Link1 会在配置编译期拒绝协议不支持的字段。
通用字段怎样影响数据流#
这些字段不属于某个单独协议,而是影响“Link1 到上游”这一段如何拨号:
| 字段组 | 字段 | 用户应该怎么理解 |
|---|---|---|
| 命名与引用 | name、type | name 是规则和策略组引用的名字;type 决定后面所有字段按哪个协议解释。 |
| 远端定位 | server、address、port、port-range、ports | 决定上游在哪里;ports/port-range 通常是端口跳跃或协议特定能力,不是普通备用端口。 |
| 前置链路 | dialer-proxy | 当前节点不直接连上游,而是先走另一个节点;常用于“先连本地代理,再连企业 VPN/远端节点”。 |
| 出口选择 | interface-name、routing-mark、ip-version | 控制底层 TCP/UDP 从哪张网卡、哪个策略路由、哪个 IP 族出去。 |
| TCP 能力 | tfo、mptcp | 只影响支持 TCP 的协议;系统或上游不支持时可能无效果。 |
| UDP 能力 | udp | 影响 DNS、QUIC、游戏、语音、WireGuard/MASQUE 等 UDP 流量是否能走该节点。 |
dialer-proxy 是最容易误解的字段。它不是“这个节点的备用节点”,而是“连接这个节点的服务器时,先通过另一个出站”。例如 trojan 节点使用 dialer-proxy: PROXY,表示 Trojan 在连接自己的 server:port 时先通过 PROXY 组建立底层连接;协议握手完成后,这个 Trojan 节点仍按自己的协议处理最终业务流量。
协议总览#
type | 类别 | 它如何工作 | 何时选择 | 主要风险/注意点 |
|---|---|---|---|---|
direct | 特殊出口 | Link1 直接连接目标 IP/域名 | 内网、国内站、无需代理的目标 | 仍经过 Link1,只是最终直连 |
reject | 特殊出口 | Link1 直接拒绝连接 | 广告、恶意域名、禁止访问 | 可能导致应用反复重试 |
dns | 特殊出口 | 把连接交给内置 DNS resolver | DNS 规则或内部 DNS 转发 | 普通用户很少手写 |
http | 显式代理 | Link1 连接一个 HTTP proxy,上游再 CONNECT/转发目标 | 公司代理、上游 HTTP 代理 | HTTP 上游通常不承载 UDP |
socks / socks5 | 显式代理 | Link1 连接 SOCKS5 上游,由 SOCKS5 服务器连接目标 | 本地代理链、简单上游 | UDP 依赖 SOCKS5 UDP associate |
ssh | 隧道 | 先登录 SSH,再通过 SSH channel 转发 TCP;UDP 需 udpgw | 有 SSH 服务器、内网跳板 | 主机密钥校验很重要 |
vmess | 加密代理 | VMess 用户身份 + 可选 TLS/WS/H2/gRPC/KCP 等传输 | 兼容旧 VMess 节点 | alterId、传输层和 TLS 要与服务端一致 |
vless | 加密代理 | VLESS 用户身份 + TLS/REALITY/Vision/传输层 | REALITY、Vision、XUDP 节点 | flow、REALITY、SNI 错一个就握手失败 |
trojan | 加密代理 | Trojan 密码认证,通常伪装成 TLS 服务 | 简洁 TLS 代理 | 证书/SNI 与密码都要匹配 |
ss / shadowsocks | 加密代理 | AEAD/2022 等加密代理,可选插件 | 轻量代理、路由器 | cipher/password/plugin 必须与服务端一致 |
ssr / shadowsocksr | 加密代理 | SS + obfs/protocol 兼容扩展 | 旧 SSR 节点 | 参数组合多,订阅字段容易不一致 |
shadowtls | 包装/伪装 | 用 ShadowTLS 包一层 TLS 伪装,再承载后续流量 | 需要 ShadowTLS 上游 | 版本、密码、SNI 必须一致 |
tuic | QUIC 代理 | 基于 QUIC 的认证和 UDP/TCP 转发 | 移动网络、UDP 场景 | UDP 被阻断时体验会很差 |
hysteria | QUIC 代理 | Hysteria v1,带带宽和端口跳跃参数 | 旧 HY1 节点 | v1/v2 字段不能混用 |
hysteria2 / hy2 | QUIC 代理 | Hysteria2 密码认证 + QUIC + 可选 Salamander 混淆 | 高性能代理、移动网络 | obfs 和证书参数要匹配 |
juicity | QUIC 代理 | UUID/password 认证的 QUIC 代理 | Juicity 服务端 | 拥塞控制和证书参数影响连通 |
naive | HTTP/2/3 代理 | NaiveProxy 风格 HTTP/2/3 上游 | Caddy/NaiveProxy 生态 | 本质是带认证的 HTTP/2/3 上游 |
snell | 加密代理 | Snell PSK 认证,v4/v5 支持 TCP,v3/v4/v5 支持 UDP | Snell 服务端 | 版本与 obfs 要匹配 |
gost-relay | 代理协议 | Link1 连接 GOST relay 服务端并发送 relay CONNECT | GOST relay TCP 上游、链式跳板 | 首版只支持 TCP,不支持 UDP/TLS/mTLS/mux |
anytls | 加密代理 | AnyTLS 密码认证 + TLS 隧道 | AnyTLS 服务端 | 仍要处理 SNI/证书/指纹 |
brook | 代理协议 | Brook 多种 server transport,可选 WS/WSS/QUIC/mask | Brook 服务端 | network 决定许多字段是否可用 |
mieru | 代理协议 | Mieru 用户认证 + TCP/UDP 传输 | Mieru 服务端 | transport、multiplexing、handshake 要匹配 |
trusttunnel | 隧道 | HTTP/2 ALPN 的轻量隧道,支持 UDP over stream | TrustTunnel 服务端 | ALPN 必须包含 h2 |
sudoku | 扩展协议 | 密码/密钥 + AEAD + padding/table/http-mask | Sudoku 服务端 | padding/table/mask 参数需服务端一致 |
wireguard / wg | L3 隧道 | 建立 WireGuard 虚拟三层链路 | WARP、自建 WG、企业隧道 | allowed-ips 是隧道路由语义,不是规则 |
masque | HTTP/3 隧道 | 通过 HTTP/3 MASQUE CONNECT-UDP/IP 建隧道 | WARP MASQUE、支持 MASQUE 的服务 | QUIC、URI、证书、MTU 都会影响连通 |
tailscale | 组网/VPN | 登录 Tailnet/Headscale,使用 exit node 或路由 | 设备组网、内网访问 | 受控制面策略和节点授权影响 |
openvpn | VPN | OpenVPN 控制面握手 + userspace netstack 转发 | 企业 OpenVPN、传统 VPN | DNS/路由来自 push 或配置,不能当普通代理 |
atrust | 企业 VPN | 登录 ATrust,拿到企业路由/DNS 后作为出口 | 深信服/企业接入 | 认证策略、验证码、设备绑定影响很大 |
feilian | 企业 VPN | 登录飞连并选择 VPN 网关 | 飞连企业网络 | 网关选择与会话持久化很关键 |
easyconnect | 企业 VPN | 登录 EasyConnect 后作为企业 VPN 出口 | EasyConnect 企业网络 | 服务端版本/策略差异较大 |
warp | WARP provider | 不直接作为 leaf;通过 provider 物化 WireGuard/MASQUE 节点 | Cloudflare WARP 出口 | 必须写在 proxy-providers,不能写在 proxies |
协议配置可以从上游资料反推:
- 给你的是“代理地址 + 端口 + 用户名密码”,通常是
http、socks5、naive或企业 VPN。
- 给你的是“UUID + TLS/REALITY/WS/gRPC”,通常是
vmess/vless。
- 给你的是“password + TLS 443”,可能是
trojan、hysteria2、tuic、anytls。
- 给你的是“private key/public key/allowed ips”,通常是
wireguard或 WARP manual。
- 给你的是
.ovpn、ca.crt、client.crt、tls-auth,通常是openvpn。
我该选哪种出站#
如果你不是在“自己设计服务端协议”,而是在把别人给你的账号填进 Link1,先按服务商给的材料选协议,不要凭感觉改类型。下面的表是从用户场景出发的选择建议:
| 场景 | 优先看哪些协议 | 为什么 | 不建议一上来做什么 |
|---|---|---|---|
| 公司给了 HTTP/SOCKS 代理 | http、socks5 | 字段少,通常只有地址、端口、用户名密码。 | 不要误写成 HTTP Engine;HTTP Engine 是内容改写模块,不是上游 HTTP proxy。 |
| 机场/订阅节点 | vmess、vless、trojan、ss、hysteria2、tuic | 这些是常见代理节点类型,订阅一般已经包含协议字段。 | 不要随意改 network、tls、sni、flow、obfs,它们必须与服务端一致。 |
| 自己有一台 SSH 服务器 | ssh | 不需要部署专门代理服务,就能通过 SSH channel 转发 TCP。 | 不要把 SSH 当高性能 UDP 代理;UDP 需要 udpgw 支持。 |
| 需要高性能、移动网络、UDP | hysteria2、tuic、wireguard、masque | QUIC/WireGuard 类协议更适合 UDP 和网络切换。 | 如果本地网络封 UDP,先排查 UDP 可达性,不要只改密码或证书。 |
| Cloudflare WARP 出口 | proxy-providers.type=warp | WARP 会生成 WireGuard/MASQUE 候选节点,天然是 provider。 | 不要写 proxies[].type=warp。 |
| 企业 VPN/内网访问 | openvpn、atrust、feilian、easyconnect、tailscale | 这些协议会带来内网路由、企业 DNS 或设备登录态。 | 不要只把它当“代理端口”;DNS、路由、账号状态都要一起看。 |
| 局域网/国内站点直连 | DIRECT 或 direct | 目标不需要代理,直连延迟最低。 | 不要把所有流量都塞进远端节点,内网地址应优先直连。 |
| 广告/恶意域名拦截 | REJECT 或 reject | 直接拒绝连接,减少无意义出站。 | 拦截范围不要过宽,否则应用可能一直重试或功能异常。 |
一个简单决策树:
你拿到的是现成节点/订阅吗?
是 -> 按节点 type 填,不要换协议
否 -> 是企业 VPN/内网账号吗?
是 -> openvpn / atrust / feilian / easyconnect / tailscale
否 -> 是 WARP 吗?
是 -> proxy-providers.type=warp
否 -> 只是上游代理端口吗?
是 -> http / socks5 / naive
否 -> 自建服务端按服务端协议选择
TLS、传输和扩展字段#
很多协议共享 TLS 字段:
tls: true
skip-cert-verify: false
servername: example.com
sni: example.com
alpn: [h2]
client-fingerprint: chrome
实际影响:
tls=true开启 TLS 包装或协议 TLS 模式。
skip-cert-verify=true会跳过证书校验,降低安全性。
servername/sni改变 TLS 握手域名。
alpn影响 HTTP/2、HTTP/3 或协议协商。
client-fingerprint改变 ClientHello 指纹,需协议支持。
VMess/VLESS/Trojan 常见传输:
network: ws
ws-opts:
path: /ws
headers:
Host: example.com
network | 配套字段 | 影响 |
|---|---|---|
tcp 或空 | 无或协议默认字段 | 普通 TCP 传输 |
http | http-opts | HTTP 伪装 |
ws | ws-opts | WebSocket 传输 |
h2 | h2-opts | HTTP/2 传输 |
grpc | grpc-opts | gRPC 传输 |
kcp | kcp-opts | KCP 传输 |
xhttp | xhttp-opts | XHTTP 兼容传输,适用于支持 xHTTP 的 VMess/VLESS/Trojan 类节点 |
REALITY:
reality-opts:
public-key: xxxxx
short-id: abcd
fingerprint: chrome
ECH:
ech-opts:
enable: true
mode: grease
query-server-name: example.com
SMUX:
smux:
enabled: true
protocol: smux
max-connections: 4
min-streams: 4
max-streams: 32
传输子配置字段怎么读#
| 子配置 | 常见字段 | 实际影响 |
|---|---|---|
http-opts | method、path、headers | HTTP 伪装传输使用;path/header 必须与服务端一致。 |
ws-opts | path、headers、max-early-data、early-data-header-name、v2ray-http-upgrade | WebSocket 路径、Host 和 early data 行为;CDN/反代场景最常用。 |
h2-opts | host、path | HTTP/2 传输的 authority/path。 |
grpc-opts | grpc-service-name、grpc-user-agent | gRPC 服务名和 UA;服务名不匹配会像“端口通但协议不通”。 |
kcp-opts | seed、header-type、mtu、tti、uplink-capacity、downlink-capacity、congestion、write-buffer、read-buffer | KCP 传输参数;需要服务端支持,错误参数会导致握手或性能异常。 |
ss-opts | enabled、method、password | Trojan 的 Shadowsocks 扩展,不是普通 ss 节点。 |
plugin / plugin-opts | 插件名和插件参数 | Shadowsocks 插件混淆,必须与服务端插件一致。 |
obfs-opts | mode、host 等 | Snell/插件类混淆参数。 |
smux | enabled、protocol、max-connections、min-streams、max-streams、padding、statistic、only-tcp | 多路复用设置;可减少连接数,但不适合所有网络,出问题时先关闭。 |
TLS/REALITY/ECH 字段怎么读#
| 字段 | 用在哪些协议 | 用户应该怎么理解 |
|---|---|---|
tls | VMess/VLESS/Trojan/HTTP/Brook/Naive 等 | 是否给协议套 TLS;不是所有协议都允许手动写。 |
servername / sni | TLS 类协议 | TLS 握手里的服务名;通常要等于证书域名或服务端要求的伪装域名。 |
skip-cert-verify | TLS 类协议 | 跳过证书校验,只建议自签或测试;会降低安全性。 |
alpn | TLS/H2/H3/TrustTunnel 等 | 协商应用层协议,例如 h2、h3、http/1.1。 |
client-fingerprint | 支持 uTLS 的协议 | 调整 ClientHello 指纹,例如 chrome。 |
pinned-certchain-sha256 | 证书固定场景 | 只接受指定证书链,适合强校验但配置成本高。 |
reality-opts.public-key | VLESS/REALITY | 服务端 REALITY 公钥。 |
reality-opts.short-id | VLESS/REALITY | 服务端分配的短 ID。 |
reality-opts.fingerprint | VLESS/REALITY | REALITY 使用的指纹参数。 |
reality-opts.support-x25519mlkem768 | VLESS/REALITY | 后量子/扩展握手能力,必须与服务端兼容。 |
ech-opts.enable | 支持 ECH 的 TLS 出站 | 开启 Encrypted ClientHello。 |
ech-opts.mode | ECH | ECH 模式,例如 grease/真实配置。 |
ech-opts.config | ECH | 手工提供 ECHConfig。 |
ech-opts.query-server-name | ECH | 用哪个域名查询 ECH 配置。 |
如果你不知道是否需要这些字段,先不要写。服务商给了才写,且字段值要逐字匹配。
特殊出口#
direct#
直连目标服务器。
proxies:
- name: local-direct
type: direct
interface-name: eth0
字段影响:
- 可用
interface-name/routing-mark控制直连出口。
- 内置
DIRECT已存在,普通配置无需显式声明。
reject#
拒绝连接。
proxies:
- name: block
type: reject
用于广告/恶意流量/不允许访问的规则。内置 REJECT 已存在。
dns#
交给 Link1 内置 DNS resolver 的特殊出口。
proxies:
- name: dns-out
type: dns
普通用户通常不需要显式配置。
显式代理协议#
http#
HTTP 上游代理的工作方式是:Link1 先连接上游 HTTP proxy;如果客户端访问 HTTPS,Link1 会向上游发送 CONNECT target:443,由上游建立到目标的 TCP 隧道;如果访问明文 HTTP,则上游可以转发完整 HTTP 请求。
适合:公司代理、云服务器上的 HTTP 代理、需要 Basic 认证的上游。它不是 HTTP Engine,也不会自动解密 HTTPS 内容。
proxies:
- name: http-upstream
type: http
server: proxy.example.com
port: 8080
username: alice
password: secret
tls: false
关键字段:
| 字段 | 影响 |
|---|---|
server / port | HTTP 代理服务器地址 |
username / password | Basic 认证 |
tls | 连接上游代理时是否使用 TLS |
headers | 附加请求头 |
skip-cert-verify / servername | TLS 模式下影响证书和 SNI |
socks / socks5#
SOCKS5 上游代理的工作方式是:Link1 把目标地址交给 SOCKS5 服务器,由 SOCKS5 服务器去连接目标。目标可以是域名,也可以是 IP。
DNS 影响:如果 Link1 把域名交给 SOCKS5,上游负责解析;如果 Link1 先解析成 IP,再交给 SOCKS5,则域名信息可能丢失。透明代理/TUN 场景下仍建议先让 Link1 DNS/Fake-IP 提供域名上下文。
UDP 影响:udp: true 表示尝试使用 SOCKS5 UDP associate。上游不支持时,UDP 流量会失败,但 TCP 仍可能正常。
proxies:
- name: socks-upstream
type: socks5
server: 127.0.0.1
port: 1080
username: alice
password: secret
udp: true
关键字段:
| 字段 | 影响 |
|---|---|
server / port | SOCKS5 服务器 |
username / password | SOCKS5 用户名密码 |
udp | 是否使用 SOCKS5 UDP associate |
tfo | TCP Fast Open,需协议和系统支持 |
ssh#
SSH 出站的工作方式是:Link1 先登录 SSH 服务器,然后通过 SSH channel 转发 TCP 流量。它更像“把 SSH 服务器当跳板机”,不是传统加密代理协议。
认证可以用密码,也可以用私钥。生产环境强烈建议配置 host-key 校验服务端主机密钥;skip-host-key-verify 只适合临时测试。UDP 不是 SSH 原生能力,Link1 通过 udpgw 模式桥接,因此需要对应网关支持。
proxies:
- name: ssh-node
type: ssh
server: ssh.example.com
port: 22
username: root
private-key: ./id_ed25519
private-key-passphrase: secret
host-key:
- SHA256:xxxxxxxx
udp: true
udp-relay-mode: udpgw
udp-gateway: 127.0.0.1:7300
关键字段:
| 字段 | 影响 |
|---|---|
username | SSH 登录用户,必填 |
password / private-key | 二选一认证方式 |
private-key-passphrase | 加密私钥密码 |
host-key | 允许的服务端主机密钥,建议生产使用 |
skip-host-key-verify | 跳过主机密钥校验,不安全 |
host-key-algorithms | 限定主机密钥算法 |
udp | 开启 UDP 转发能力 |
udp-relay-mode | 使用 udpgw |
udp-gateway | udpgw 地址,需 udp=true |
限制:SSH 不支持 TLS、VMess/VLESS 传输字段、Reality、ECH、SMUX 等代理协议扩展。
VMess / VLESS / Trojan#
这三类协议都常见于“节点订阅”。它们的配置由三层组成:身份字段(uuid/password)、安全层(TLS/REALITY/证书/SNI)、传输层(TCP/WS/H2/gRPC/KCP)。排障时不要只看端口通不通,很多失败发生在 TLS、REALITY 或传输层路径不匹配。
vmess#
proxies:
- name: vmess-ws
type: vmess
server: example.com
port: 443
uuid: 00000000-0000-0000-0000-000000000000
alterId: 0
cipher: auto
tls: true
network: ws
ws-opts:
path: /ws
headers:
Host: example.com
关键字段:
| 字段 | 影响 |
|---|---|
uuid | VMess 用户 ID,必填 |
alterId | VMess 兼容字段 |
cipher | VMess 加密方式 |
tls / skip-cert-verify / servername | TLS 行为 |
network + *-opts | 传输层 |
udp | UDP 转发能力 |
smux | 多路复用 |
vless#
proxies:
- name: vless-reality
type: vless
server: example.com
port: 443
uuid: 00000000-0000-0000-0000-000000000000
flow: xtls-rprx-vision
encryption: none
tls: true
network: tcp
reality-opts:
public-key: xxxxx
short-id: abcd
fingerprint: chrome
关键字段:
| 字段 | 影响 |
|---|---|
uuid | VLESS 用户 ID,必填 |
flow | VLESS flow,例如 Vision |
encryption | 通常为 none |
tls | VLESS 常与 TLS/REALITY 配合 |
reality-opts | REALITY 参数 |
packet-addr / xudp / packet-encoding | UDP 扩展语义 |
udp-over-tcp / udp-over-tcp-version | UDP over TCP 兼容扩展 |
trojan#
proxies:
- name: trojan-grpc
type: trojan
server: example.com
port: 443
password: secret
tls: true
network: grpc
grpc-opts:
grpc-service-name: trojan
关键字段:
| 字段 | 影响 |
|---|---|
password | Trojan 密码,必填 |
tls | Trojan 通常使用 TLS |
network | 可使用 WS/H2/gRPC 等传输 |
ss-opts | Trojan Shadowsocks 扩展配置 |
udp | UDP 转发能力 |
Shadowsocks 生态#
Shadowsocks 生态的核心是“加密方法 + 密码”。SS 本身较轻量,插件、UDP-over-TCP、XUDP、packet-addr 等字段是为兼容不同服务端和传输场景而存在。SSR 和 ShadowTLS 是不同的兼容/包装协议,字段不能混用。
ss / shadowsocks#
proxies:
- name: ss-node
type: ss
server: example.com
port: 8388
cipher: 2022-blake3-aes-128-gcm
password: secret
udp: true
plugin: obfs
plugin-opts:
mode: tls
host: www.example.com
关键字段:
| 字段 | 影响 |
|---|---|
cipher | 加密方法,必填 |
password | 密码,必填 |
udp | UDP 转发 |
plugin / plugin-opts | 插件混淆 |
smux | 多路复用 |
udp-over-tcp | UDP over TCP |
packet-addr / xudp | UDP 地址扩展 |
Shadowsocks cipher 与 plugin 组合#
Shadowsocks 是本章最典型的“加密套件 + 插件”协议。你可以把它理解成两层:
cipher和password负责加密 SS 数据流。
plugin和plugin-opts负责把“到 SS 服务端的这条 TCP 连接”伪装或封装成另一种形态。
Link1 的处理顺序是:先连到 server:port,如果配置了插件先让插件包装这条上游连接,然后再在插件连接上运行 Shadowsocks 加密协议。因此,服务端的 cipher、密码和插件参数必须逐项一致。
支持的 cipher:
| 类别 | cipher 可填值 | 说明 |
|---|---|---|
| 常规 AEAD | aes-128-gcm、aes-192-gcm、aes-256-gcm、aes-128-ccm、aes-192-ccm、aes-256-ccm、aes-128-gcm-siv、aes-256-gcm-siv、chacha20-ietf-poly1305、chacha8-ietf-poly1305、xchacha20-ietf-poly1305、xchacha8-ietf-poly1305 | 推荐优先使用 AEAD。chacha* 系列通常适合无 AES 加速的设备。 |
| 扩展 AEAD | lea-128-gcm、lea-192-gcm、lea-256-gcm、rabbit128-poly1305、aegis-128l、aegis-256、deoxys-ii-256-128、aez-384、ascon128、ascon128a | 只有服务端明确给出时使用;服务端不支持会直接握手失败或无响应。 |
| Shadowsocks 2022 | 2022-blake3-aes-128-gcm、2022-blake3-aes-256-gcm、2022-blake3-chacha20-poly1305、2022-blake3-chacha8-poly1305、2022-blake3-aes-128-ccm、2022-blake3-aes-256-ccm | SS 2022 使用独立密钥格式;不要把旧 SS 密码随意搬到 2022 cipher 上。 |
| 旧式 stream cipher | aes-128-cfb、aes-192-cfb、aes-256-cfb、aes-128-ctr、aes-192-ctr、aes-256-ctr、chacha20、chacha20-ietf、xchacha20、xchacha20-ietf、rc4-md5 | 为旧服务端兼容保留;新配置不建议优先选择。 |
| 明文/测试 | none、dummy | 只适合特殊测试或兼容场景,不提供正常加密保护。 |
配置中也兼容部分大小写、下划线或
ss-2022-*别名;用户文档只列推荐写法。
支持的 plugin:
plugin | plugin-opts 核心组合 | TCP 行为 | UDP 行为 | 适合场景 |
|---|---|---|---|---|
| 不配置 | 无 | 直接运行 SS 加密流 | udp: true 时使用原生 SS UDP | 最简单、最稳定。 |
obfs | mode: http 或 mode: tls;可选 host | simple-obfs 风格 HTTP/TLS 伪装 | 插件本身不支持 UDP packet;如果确实要 UDP,需服务端支持并改用 udp-over-tcp 这类流式方案 | 老服务端、轻量伪装。 |
v2ray-plugin | mode: websocket/ws;可选 host、path、headers、tls、mux、v2ray-http-upgrade、skip-cert-verify、fingerprint、certificate/private-key、ech-opts | 把 SS TCP 包进 WebSocket,可再叠 TLS、HTTP Upgrade、mux | 插件本身不支持 UDP packet;需要 UDP 时优先确认服务端是否支持 udp-over-tcp | CDN/反代/WebSocket 服务端。 |
gost-plugin | mode: websocket/ws;可选 host、path、headers、tls、mux、fingerprint、certificate/private-key、ech-opts | GOST 风格 WebSocket 包装;mux 默认开启 | 插件本身不支持 UDP packet;需要 UDP 时依赖流式 UDP 方案 | 对接 GOST 插件生态。 |
cloak | transport: direct/cdn;必填 uid、publicKey、serverName;可选 proxyMethod、encryptionMethod: plain/aes-gcm/aes-256-gcm/aes-128-gcm/chacha20-poly1305、browserSig: chrome/firefox/safari、cdnOriginHost、cdnWsUrlPath、numConn、streamTimeout、keepAlive、udp | Cloak 握手和会话伪装,可直连或走 CDN 模式 | 只有 plugin-opts.udp: true 时插件提供 UDP over stream packet 能力 | Cloak 服务端、强伪装场景。 |
shadow-tls | 可选 password、host、version: 1/2/3、alpn、strict-mode、skip-cert-verify、fingerprint、client-fingerprint、certificate/private-key | 在 SS 外层叠 ShadowTLS 伪装;host 默认取上游 host | 不支持插件 UDP packet | 需要与 ShadowTLS 插件服务端对接。 |
restls | 必填 password;可选 host、version-hint: tls12/tls13、restls-script、fingerprint: chrome/firefox/safari/ios、skip-cert-verify | 在 SS 外层叠 Restls 握手 | 不支持插件 UDP packet | Restls 服务端。 |
使用组合时按下面顺序排查:
- 先关闭插件,只验证
cipher/password/server/port是否能通。
- 再打开插件,只改
plugin与plugin-opts。如果 TCP 能通但 UDP 不通,优先看上表的 UDP 行为。
plugin-opts.host、WebSocketpath、CloakserverName、ShadowTLS/Restls 版本是服务端约定,不是随意可换的“伪装域名”。
ssr / shadowsocksr#
proxies:
- name: ssr-node
type: ssr
server: example.com
port: 8388
cipher: aes-256-cfb
password: secret
obfs: tls1.2_ticket_auth
obfs-param: example.com
protocol: auth_sha1_v4
protocol-param: ''
关键字段:
| 字段 | 影响 |
|---|---|
cipher | SSR 加密方法 |
password | 密码 |
obfs / obfs-param | 混淆方式和参数 |
protocol / protocol-param | SSR 协议插件 |
udp | UDP 转发 |
ShadowsocksR cipher / obfs / protocol 组合#
SSR 的配置由三件事同时决定:cipher 负责加密,obfs 负责流量外观,protocol 负责 SSR 认证/分片格式。Link1 支持下表组合:
| 组合维度 | 可填值 | 用户应该怎么选 |
|---|---|---|
cipher | none、rc4-md5、aes-128-cfb、aes-192-cfb、aes-256-cfb、aes-128-ctr、aes-192-ctr、aes-256-ctr、chacha20、chacha20-ietf、xchacha20 | 以服务商给出的值为准;SSR 多为旧节点,不建议自行升级 cipher。 |
obfs | plain、http_simple、http_post、random_head、tls1.2_ticket_auth、tls1.2_ticket_fastauth | 以服务端为准。obfs-param 通常是伪装域名或 HTTP 头参数。 |
protocol | origin、auth_sha1_v4、auth_aes128_md5、auth_aes128_sha1、auth_chain_a、auth_chain_b | 以服务端为准。protocol-param 常见格式是用户 ID/密码类参数,订阅给什么就填什么。 |
这些维度在配置层可以组合,但真实是否可用取决于 SSR 服务端是否也使用同一组合。SSR 排障不要只看 cipher,obfs 或 protocol 任意一个不匹配都会表现为连接建立后无数据、很快断开或 UDP 异常。
shadowtls#
proxies:
- name: shadowtls-node
type: shadowtls
server: example.com
port: 443
password: secret
version: 3
sni: www.example.com
关键字段:
| 字段 | 影响 |
|---|---|
password | ShadowTLS 密码,必填 |
version | ShadowTLS 版本 |
sni / servername | 伪装 TLS 域名 |
certificate / private-key | 同时配置时作为证书材料 |
dialer-proxy | 可组合前置代理;设置后部分 socket 字段不可用 |
QUIC / 高性能代理协议#
这一组协议主要跑在 QUIC/UDP 上。它们通常对移动网络、丢包和 UDP 业务更友好,但前提是本地网络、运营商、路由器和上游都允许 UDP。遇到“TCP 网站能打开,视频/游戏/QUIC 不通”,优先检查 udp、防火墙和上游 UDP 支持。
带宽字段 up/down 是协议调度和拥塞控制的重要输入,不是简单展示文字;写得过高可能导致丢包,写得过低可能限制吞吐。
tuic#
proxies:
- name: tuic-node
type: tuic
server: example.com
port: 443
uuid: 00000000-0000-0000-0000-000000000000
password: secret
udp: true
udp-relay-mode: native
congestion-controller: bbr
reduce-rtt: true
关键字段:
| 字段 | 影响 |
|---|---|
uuid / password | TUIC 认证 |
udp-relay-mode | UDP 转发模式,如 native / quic |
congestion-controller | 拥塞控制:cubic、new_reno、bbr、brutal |
reduce-rtt | 减少握手 RTT |
request-timeout | 请求超时 |
heartbeat-interval | 心跳间隔 |
disable-sni | 禁用 SNI |
max-udp-relay-packet-size | UDP relay 包大小上限 |
bbr-profile | 当 congestion-controller: bbr 时选择 BBR 参数档,支持 standard、conservative、aggressive;不写控制器但写了 bbr-profile 时会默认启用 BBR。 |
hysteria#
proxies:
- name: hy1-node
type: hysteria
server: example.com
port: 443
auth-str: secret
protocol: udp
up: 50 Mbps
down: 200 Mbps
sni: example.com
关键字段:
| 字段 | 影响 |
|---|---|
auth / auth-str | Hysteria v1 认证 |
protocol | udp、wechat-video |
up / down | 带宽提示,影响拥塞/速率策略 |
obfs / obfs-password | 混淆 |
ports / hop-interval | 端口跳跃 |
recv-window / recv-window-conn | QUIC 窗口 |
faketcp 属于 Linux raw-socket 相关能力,Spark 不提供该非全平台协议特性。
hysteria2 / hy2#
proxies:
- name: hy2-node
type: hysteria2
server: example.com
port: 443
password: secret
obfs: salamander
obfs-password: obfs-pass
sni: example.com
skip-cert-verify: false
up: 50 Mbps
down: 200 Mbps
关键字段:
| 字段 | 影响 |
|---|---|
password | Hysteria2 密码 |
obfs: salamander / obfs-password | Salamander 混淆 |
sni / servername | TLS SNI |
up / down | 带宽提示 |
ports / hop-interval | 端口跳跃 |
skip-cert-verify | 证书校验 |
bbr-profile | 当 congestion-controller: bbr 时选择 BBR 参数档,支持 standard、conservative、aggressive。 |
realm-opts | Realm 转发配置,用于通过 realm server / STUN 协助转发 Hysteria2。 |
Hysteria2 的可选混淆组合很少,支持下面两种写法:
| 字段组合 | 可填值 | 实际影响 |
|---|---|---|
| 不配置混淆 | 不写 obfs / obfs-password | 直接使用 Hysteria2 QUIC/TLS 流量。 |
| Salamander 混淆 | obfs: salamander + obfs-password: <secret> | QUIC 包外观会经过 Salamander 混淆;只填 obfs-password 或只填 obfs 都会被拒绝。 |
realm-opts 适合服务端不直接暴露常规端口、需要通过 realm server/STUN 协调转发的场景。配置后必须提供 server-url、token、realm-id 和至少一个 stun-servers;不能和 ports 端口跳跃同时使用。realm-opts.proxy 表示访问 realm 控制面时使用的出口,不等同于节点自己的 dialer-proxy。
realm-opts:
enable: true
server-url: https://realm.example
token: xxxxx
realm-id: hy2-realm
stun-servers:
- stun.example:3478
sni: realm.example
proxy: PROXY
cipher、protocol、network、plugin 等旧协议字段不属于 Hysteria2;如果从别的订阅格式转换过来看到这些字段,通常会被忽略或校验拒绝。
juicity#
proxies:
- name: juicity-node
type: juicity
server: example.com
port: 443
uuid: 00000000-0000-0000-0000-000000000000
password: secret
sni: example.com
congestion-controller: bbr
关键字段:uuid、password、sni、skip-cert-verify、congestion-controller、udp。
naive#
proxies:
- name: naive-node
type: naive
server: example.com
port: 443
username: alice
password: secret
tls: true
NaiveProxy 使用 HTTP/2/HTTP/3 风格的上游代理。关键字段:username、password、tls、skip-cert-verify、servername、alpn。
其他代理协议#
这一组协议各自有独立服务端生态。它们不像 VMess/VLESS 那样共享大量传输字段,因此最重要的是按服务端文档逐项对应:版本、密码/密钥、混淆、mask、padding、UDP 策略都必须匹配。
snell#
proxies:
- name: snell-node
type: snell
server: example.com
port: 443
psk: secret
version: 3
udp: true
obfs-opts:
mode: tls
host: www.example.com
关键字段:
| 字段 | 影响 |
|---|---|
psk | Snell 密钥 |
version | 1/2/3/4/5 |
udp | Snell v3/v4/v5 支持 UDP over TCP |
reuse | 当前显式不支持;reuse: true 会报错,默认等价于 false |
obfs-opts | Snell 混淆配置 |
Snell 支持的版本/混淆组合:
| 字段组合 | 可填值 | 实际影响 |
|---|---|---|
version | 1、2、3、4、5;不写默认为 1 | 版本必须与服务端一致;5 按 v4-compatible client 处理;udp: true 允许 version: 3/4/5。 |
| 不配置混淆 | 不写 obfs-opts 或 obfs-opts.mode 为空 | 直接运行 Snell 协议。 |
| HTTP 混淆 | obfs-opts.mode: http,可选 obfs-opts.host | 首包伪装成 HTTP 请求;host 不写时由实现使用默认值。 |
| TLS 混淆 | obfs-opts.mode: tls,可选 obfs-opts.host | 首包伪装成 TLS 形态;必须与服务端配置一致。 |
network 按 TCP 行为处理;Snell 不是通用 WebSocket/TLS 传输协议,不支持 ws-opts、grpc-opts 等传输子配置。
gost-relay#
proxies:
- name: relay-node
type: gost-relay
server: relay.example.com
port: 8420
username: user
password: pass
dialer-proxy: DIRECT
gost-relay 是 GOST relay v1 的轻量 TCP 出站实现。Link1 先连接 server:port,发送 relay CONNECT 请求,再把后续 TCP 流量转发给目标地址。它适合把 GOST relay 服务端作为链式跳板,或者作为其他出站的 dialer-proxy 使用。
关键字段:
| 字段 | 影响 |
|---|---|
server / port | GOST relay 服务端地址。 |
username / password | 可选 relay 用户认证,单字段最长 255 字节。 |
dialer-proxy | 可选前置出站;连接 relay 服务端时先通过指定节点。 |
interface-name / routing-mark / tfo | 控制连接 relay 服务端这一段的底层 TCP 拨号。 |
首版限制:只支持 TCP CONNECT;udp: true、tls: true、network: udp 会在配置编译期报错。GOST relay 的 TLS/mTLS、mux、UDP forward/associate 不在本阶段实现范围内。
anytls#
proxies:
- name: anytls-node
type: anytls
server: example.com
port: 443
password: secret
sni: example.com
关键字段:password、sni/servername、skip-cert-verify、udp、alpn、client-fingerprint。
brook#
proxies:
- name: brook-node
type: brook
server: example.com
port: 443
password: secret
network: ws
ws-opts:
path: /ws
tls: true
关键字段:
| 字段 | 影响 |
|---|---|
password | Brook 密码 |
network | tcp、ws、quic 等受实现校验 |
without-brook-protocol | 部分 WS/WSS/QUIC 模式兼容字段 |
fragment | Brook WSS server fragment 配置 |
http-mask* | HTTP mask 兼容字段 |
udp-over-tcp | 仅特定 Brook server transport 支持 |
mieru#
proxies:
- name: mieru-node
type: mieru
server: example.com
port: 443
username: alice
password: secret
transport: TCP
关键字段:username、password、server、port、transport、multiplexing、handshake-mode。
trusttunnel#
proxies:
- name: trust-node
type: trusttunnel
server: example.com
port: 443
username: alice
password: secret
alpn: [h2]
udp: true
udp-over-stream: true
关键字段:
| 字段 | 影响 |
|---|---|
username / password | 可选认证;有密码时需要用户名 |
alpn | 必须包含 h2 |
udp-over-stream | UDP over stream |
udp-relay-mode | 只允许 native |
congestion-controller | cubic、new_reno、bbr |
certificate / private-key | 成对配置 |
sudoku#
proxies:
- name: sudoku-node
type: sudoku
server: example.com
port: 443
password: secret
aead-method: chacha20-poly1305
udp: true
sudoku-udp-policy: uot
padding-min: 1
padding-max: 8
关键字段:
| 字段 | 影响 |
|---|---|
password / key | 至少一个用于认证/密钥 |
aead-method | chacha20-poly1305、aes-128-gcm、none |
padding-min / padding-max | padding 范围,0-100 |
table-type | prefer_ascii 或 prefer_entropy |
custom-table / custom-tables | 需配合 table-type=prefer_entropy |
http-mask / httpmask | HTTP mask 开关/兼容配置 |
http-mask-mode | legacy、stream、poll、auto |
http-mask-host / path-root | HTTP mask 目标表现 |
http-mask-multiplex | off、auto、on |
sudoku-udp-policy | reject、direct、uot |
Sudoku 支持的安全/混淆组合:
| 组合维度 | 可填值 | 实际影响 |
|---|---|---|
aead-method | chacha20-poly1305、aes-128-gcm、none;不写使用默认 | 加密数据帧。none 只允许在 enable-pure-downlink: true 的特殊纯下行场景使用。 |
| padding | padding-min / padding-max 取 0 到 100,且 max 不能小于 min | 改变包长分布;两端不一致会影响兼容。 |
| table | table-type: prefer_ascii 或 prefer_entropy;自定义表需 prefer_entropy | 控制数据变换表。自定义表必须是 8 个字符,且 x=2,p=2,v=4。 |
| HTTP mask | http-mask: true,http-mask-mode: legacy/stream/poll/auto,可配 http-mask-host、path-root、http-mask-tls | 让 Sudoku 流量外观更像 HTTP;相关字段必须在 http-mask: true 时才有意义。 |
| HTTP mask multiplex | http-mask-multiplex: off/auto/on | 控制 HTTP mask 下的多路复用;不启用 HTTP mask 时不能单独配置。 |
| UDP 策略 | sudoku-udp-policy: reject/direct/uot | reject 拒绝 UDP;direct 直连 UDP;uot 使用 UDP-over-TCP 思路承载。 |
Sudoku 目前只实现 TCP 出站网络;如果配置 network,只能是 tcp 或留空。
L3 隧道与组网协议#
L3 隧道与普通代理最大的区别是:它们得到的是一条“虚拟网络链路”,而不只是一个 CONNECT/SOCKS 转发。DNS、路由、MTU、隧道地址、allowed routes 都会影响能访问哪些地址。
用户要特别区分两层路由:
- Link1 顶层
rules:决定某条连接是否选择这个 VPN 出站。
- VPN 协议内部路由:决定进入 VPN 后,哪些目标 IP 会在隧道内可达。
wireguard / wg#
proxies:
- name: wg-node
type: wireguard
private-key: xxxxx
ip: 172.16.0.2/32
ipv6: 2606:4700::1/128
mtu: 1280
peers:
- server: engage.cloudflareclient.com
port: 2408
public-key: xxxxx
pre-shared-key: optional
allowed-ips:
- 0.0.0.0/0
- ::/0
关键字段:
| 字段 | 影响 |
|---|---|
private-key | 本端 WireGuard 私钥 |
ip / ipv6 | 本端隧道地址 |
public-key / pre-shared-key | peer 密钥 |
reserved | reserved bytes,部分服务商需要 |
allowed-ips | 允许路由的网段 |
peers | 多 peer 列表 |
mtu | 隧道 MTU |
persistent-keepalive | NAT 保活 |
amnezia-wg-option | AmneziaWG 扩展 |
dns / remote-dns-resolve | 远端 DNS 相关 |
WireGuard DNS 与 allowed-ips#
allowed-ips 是 WireGuard peer 的隧道路由前缀,不是 Link1 顶层规则。通常服务商给 0.0.0.0/0 和 ::/0,表示进入这个出站后的目标都允许走该 peer;如果只给企业内网前缀,则只有这些内网 IP 在隧道内可达。
dns 和 remote-dns-resolve 用于解决“这个域名应该在哪里解析”。VPN 类型默认 remote-dns-resolve: true:当目标仍是域名时,Link1 会优先让该 VPN runtime 使用隧道 DNS 解析。dns 可手动指定隧道 DNS;如果 runtime 没有服务端下发或配置的 DNS,开启远端解析会直接报错,不会静默回退到本地 DNS。需要复用本地/全局 DNS 时,可以显式写 remote-dns-resolve: false。
masque#
proxies:
- name: masque-node
type: masque
server: example.com
port: 443
uri: https://example.com/.well-known/masque/udp/1.1.1.1/443/
sni: example.com
handshake-mode: strict
congestion-controller: bbr
mtu: 1280
关键字段:
| 字段 | 影响 |
|---|---|
uri | MASQUE 目标 URI |
sni / servername | TLS SNI |
handshake-mode | strict 或兼容模式 |
network | 默认 h3;可写 h3/http3/quic 或 h2/http2。h2 走 HTTP/2 fallback,不支持 QUIC 拥塞控制相关字段。 |
congestion-controller | QUIC 拥塞控制:cubic、new_reno、bbr、brutal,仅 network=h3 生效。 |
bbr-profile | BBR 参数档,支持 standard、conservative、aggressive;只支持 network=h3,不写控制器但写它时会默认启用 BBR。 |
cwnd | 初始拥塞窗口,仅 network=h3 生效。 |
up / down | brutal 拥塞控制的带宽提示,仅 network=h3 生效。 |
dialer-proxy | 连接 MASQUE endpoint 时使用前置出口;设置后不能同时使用 interface-name / routing-mark。 |
remote-dns-resolve / dns | 远端 DNS |
mtu | 隧道 MTU |
MASQUE DNS 与 URI#
MASQUE 的 uri 不只是普通网址,它描述了 HTTP/3 MASQUE 服务端接受 CONNECT-UDP/IP 的位置。server/port 决定连接哪个 endpoint,sni/servername 决定 TLS 握手域名,uri 决定 MASQUE 请求目标。三者可能相同,也可能由服务商分别给出。
dns 与 remote-dns-resolve 的含义和 WireGuard 类似:它们用于控制进入 MASQUE 隧道后的域名解析。VPN MASQUE 默认 remote-dns-resolve: true,可显式设为 false 退回本地/全局 DNS。对 WARP MASQUE 来说,provider 会把 WARP 状态中的 DNS 和 remote resolve 参数物化到生成的 MASQUE 节点。
tailscale#
proxies:
- name: tailnet
type: tailscale
auth-key: tskey-xxxxx
hostname: link1-router
control-url: https://headscale.example.com
exit-node: 100.64.0.10
auto-route: true
route-rule-set: tailnet-routes
关键字段:
| 字段 | 影响 |
|---|---|
auth-key | 登录 Tailscale/Headscale 的 key |
hostname | 节点名 |
control-url | 控制面 URL,Headscale 场景使用 |
ephemeral | 临时节点 |
accept-routes | 是否接受控制面下发路由,默认 true |
exit-node | 使用指定 exit node 出口 |
exit-node-allow-lan-access | 使用 exit node 时是否保留本地 LAN 访问 |
remote-dns-resolve | 默认 true,目标域名使用 Tailscale MagicDNS / tailnet DNS 解析 |
auto-route | 默认 true,自动注入动态 RULE-SET 到 MATCH 前 |
route-rule-set | 默认 $<proxy-name>,动态路由规则集名 |
dialer-proxy | Tailscale 控制面和 DERP/peer 建连使用的前置出口 |
route-rule-set 默认直接使用代理名加 $ 前缀。若代理名或显式规则集名包含逗号,自动注入的 RULE-SET 会按通用规则语法使用双引号包裹并转义。
Tailscale MagicDNS#
Tailscale 出站默认 remote-dns-resolve: true。当规则把一个域名目标交给该出站时,Link1 会先通过内嵌 Tailscale runtime 的 DNS manager 查询 MagicDNS / tailnet DNS,再用解析出的 tailnet IP 建立连接;如果 Tailscale DNS 没有返回地址,会报错,不会静默回退到本地 DNS。确实想复用本地或全局 DNS 时,可以显式写 remote-dns-resolve: false。
全局 DNS 也可以直接引用某个 Tailscale 出站:
dns:
nameserver-policy:
'+.tailnet.ts.net':
- ts://tailnet
tailscale://tailnet 和 ts://tailnet 等价,都表示“使用名为 tailnet 的 Tailscale 出站提供的 MagicDNS / tailnet DNS”。
dialer-proxy 会作用到 Tailscale 自身的系统拨号路径:控制面、DERP/relay、peer 直连建连都会优先通过指定出口。当前实现使用 Link1 裁剪后的 Tailscale fork,并把底层 WireGuard 路径接到 Link1 内部 WireGuard;目标是只保留出站所需子集,同时保留后续扩展 WireGuard 变体能力的空间。
openvpn#
OpenVPN 出站不是普通“远程代理端口”,而是完整 VPN 客户端。Link1 会先和 OpenVPN 服务端建立控制通道,完成 TLS/证书/用户名密码认证,然后创建 userspace 隧道网络,把被规则选中的连接放进这个隧道。配置 dialer-proxy 时,OpenVPN 连接 remote 的 TCP/UDP 底层通道会先通过指定出站;UDP remote 要求前置出站具备 UDP 能力。
它的数据流可以理解为:
应用连接
-> Link1 rules 选中 ovpn-node
-> OpenVPN userspace netstack
-> OpenVPN 控制/数据通道
-> VPN 服务端
-> 企业内网或公网目标
最小示例:
proxies:
- name: ovpn-node
type: openvpn
server: vpn.example.com
port: 1194
network: udp
username: alice
password: secret
ca: ./certs/ca.crt
certificate: ./certs/client.crt
private-key: ./certs/client.key
private-key-passphrase: optional-passphrase
route-rule-set: ovpn-node-routes
多 remote 示例:
proxies:
- name: ovpn-node
type: openvpn
ca: ./certs/ca.crt
username: alice
password: secret
remotes:
- server: vpn1.example.com
port: 1194
protocol: udp
sni: vpn.example.com
- server: vpn2.example.com
port: 443
protocol: tcp
servername: vpn.example.com
OpenVPN 字段说明#
| 字段 | 必填/默认 | 实际影响 |
|---|---|---|
server / port / network | 没有 remotes 时必填;network 默认 UDP | 声明默认 remote;network 只允许 UDP/TCP 及其兼容写法。 |
remotes[] | 可选 | 多个 OpenVPN remote 候选。Link1 会按状态选择/切换 remote。 |
remotes[].server / port / protocol | remote 内必填 | 单个 remote 的地址、端口和传输协议。 |
remotes[].sni / servername | 可选 | 单个 remote 的 TLS 名称,优先使用 sni。 |
username / password | 视服务端而定 | 用户密码认证。 |
ca | 通常必填 | 校验 OpenVPN 服务端证书;如果不写 ca,必须显式 skip-cert-verify: true。 |
certificate / private-key | 成对配置 | 客户端证书认证;只写一个会被拒绝。 |
private-key-passphrase | 可选 | 加密私钥的密码。 |
auth | 可选 | OpenVPN auth digest。 |
cipher / data-ciphers | 可选 | 数据通道加密算法;支持 AES-128-GCM、AES-192-GCM、AES-256-GCM、CHACHA20-POLY1305,以及传统 AES-128-CBC/AES-256-CBC;AES-CBC 会按 AES-128-CBC 处理,data-ciphers 是候选列表。 |
tls-auth / tls-crypt / tls-crypt-v2 | 互斥 | OpenVPN TLS 控制通道保护;三者只能选一个。 |
key-direction | 配合 tls-auth | 只能是 0、1 或 bidirectional,且必须配合 tls-auth。 |
ip / ipv6 | 可选 | 手动指定本端隧道地址;服务端 push ifconfig 时可由服务端下发。 |
dns | 可选 | 手动指定 VPN DNS 服务器 IP;服务端 push DNS 时会被 push 结果覆盖。 |
remote-dns-resolve | 默认 true | 目标域名由 OpenVPN runtime 使用 pushed/configured VPN DNS 解析;显式 false 时改用本地/全局 DNS。 |
mtu | 可选 | 隧道 MTU;服务端 push tun-mtu 时也可能更新。 |
request-timeout | 默认 30s | OpenVPN 握手超时,单位毫秒。 |
ping-interval / ping-timeout | 默认 10s / 60s | keepalive 与断线检测;服务端 push 也可覆盖。 |
reneg-sec | 默认 3600s | TLS 重协商间隔。 |
route-rule-set | 默认 $<proxy-name> | 暴露一个动态规则集,用于匹配 VPN 服务端 push 的路由前缀。 |
auto-route | 默认 true | 自动把 RULE-SET,<route-rule-set>,<proxy-name> 插入到 MATCH 前。 |
interface-name / routing-mark | 可选 | OpenVPN 连接服务端这一段的底层出口控制。 |
route-rule-set 默认直接使用代理名加 $ 前缀。若代理名或显式规则集名包含逗号,自动注入的 RULE-SET 会按通用规则语法使用双引号包裹并转义。
不支持的常见字段:
tls、alpn、client-fingerprint、reality-opts、ech-opts、ws-opts、grpc-opts:这些是普通代理/TLS 传输字段,不是 OpenVPN 配置。
auto-setup-routes:这是企业 VPN 风格字段,不是 OpenVPN 出站字段。OpenVPN 使用route-rule-set和auto-route。
OpenVPN DNS 是怎么工作的#
OpenVPN DNS 有三层来源,优先级从高到低:
- 服务端 push 的 DNS:OpenVPN 服务端可能在
PUSH_REPLY中下发dhcp-option DNS 10.8.0.1。Link1 会记录到 OpenVPN runtime snapshot 中。
- 节点里的
dns字段:如果服务端不 push DNS,你可以手动写dns: [10.8.0.1]。
- 全局 Link1 DNS:当
remote-dns-resolve: false,或某次 DNS 查询不是某个出站拨号目标的一部分时,普通 DNS 仍按dns.nameserver、nameserver-policy等全局配置执行。
OpenVPN 默认 remote-dns-resolve: true。被规则选中并进入 OpenVPN 出站的域名目标,会由 OpenVPN runtime 使用 pushed/configured DNS 解析;如果没有可用 VPN DNS,会报错而不是回退本地 DNS。
如果需要让全局 DNS 策略中的某些企业域名也显式调用 OpenVPN 内部 DNS,可以在 dns.nameserver-policy 写 openvpn://<节点名>:
dns:
enable: true
nameserver:
- https://223.5.5.5/dns-query
nameserver-policy:
'+.corp.example.com':
- openvpn://ovpn-node
'+.internal.example.com':
- openvpn://ovpn-node
含义:
- 普通域名仍走默认
nameserver。
corp.example.com这类企业域名会调用ovpn-node的远端 DNS 能力。
ovpn-node必须已经能建立 OpenVPN runtime,并且 snapshot 中有 DNS 服务器;否则会报“没有 remote dns servers”或远端解析失败。
openvpn://ovpn-node 和 remote-dns-resolve 使用同一类远端 DNS 能力,但入口不同:前者是全局 DNS policy 的 nameserver,后者是 OpenVPN 出站拨目标域名时的解析策略。
OpenVPN 路由是怎么工作的#
OpenVPN 服务端可能 push 路由,例如 route 10.0.0.0 255.0.0.0 或 IPv6 route。Link1 会把这些前缀记录到该节点的 runtime snapshot。
route-rule-set 会把这些前缀暴露成一个动态规则集:
proxies:
- name: ovpn-node
type: openvpn
server: vpn.example.com
port: 1194
ca: ./certs/ca.crt
route-rule-set: corp-vpn-routes
auto-route: true
rules:
- DOMAIN-SUFFIX,corp.example.com,ovpn-node
- MATCH,PROXY
当 auto-route: true 时,Link1 会自动把类似下面的规则插入到 MATCH 前:
rules:
- RULE-SET,corp-vpn-routes,ovpn-node
- MATCH,PROXY
注意:OpenVPN 动态 route rule-set 主要匹配服务端 push 的 IP 前缀;企业域名仍建议通过 dns.nameserver-policy 指到 openvpn://ovpn-node,解析出企业内网 IP 后再让路由规则命中。
常见 OpenVPN 问题#
| 现象 | 常见原因 | 处理 |
|---|---|---|
配置编译报 ca is empty | 没有 CA 且未跳过证书校验 | 配置 ca,或测试时显式 skip-cert-verify: true |
报 certificate and private-key must be configured together | 客户端证书和私钥只写了一个 | 两个都写,或两个都不写 |
| 企业域名解析失败 | 没有 pushed/configured VPN DNS,或显式关闭了远端解析 | 配置 dns、检查服务端 push,或确认是否需要 remote-dns-resolve: false |
| 内网 IP 不走 VPN | 服务端未 push 路由,或 auto-route=false | 检查 OpenVPN snapshot routes 和 route-rule-set |
| UDP remote 不通 | 网络阻断 UDP | 改用 TCP remote 或检查防火墙 |
WARP provider#
WARP 是 Cloudflare 的动态出口能力。Link1 不把它设计成 proxies[].type=warp,而是设计成 proxy-providers.type=warp。原因是:WARP 不是一个固定 leaf 节点,而是一个会生成节点的“节点来源”。
为什么必须是 provider:
- 一个 WARP 配置可能生成多个出口:同一个 WARP 状态可以物化出
wireguard和masque两类节点。
- auto 模式需要持久状态:账号、密钥、endpoint、reserved bytes、MASQUE 参数等需要被管理和复用。
- 它天然适合策略组选择:provider 生成的节点可以进入
select、url-test、fallback等策略组,由用户或健康检查选择。
- 它不是订阅下载:WARP provider 不使用
url、path、format、proxy这些订阅字段;它从 WARP 状态构建本地节点。
- 避免配置歧义:如果允许
proxies[].type=warp,用户会误以为它像普通协议一样只有一个固定 server/port;实际 WARP 需要先决定 transport 和状态来源。
最常见写法:
proxy-providers:
warp:
type: warp
mode: auto
transports:
- masque
- wireguard
proxy-groups:
- name: WARP
type: select
use: [warp]
proxies:
- DIRECT
rules:
- MATCH,WARP
这份配置的含义:
warpprovider 负责生成 WARP 节点。
transports指定希望生成哪些类型,支持masque和wireguard。
- 如果两个 transport 都有可用状态,组里会出现类似
warp MASQUE、warp WIREGUARD的节点。
WARP策略组负责让用户选择具体 WARP transport,或配合自动组做健康选择。
WARP auto 模式字段#
| 字段 | 默认/限制 | 实际影响 |
|---|---|---|
type | 必须是 warp | 声明这是 WARP provider。 |
mode | 默认 auto | 自动加载/生成 WARP 状态。 |
transports | 默认 masque + wireguard | 希望物化哪些候选;只支持 masque、wireguard。 |
license-key | 仅 mode=auto 支持 | 使用指定 WARP license。manual 模式写它会被拒绝。 |
endpoint-host / endpoint-port | auto 使用默认 endpoint | 指定 WARP endpoint。 |
mtu | 默认 WARP MTU | 影响生成的隧道 MTU。 |
persistent-keepalive | 默认 WARP keepalive | WireGuard NAT 保活。 |
dialer-proxy | 可选 | 传递给生成出的 WireGuard/MASQUE 节点,让这些节点连接 WARP endpoint 时使用前置出口。 |
不再支持的 discovery 字段:probe-timeout、count、wg-candidates、masque-candidates。这些字段属于旧的 discovery 设计,写入配置会被拒绝。
WARP manual 模式字段#
manual 模式适合你已经有完整 WARP 参数,不希望 Link1 自动生成状态。
proxy-providers:
warp-manual:
type: warp
mode: manual
transports: [wireguard, masque]
wireguard:
private-key: xxxxx
public-key: xxxxx
ip: 172.16.0.2
ipv6: 2606:4700::1
reserved:
bytes: [0, 0, 0]
server: engage.cloudflareclient.com
port: 2408
allowed-ips:
- 0.0.0.0/0
- ::/0
mtu: 1280
persistent-keepalive: 25
masque:
private-key: xxxxx
public-key: xxxxx
ip: 172.16.0.2
ipv6: 2606:4700::1
server: masque.cloudflareclient.com
port: 443
uri: https://masque.cloudflareclient.com/
sni: masque.cloudflareclient.com
dns:
- 1.1.1.1
remote-dns-resolve: true
mtu: 1280
congestion-controller: bbr
| 子块 | 字段 | 实际影响 |
|---|---|---|
wireguard | private-key、public-key | WARP/WireGuard 本端私钥和 peer 公钥。 |
wireguard | ip、ipv6 | 本端隧道地址;至少要有一个。 |
wireguard | reserved.bytes | WARP reserved bytes,某些账号必需。 |
wireguard | server、port | WARP WireGuard endpoint。 |
wireguard | allowed-ips | 进入隧道的允许前缀;不写时默认 IPv4 全局,带 IPv6 时也包含 ::/0。 |
wireguard | mtu、persistent-keepalive | MTU 和 NAT 保活。 |
masque | private-key、public-key、ip、ipv6 | MASQUE 账号和隧道地址。 |
masque | server、port、uri、sni | MASQUE HTTP/3 endpoint 和 TLS 名称。 |
masque | dns、remote-dns-resolve | MASQUE 内 DNS 和远端解析行为。 |
masque | skip-cert-verify | 跳过 MASQUE endpoint 证书校验,不建议生产使用。 |
masque | mtu、congestion-controller、cwnd、up、down | QUIC/隧道性能参数。 |
manual 模式规则:
transports包含wireguard时必须提供wireguard子块。
transports包含masque时必须提供masque子块。
license-key只能用于 auto 模式。
- 顶层
handshake-mode不支持;WARP MASQUE 内部会使用固定兼容握手语义。
provider 生成的节点是什么#
WARP provider 最终会生成普通 Link1 出站节点:
| WARP transport | 生成的 leaf type | 用户看到的行为 |
|---|---|---|
wireguard | wireguard | 像普通 WireGuard 隧道一样转发。 |
masque | masque | 像 MASQUE/HTTP3 隧道一样转发,默认开启 UDP。 |
因此后续策略组、规则、健康检查都面对这些生成后的节点,而不是直接面对 warp。这也是 warp 必须放在 provider 的根本原因。
WARP 常见问题#
| 现象 | 常见原因 | 处理 |
|---|---|---|
proxies[].type=warp 被拒绝 | WARP 不允许作为 leaf | 改写为 proxy-providers.<name>.type: warp |
| provider 没生成节点 | auto 状态为空或指定 transport 没有可用状态 | 看 App Provider 页面和日志,确认 WARP 状态是否生成 |
写了 url/path/format 被拒绝 | WARP provider 不是订阅 provider | 删除这些字段 |
manual 模式报缺少 wireguard/masque | transports 里启用了对应 transport | 补齐对应子块或从 transports 删除 |
| MASQUE 不通、WireGuard 可用 | 本地或网络限制 HTTP/3/QUIC | 在策略组中切到 WireGuard,或检查 UDP/QUIC |
| WireGuard 不通、MASQUE 可用 | WireGuard endpoint/UDP 被阻断 | 使用 MASQUE transport 或检查 endpoint/UDP |
企业 VPN 协议#
企业 VPN 协议依赖目标服务端版本、登录策略、验证码、设备绑定和企业安全策略。它们更像“把企业 VPN 作为 Link1 出口”,不是普通机场订阅节点。
企业 VPN 通常会返回两类动态信息:
- 企业 DNS:用于解析只在公司内网存在的域名。
- 企业路由:用于判断哪些内网 IP 应该走 VPN。
因此这类协议经常和 dns.nameserver-policy、route-rule-set、策略组一起使用,而不是把所有流量无脑交给企业 VPN。
atrust#
proxies:
- name: atrust-node
type: atrust
server: vpn.example.com
username: alice
password: secret
auth-type: auth/psw
remote-dns-resolve: true
route-rule-set: corp-routes
关键字段:
| 字段 | 影响 |
|---|---|
server | ATrust 服务地址 |
username / password | 登录凭据 |
auth-type | auth/psw、auth/cas、auth/smsCheckCode |
phone / code / cas-ticket | 对应认证方式参数 |
remote-dns-resolve | 默认 true,目标域名使用 VPN DNS 远端解析 |
session-persist | 会话持久化 |
route-rule-set | 默认 $<proxy-name>,企业路由规则集名 |
request-timeout | 登录/请求超时 |
限制:不支持普通代理的 TLS/QUIC/network 等字段;dialer-proxy 会同时作用于登录控制面和企业隧道底层连接。
feilian#
proxies:
- name: feilian-node
type: feilian
server: vpn.example.com
company-name: example
username: alice
password: secret
vpn-select-strategy: default
remote-dns-resolve: true
关键字段:
| 字段 | 影响 |
|---|---|
company-name / server | 至少一个用于定位企业 |
username / password | 登录凭据 |
vpn-server-name | 指定 VPN 网关 |
vpn-select-strategy | 网关选择策略 |
remote-dns-resolve | 默认 true,目标域名使用 VPN DNS 远端解析 |
session-persist | 会话持久化 |
dialer-proxy | 飞连控制面、VPN ping/connect 请求和 WireGuard underlay 都使用指定前置出口;UDP 模式要求前置出口支持 UDP。 |
easyconnect#
proxies:
- name: easyconnect-node
type: easyconnect
server: vpn.example.com
port: 443
username: alice
password: secret
remote-dns-resolve: true
关键字段:
| 字段 | 影响 |
|---|---|
server / port | EasyConnect 服务地址 |
username / password | 登录凭据 |
remote-dns-resolve | 默认 true,目标域名使用 VPN DNS 远端解析 |
auto-setup-routes | 自动设置 VPN 路由 |
route-rule-set | 默认 $<proxy-name>,企业路由规则集名 |
request-timeout | 请求超时 |
企业 VPN 动态 route-rule-set 的自动注入同样遵循通用规则语法;代理名或规则集名包含逗号时,会自动 quote 对应字段。
限制:不支持普通代理的 TLS、QUIC、network 等字段;dialer-proxy 会同时作用于登录控制面和隧道数据连接。
入站协议监听器#
虽然本章主要讲出站,但 Link1 也能作为部分协议服务端。
VLESS listener#
listeners:
- name: vless-in
type: vless
listen: 0.0.0.0
port: 443
certificate: ./certs/server.crt
private-key: ./certs/server.key
users:
- username: alice
uuid: 00000000-0000-0000-0000-000000000000
flow: xtls-rprx-vision
ws-path: /ws
proxy: PROXY
关键字段:users、uuid、certificate、private-key、ws-path、grpc-service-name、decryption、reality-config、proxy。
Hysteria2 listener#
listeners:
- name: hy2-in
type: hysteria2
listen: 0.0.0.0
port: 443
certificate: ./certs/server.crt
private-key: ./certs/server.key
users:
alice: password1
bob: password2
up: 100 Mbps
down: 500 Mbps
obfs: salamander
obfs-password: secret
alpn: [h3]
masquerade: https://www.example.com
proxy: PROXY
关键字段:users、certificate、private-key、up、down、obfs、obfs-password、max-idle-time、alpn、ignore-client-bandwidth、masquerade、proxy。
协议选择建议#
| 场景 | 建议 |
|---|---|
| 第一次验证 | direct 或 socks5 |
| 普通远程代理 | hysteria2、tuic、vless、trojan、ss |
| UDP/游戏/移动网络 | 优先 hysteria2、tuic、wireguard、masque |
| 企业内网访问 | openvpn、tailscale、atrust、feilian、easyconnect |
| 路由器透明代理 | 支持 UDP 的协议 + DNS/Fake-IP/TUN |
| 需要 WARP 出口 | proxy-providers.type=warp |
兼容边界#
- 字段出现在统一
ProxyConfig中,不代表每个协议都支持。
- Link1 会尽量在编译期指出“不支持的字段”。
- 企业 VPN 协议受服务端策略影响,不能保证所有企业版本都可用。
skip-cert-verify只建议测试或自签证书场景使用。
dialer-proxy会改变拨号链路,部分协议设置后会禁用ip-version、interface-name、routing-mark等直拨字段。