etemenanki-app 配置参考
etemenanki-app 配置文件的所有表都汇总在这一页。同样的表格也出现在各个指南页面上,那里会解释键之间如何配合;每个标题下都有对应页面的链接。
config.toml · 详见 配置文件
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
log | table | 否 | {} | 日志设置,写作 [log],只有 level 一个键。见配置文件页面的 [log] 一节。 |
dns | table | 否 | {} | 出站和负载均衡器探测使用的域名解析,写作 [dns]。不写时,etemenanki-app 使用主机的系统解析器,并在其前面始终加一层缓存。 |
inbound | array of tables | 否 | [] | 监听器,每个 [[inbound]] 块一个。键名是单数:[[inbounds]] 会被当作未知字段。没有入站也能通过校验,只是进程不接受任何连接。入站之间的 tag 不能重复。 |
outbound | array of tables | 是 | — | 流量的出口,每个 [[outbound]] 块一个。键名是单数。至少要有一个,否则构建阶段报 config defines no outbounds。除非 [route] 设置了 default,文件中第一个 [[outbound]] 就是默认路由。出站之间的 tag 不能重复。 |
balancer | array of tables | 否 | [] | 一组可以互相替代的出站,每个 [[balancer]] 块一个。键名是单数。负载均衡器的 tag 可以用在任何接受出站 tag 的地方,因此不能与出站或其他负载均衡器的 tag 重复。 |
route | table | 否 | {} | 路由设置,写作 [route],规则写作 [[route.rule]] 块(单数;[[route.rules]] 会被当作未知字段)。第一条匹配的规则生效。不写 [route] 时,所有流都走第一个 [[outbound]]。 |
[log] · 详见 配置文件
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
level | string | 否 | "info" | 一条 tracing 的 EnvFilter 指令,语法与 RUST_LOG 相同:一个级别(off、error、warn、info、debug、trace,或 0 到 5 的数字,不区分大小写),后面可以跟按 target 覆盖的级别,例如 "warn,etemenanki_protocols=debug"。环境变量 RUST_LOG 只要能解析为过滤器,就会取代这个值;设为空字符串也算合法,结果是什么都不输出。这个值不做校验:不是级别的词(例如 "warning")会被当成 target 名,结果是所有日志(包括错误)都不再输出。值为空,或者没有一条指令能解析时,只输出错误日志。只在启动时读取一次,热重载时不生效。 |
入站通用字段
Section titled “入站通用字段”[[inbound]] · 详见 入站
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
tag | string | 是 | — | 入站的名称,在所有入站中必须唯一,否则配置报错 duplicate inbound tag。路由规则用 inbound_tag 匹配它,日志里也用它标识入站。入站和出站的 tag 各自独立,互不冲突。 |
protocol | string (enum) | 是 | — | 客户端使用的协议:socks、http、trojan、vless、vmess、shadowsocks、hysteria2(别名 hysteria 和 hy2)或 tun。区分大小写。wireguard 会被拒绝并报 wireguard cannot be used as an inbound (no server implementation);其他值报 unknown protocol。 |
listen | string | 否 | "127.0.0.1" | 要绑定的地址。默认是回环地址,这是有意为之;要接受来自网络的连接,请写 0.0.0.0 或 ::。IPv6 地址直接写,不加方括号(写 ::,不写 [::])。主机名在绑定监听器时解析。以 / 开头的值是 Unix socket 路径;以 @ 开头的值(抽象 socket)会被拒绝。tun 入站不能设置此项。 |
port | u16 | 视情况 | — | 要绑定的端口,取值 0 到 65535。listen 未设置、是 IP 地址或主机名时必填(否则报 port is required)。Unix socket 不能设置(报 a unix socket listen has no port; remove port),tun 也不能设置。也接受 0,此时由内核挑选一个空闲端口。hysteria2 的端口是 UDP 端口。 |
stream | table | 否 | — | 协议下面的传输层:network(tcp、tls、ws、grpc)、security,以及 tls、ws、grpc 子表。只有监听 IP 地址的 http、trojan、vless、vmess 会用到它。其他情况下,network 不是 tcp 或 security 不是 none 都会报错。 |
address_family | string | 否 | — | 为了让入站和出站的表结构一致而保留,对入站没有任何作用,值也不做校验。 |
sniffing | bool | 否 | true | 对目标是纯 IP 的流,从开头的字节里读取 TLS SNI 或 HTTP Host,让按域名写的规则也能匹配它。目标本身是域名的流不会被检查。 |
settings | table | 否 | {} | 各协议自己的设置,见对应的协议页面。未知的键会被拒绝,报 inbound TAG: invalid settings: ...。这类错误不带行号。 |
SOCKS 入站
Section titled “SOCKS 入站”[inbound.settings] · protocol = "socks" · 详见 SOCKS
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
auth | string (enum) | 否 | "none" | 客户端的认证方式。"none" 不做认证,接受任何客户端,允许 SOCKS4、SOCKS4a 和 SOCKS5。"password" 要求 SOCKS5 用户名/密码认证(RFC 1929),并拒绝 SOCKS4。取值区分大小写,必须完全匹配;其他任何值(包括 Xray 的 "noauth")都会报 unknown socks auth。 |
accounts | array of tables | 视情况 | [] | auth = "password" 时接受的账号,每项写作 { user = "…", pass = "…" },每一项都必须同时写这两个键。使用 auth = "password" 时必须填写,才能让客户端通过:空列表能通过解析,但所有客户端都会被拒绝。同一个 user 出现两次时以最后一项为准。auth = "none" 时忽略此项。 |
udp | bool | 否 | true | 是否接受 SOCKS5 的 UDP ASSOCIATE 命令。为 false 时,服务端对 UDP ASSOCIATE 回复 0x07(command not supported)并关闭连接。 |
udp_bind | string | 视情况 | — | 每个 UDP 关联绑定中继 socket 的 IP 地址(IPv4 或 IPv6,不能写主机名),同时也是服务端告诉客户端的中继地址。不设置时,中继使用客户端所建 TCP 连接的本地地址。中继只接收来自客户端控制连接源地址的数据报,因此 udp_bind 必须与客户端连接所用的地址族一致:IPv4 地址,或 ::ffff:192.0.2.10 这类 IPv4 映射的 IPv6 地址,只能接收 IPv4 客户端;:: 两者都能接收;其他 IPv6 地址只能接收 IPv6 客户端。若中继无法接收某个客户端的数据报,该客户端发来的 UDP ASSOCIATE 会被拒绝,回复码为 0x02(connection not allowed by ruleset)。当 listen 是 Unix socket 路径且 udp 为 true 时必须设置,因为 Unix socket 没有本地 IP。在 Unix socket 上,每个客户端的 UDP ASSOCIATE 还必须写明其数据报将使用的确切来源 IP 地址和端口,且地址族必须是 udp_bind 能接收的;地址或端口为零、或写的是域名的请求会被拒绝,回复 0x02。 |
HTTP 入站
Section titled “HTTP 入站”[inbound.settings] · protocol = "http" · 详见 HTTP 代理
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
accounts | array of tables | 否 | [] | 用于校验客户端 Proxy-Authorization: Basic 头的账户列表。为空表示开放代理:任何客户端都无需凭据即可使用。设置后,没有匹配账户的请求会收到 407 响应。 |
accounts[].user | string | 是 | — | 用户名,区分大小写。不能包含 ::Basic 凭据按第一个冒号切分,含冒号的用户名永远无法通过认证。两个条目用户名相同时,后一个生效。 |
accounts[].pass | string | 是 | — | 密码,必须完全一致(区分大小写),可以包含 :。每个条目都必须同时写 user 和 pass,缺少任一项时配置报 missing field。 |
allow_transparent | bool | 否 | false | 接受 origin-form 形式的普通请求(GET /path),从 Host 头取目标,未写端口时用 80。为 false 时,这类请求会收到 400 响应。CONNECT 请求以及 http:// 或 https:// 形式的 absolute-form 请求不受此项影响。 |
Shadowsocks 入站
Section titled “Shadowsocks 入站”[inbound.settings] · protocol = "shadowsocks" · 详见 Shadowsocks
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
method | string (enum) | 是 | — | 加密方式。以 2022- 开头的值表示 Shadowsocks 2022,必须完全等于 2022-blake3-aes-128-gcm、2022-blake3-aes-256-gcm 或 2022-blake3-chacha20-poly1305。其他值都按旧版 AEAD 方法处理,不区分大小写:aes-128-gcm、aes-256-gcm、chacha20-poly1305、xchacha20-poly1305 或它们的别名。取值不会去掉首尾空白。未知的值会报 unknown shadowsocks method 或 unknown shadowsocks-2022 method。 |
password | string | 是 | — | 旧版方法:共享密码,密钥由它派生。users 非空时忽略此值,但仍然必须写这个键。Shadowsocks 2022:base64 编码的预共享密钥(标准字母表,带填充,首尾空白会被去掉),2022-blake3-aes-128-gcm 为 16 字节,其余方法为 32 字节。users 非空时,它是身份 PSK(iPSK),每个客户端都要把它放在密码的最前面。密钥过短会报 shadowsocks-2022: PSK too short;过长的密钥会改用其 SHA-256 摘要的前 16 或 32 字节。 |
users | array of tables | 否 | [] | 同一端口上的多个用户,每项写作 { password = "…", email = "…" }。也可以写成别名 clients,但不能和 users 同时出现。为空表示只用一个共享密码或 PSK。Shadowsocks 2022 的多用户需要 AES-GCM 方法;使用 2022-blake3-chacha20-poly1305 时配置会报 shadowsocks-2022: multi-user requires an aes-gcm method。 |
users[].password | string | 是 | — | 旧版方法:该用户的密码。Shadowsocks 2022:该用户的 base64 PSK(uPSK),长度规则与 password 相同。每个用户都要用不同的值。 |
users[].email | string | 否 | "" | 用户的标签。etemenanki-app 接受这个键,是为了让从 Xray 复制过来的配置可以原样使用,但并不使用它:没有路由规则按它匹配,日志也不会打印它。 |
Trojan 入站
Section titled “Trojan 入站”[inbound.settings] · protocol = "trojan" · 详见 Trojan
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
users | array of tables | 否 | [] | 该入站接受的账户,每个用户一个表。列表为空或不写时 --test 仍能通过,但此后每个连接都会以 trojan: invalid user 被拒绝。没有顶层的 password 键;Xray 的 clients 和 fallbacks 键会作为未知字段导致配置失败。 |
users[].password | string | 是 | — | 用户的密钥。客户端发送 SHA224(password) 的小写十六进制值,服务端在用户中查找这个哈希。任何字符串都会被接受,包括空字符串,所以请使用足够长的随机值。如果两个用户密码相同,以排在后面的为准。flow 和 level 会作为未知字段被拒绝。 |
users[].email | string | 否 | "" | 用户的标签,作为用户名随该用户的每个流一起传递。它不会发送到线路上,也不必是电子邮件地址。etemenanki-app 中没有任何路由规则或流量计数器会读取它。katana 根据面板而不是这个表来构建用户,它会自行填写同一个标签,并用它把流量归属到对应的面板用户。 |
VLESS 入站
Section titled “VLESS 入站”[inbound.settings] · protocol = "vless" · 详见 VLESS
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
users | array of tables | 否 | [] | 允许连接的用户,每个用户用一个 UUID 标识。列表为空或不写时配置仍能构建,但所有客户端都会被拒绝。Xray 的 clients、decryption 和 fallbacks 键在这里不存在,写上会被视为未知字段,导致配置失败。 |
users[].id | string | 是 | — | 用户的 UUID。可接受的写法:带连字符(11111111-2222-3333-4444-555555555555)、不带连字符的 32 位十六进制,或者把带连字符的写法用花括号包起来、加上小写的 urn:uuid: 前缀;十六进制数字大小写均可。其他写法报 invalid uuid。id 是条目中唯一的键:flow、email 和 level 都会被拒绝。 |
VMess 入站
Section titled “VMess 入站”[inbound.settings] · protocol = "vmess" · 详见 VMess
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
users | array of tables | 否 | [] | 允许连接的账户,每个用户一个表,所有用户的权限相同。空列表可以通过校验,但之后每个连接都会认证失败。Xray 的 clients 键会被当作未知字段拒绝。 |
users[].id | string | 是 | — | 用户的 UUID。接受带连字符的标准形式、32 位十六进制、{…} 花括号形式或 urn:uuid: 前缀,大小写均可。其他字符串会报 inbound <tag>: invalid uuid "…"。用户表只接受这一个键,所以 alterId、email、level 都会报错。 |
Hysteria 2 入站
Section titled “Hysteria 2 入站”[inbound.settings] · protocol = "hysteria2" · 详见 Hysteria 2
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
cert_file | path | 是 | — | QUIC 监听器出示的 PEM 证书链,叶子证书在前。构建配置时用 rustls 读取并解析,所以 --test 能发现文件缺失或无法解析。监听器本身接受不带 subjectAltName 的证书,但基于 rustls 的客户端(包括 hysteria2 出站)和当前的上游客户端都会拒绝,所以证书里要有 DNS 或 IP 类型的 SAN。 |
key_file | path | 是 | — | cert_file 对应的 PEM 私钥(PKCS#8、PKCS#1 或 SEC1)。可以和 cert_file 是同一个文件。两者缺一会报 hysteria2 needs both cert_file and key_file。 |
password | string | 视情况 | — | 所有客户端共用的一个凭据。password 和 users 必须且只能设置一个。不能为空,并且应只含可打印 ASCII 字符:含其他字符的凭据永远无法匹配。客户端把它原样作为 auth 字符串发送。 |
users | array of tables | 视情况 | — | 按用户区分的凭据,格式为 { user, pass, email }。password 和 users 必须且只能设置一个;空列表视为未设置。客户端以 user:pass 作为 auth 字符串发送。 |
users[].user | string | 是 | — | 用户名。不能为空,应只含可打印 ASCII 字符,也不能包含 :,因为线路上用它分隔用户名和密码。比较时不区分大小写(仅限 ASCII),所以仅大小写不同的两个用户名会被拒绝。 |
users[].pass | string | 是 | — | 用户的密码。不能为空,并且应只含可打印 ASCII 字符。按原样精确比较,可以包含 :,因为服务端在第一个冒号处拆分凭据。 |
users[].email | string | 否 | "" | 随该用户的流一起传递、用作其用户名的标签。为空时改用 user。它不会在线路上发送;etemenanki-app 没有读取它的路由规则。 |
udp | bool | 否 | false | 除 TCP 外,还通过 QUIC 数据报中继 UDP。默认关闭,这一点和 socks 入站不同。服务端在每个客户端认证时告知其是否提供 UDP。 |
udp_idle_timeout | u64 | 否 | 60 | UDP 关联在两个方向上都持续静默多少秒后被关闭。取值范围为 2 到 600。udp 为 false 时设置它会报错,而不是被忽略。 |
max_connections | integer | 否 | 4096 | 该监听器同时服务的 QUIC 连接数。超出上限的客户端握手会被立即拒绝。至少为 1。 |
max_circuits | integer | 否 | 65536 | 整个监听器上同时存在的 circuit 数,每个 TCP 流和每个 UDP 关联各算一个。超出上限时,新的流会被重置,新的 UDP 关联会被丢弃。至少为 1。 |
obfs | string (enum) | 否 | — | QUIC 之下的数据包混淆。唯一接受的值是 salamander,必须完全一致且小写;其他值会报 unknown obfs。客户端必须使用相同的 obfs 和 obfs_password。 |
obfs_password | string | 视情况 | — | salamander 的预共享密钥,至少 4 字节。设置了 obfs 时必填;没有 obfs 却设置了它会报错,这样 obfs 拼写错误不会悄悄关闭混淆。 |
masquerade | table | 否 | — | 对所有不是有效认证的请求(包括凭据错误的请求)返回的 HTTP/3 响应。见下方的 masquerade 字段表。 |
Hysteria 2 伪装页
Section titled “Hysteria 2 伪装页”[inbound.settings.masquerade] · 详见 Hysteria 2
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
status | u16 | 否 | 404 | 响应的 HTTP 状态码。接受 100 到 999 之间的任何值,但 233 除外:它是 Hysteria 认证成功的状态码,返回它等于告诉探测者认证已经通过。小于 100 或大于 999 的值会报 is not an HTTP status code。 |
body | string | 否 | "404 page not found\n" | 响应体,原样发送,并带上相应的 Content-Length。默认值与 Go 的 http.NotFound 返回的内容逐字节一致。 |
content_type | string | 否 | "text/plain; charset=utf-8" | 响应头 Content-Type 的值。 |
TUN 入站
Section titled “TUN 入站”[inbound.settings] · protocol = "tun" · 详见 TUN
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
name | string | 否 | — | 要创建的网卡名,例如 "etm0"。不设置时由内核挑选(tun0、tun1……),启动日志里会打印实际名字。Linux 上最多 15 个字节;更长的名字能通过 --test,但启动时报 device name too long。如果防火墙规则或脚本要引用这块网卡,请固定一个名字。 |
mtu | u16 | 否 | 1500 | 网卡以及其后用户态 IP 协议栈的 MTU,单位字节。最小值是 1280,即 IPv6 允许的最小 MTU;更小的值报 tun mtu must be at least 1280。大于 65535 的值无法解析。 |
address | array of strings | 否 | [] | 分配给网卡的地址,每项写作 "地址/前缀长度",IPv4 或 IPv6 均可,例如 "10.77.0.1/32" 或 "2001:db8:77::1/64"。不写前缀长度时按主机地址处理(/32 或 /128)。前缀长度同时会让内核把整个子网路由进这块网卡。这里允许主机位不为零。格式错误的项报 bad tun address。 |
routes | array of strings | 否 | [] | 路由进网卡的网段,必须是严格的 CIDR 写法,例如 "203.0.113.0/24":主机位必须全为零,所以 "203.0.113.5/24" 会报 bad tun route "203.0.113.5/24": host part of address was not zero。不写前缀长度时是一条主机路由。这些路由在创建网卡时装进 main 路由表,随网卡一起消失。只在 Linux 上安装:其他系统上列表非空会报 tun routes are installed only on Linux; add them with the OS route tool。 |
udp | bool | 否 | true | 除 TCP 外是否也中继 UDP。为 false 时,进入网卡的 UDP 包一律丢弃,不做任何回应。 |
udp_idle_timeout | u64 | 否 | 60 | UDP 流(一个客户端地址和端口与一个对端之间的通信)连续多少秒没有流量后由用户态协议栈回收。一个 UDP 关联会一起轮询它的所有流,所以其中任意一个有流量,所有流都保持存活。关联在最后一个流被回收时结束;无论如何,双向都没有数据报满 300 秒也会结束。0 可以写,但 UDP 将无法使用:流在第一个数据报之后立即被回收,回复来不及到达。 |
max_flows | integer | 否 | 65536 | 整个网卡上同时存在的流的上限:每条 TCP 连接算一个,每个 UDP 关联(同一客户端地址和端口的全部 UDP 流量)也算一个。达到上限后,新的 TCP 连接或 UDP 关联会被丢弃,并以 debug 级别记录日志。0 可以写,但会丢弃所有流。 |
出站通用字段
Section titled “出站通用字段”[[outbound]] · 详见 出站
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
tag | string | 是 | — | 出站的名称,路由规则、[route].default 和 [[balancer]].outbounds 都用它来引用出站。在所有出站之间必须唯一(否则报 duplicate outbound tag: …),负载均衡器也不能使用相同的 tag。没有设置 [route].default 时,文件里的第一个 [[outbound]] 就是默认路由。 |
protocol | string (enum) | 是 | — | 出站使用的协议:freedom(别名 direct)、blackhole(别名 block)、socks、http、trojan、vless、vmess、shadowsocks、hysteria2(别名 hysteria、hy2)或 wireguard。精确匹配,区分大小写;其他取值报 unknown protocol。 |
server | string | 视情况 | — | 上游服务器的主机名或 IP 地址,不带端口。socks、http、trojan、vless、vmess、shadowsocks 和 hysteria2 必填(否则报 missing server);freedom、blackhole 和 wireguard 不会用它转发流量,只在作为负载均衡器成员时用作健康探测的目标。IPv6 地址直接写(2001:db8::1),不加方括号。它同时是 TLS 服务器名(包括 hysteria2 的 server_name)、WebSocket Host 和 gRPC authority 的回退值。 |
port | u16 | 视情况 | — | 上游服务器的端口。与 server 在同样的协议下必填(否则报 missing port);其他协议只在作为负载均衡器成员时把它用作健康探测的目标。hysteria2 下是 UDP 端口,其他协议下是 TCP 端口。 |
stream | table | 否 | — | 通往上游的传输层:network(tcp、tls、ws、grpc)、security,以及 tls、ws、grpc 子表。socks、http、trojan、vless、vmess 和 shadowsocks 会使用它。freedom、blackhole、wireguard 和 hysteria2 拒绝 tcp 以外的 network 和 none 以外的 security,并忽略 tls、ws、grpc 子表。不写即为普通 TCP。 |
address_family | string (enum) | 否 | "auto" | 解析域名时使用哪个 IP 地址族:auto、ipv4_only、ipv6_only、prefer_ipv4 或 prefer_ipv6,另有若干别名。取值会去掉首尾空白、不区分大小写,- 视同 _。对代理类出站,它作用于 server 的解析;对 freedom,作用于目标地址;对 wireguard,作用于隧道内的目标地址。未知取值报 invalid address_family。 |
settings | table | 视情况 | {} | 协议专属设置,见各协议页面。trojan、vless、vmess、shadowsocks、hysteria2 和 wireguard 有必填键,因此必须写;socks 和 http 可选;freedom 和 blackhole 完全不读取。未知键会被拒绝,这里的错误形如 outbound <tag>: invalid settings: …。 |
SOCKS 出站
Section titled “SOCKS 出站”[outbound.settings] · protocol = "socks" · 详见 SOCKS
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
user | string | 否 | — | SOCKS5 用户名/密码认证(RFC 1929)的用户名。设置后,客户端只提供密码认证这一种方式;不设置时只提供“无需认证”。超过 255 字节时截断为 255 字节。 |
pass | string | 否 | "" | 与 user 配套的密码。没有 user 时忽略此项,客户端不做认证。超过 255 字节时截断为 255 字节。 |
HTTP 出站
Section titled “HTTP 出站”[outbound.settings] · protocol = "http" · 详见 HTTP 代理
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
user | string | 否 | — | 上游代理的用户名。设置后,每个 CONNECT 请求都会带上由 user:pass 编码而成的 Proxy-Authorization: Basic 头。不设置则不发送凭据。 |
pass | string | 否 | "" | 上游代理的密码,只和 user 一起使用:没有 user 时会被忽略;只写 user 不写 pass 时发送空密码。 |
Shadowsocks 出站
Section titled “Shadowsocks 出站”[outbound.settings] · protocol = "shadowsocks" · 详见 Shadowsocks
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
method | string (enum) | 是 | — | 加密方式,接受的值与入站相同:以 2022- 开头的值必须完全等于 2022-blake3-aes-128-gcm、2022-blake3-aes-256-gcm 或 2022-blake3-chacha20-poly1305;其他值按旧版 AEAD 方法或别名处理,不区分大小写。必须与服务端一致。未知的值会报 unknown shadowsocks method 或 unknown shadowsocks-2022 method。 |
password | string | 是 | — | 旧版方法:密码,原样使用(: 没有特殊含义)。Shadowsocks 2022:连接单 PSK 服务端时写一个 base64 PSK;连接多用户服务端时写成 iPSK:uPSK 链,最后一个是你自己的用户密钥,前面的都是身份密钥。每个密钥的长度规则与入站相同,过短会报 shadowsocks-2022: PSK too short。 |
Trojan 出站
Section titled “Trojan 出站”[outbound.settings] · protocol = "trojan" · 详见 Trojan
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
password | string | 是 | — | 服务端用来识别你的密码。出站在它打开的每个连接开头发送 SHA224(password) 的小写十六进制值。缺少它时出站无法构建,并报出指明 password 的 invalid settings: missing field 错误。这是唯一的键,写入任何其他键(例如 email)都会报错。 |
VLESS 出站
Section titled “VLESS 出站”[outbound.settings] · protocol = "vless" · 详见 VLESS
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
id | string | 是 | — | 用于认证的 UUID,必须与服务端的某个 users[].id 一致。可接受的写法与入站相同:带连字符、32 位十六进制,或者把带连字符的写法用花括号包起来、加上小写的 urn:uuid: 前缀。缺少时报 invalid settings: missing field,格式错误时报 invalid uuid。id 是唯一的键:Xray 的 flow、encryption 和 level 都会被拒绝,也没有 mux 设置。 |
VMess 出站
Section titled “VMess 出站”[outbound.settings] · protocol = "vmess" · 详见 VMess
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
id | string | 是 | — | 服务端上账户的 UUID,可以使用入站接受的任意格式。不写会报 missing field 错误,格式错误会报 outbound <tag>: invalid uuid "…"。 |
security | string (enum) | 否 | "aes-128-gcm" | 正文加密算法。aes-128-gcm 和 auto 都选择 AES-128-GCM,不写这个键也一样;chacha20-poly1305 选择 ChaCha20-Poly1305。匹配时不区分大小写。其他值(包括 none 和 zero)都会报 unknown vmess security "…"。不要和开启 TLS 的 [outbound.stream].security 混淆。 |
Hysteria 2 出站
Section titled “Hysteria 2 出站”[outbound.settings] · protocol = "hysteria2" · 详见 Hysteria 2
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
password | string | 是 | — | 每个 QUIC 连接发送一次的凭据,放在 Hysteria-Auth 头中。不能为空。服务端使用 users 表时,写成 user:pass。 |
server_name | string | 否 | — | TLS 服务器名称(SNI),也是校验证书时使用的名称。默认取出站的 server。当 server 是 IP 地址而证书上写的是域名时,需要设置它。 |
allow_insecure | bool | 否 | false | 接受任何服务端证书,不校验证书链和名称。不能与 ca_file 同时设置。只用于测试。 |
ca_file | path | 否 | — | 额外 CA 证书的 PEM 文件,这些证书会加入系统信任库,而不是替换它。--test 会读取该文件,但内容要到第一次连接时才解析,所以不含证书的文件会在那时报 hysteria2: the CA file contains no certificates。 |
obfs | string (enum) | 否 | — | QUIC 之下的数据包混淆。唯一接受的值是 salamander;其他值会报 unknown obfs。必须与服务端一致。 |
obfs_password | string | 视情况 | — | salamander 的预共享密钥,至少 4 字节,必须与服务端相同。设置了 obfs 时必填;没有 obfs 却设置它会报错。 |
max_concurrent_streams | integer | 否 | 102400 | 该出站在其唯一的共享连接上可同时打开的 TCP 流数,所有用户共用。超出上限的流会立即失败,报 connection is at its concurrent-stream limit。至少为 1,没有上限。 |
WireGuard 出站
Section titled “WireGuard 出站”[outbound.settings] · protocol = "wireguard" · 详见 WireGuard
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
private_key | string | 是 | — | 本端的 Curve25519 私钥,即 wg-quick 文件里的 PrivateKey。32 字节,写成带填充的标准 base64(wg genkey 的输出格式)或 64 位十六进制。不带填充的 base64 会被拒绝。错误信息:invalid wireguard private_key。 |
peer_public_key | string | 是 | — | 对端的公钥,即 [Peer] 段里的 PublicKey。编码方式与 private_key 相同。错误信息:invalid wireguard peer_public_key。 |
preshared_key | string | 否 | — | 可选的预共享密钥,参与握手计算,即 PresharedKey。编码方式与 private_key 相同。只有对端为你配置了预共享密钥时才填写;两边不一致会导致握手始终无法完成。错误信息:invalid wireguard preshared_key。 |
endpoint | string | 是 | — | 对端的 UDP 地址,格式为 host:port,在最后一个 : 处拆分。host 可以是 IP 地址或域名;域名在隧道启动时用系统解析器(而不是 [dns])解析,取第一个结果。IPv6 不要加方括号(2001:db8::1:51820):方括号不会被去掉,所以 [2001:db8::1]:51820 能通过 --test,但运行时解析失败。错误信息:wireguard endpoint must be host:port、invalid wireguard endpoint port。 |
address | array of IPs | 是 | — | 对端分配给你的隧道内地址,写成不带前缀长度的纯 IP:["10.0.0.2", "2001:db8:a::2"]。10.0.0.2/32 这样的 CIDR 写法会报 invalid IP address syntax。它决定隧道能访问哪些地址族的目标:没有 IPv6 地址时,IPv6 目标不可达。空列表能通过 --test,但之后每个连接都会失败,报 wireguard: no tunnel-local addresses configured。 |
mtu | integer | 否 | 1420 | 隧道内 IP 包的最大字节数;用户态 TCP 协议栈据此确定分段大小。不做范围检查。如果小请求正常、大流量传输卡住,就把它调低(例如 1280)。 |
keepalive | u16 | 否 | — | 持续保活(persistent keepalive)的间隔秒数,即 PersistentKeepalive。不写或写 0 表示关闭。本机位于 NAT 或有状态防火墙之后、且连接可能长时间空闲时应当设置(常用 25)。 |
reserved | array of integers | 否 | — | 恰好三个字节([0, 0, 0] 到 [255, 255, 255]),写入每个发出的 WireGuard 包头的第 1 到 3 字节,做法与 Xray 的 reserved 相同。无论是否设置 reserved,收到的包在解码前都会把这三个字节清零。只有服务方要求时才设置。其他长度都会报 invalid length …, expected an array of length 3。 |
stream 设置
Section titled “stream 设置”[inbound.stream] · [outbound.stream] · 详见 传输层与 TLS
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
network | string (enum) | 否 | "tcp" | 协议下面的承载方式:tcp(明文 TCP)、tls(TLS over TCP)、ws(WebSocket)或 grpc(基于 HTTP/2 的 gRPC)。区分大小写,也不会去除首尾空格:"WS"、" ws" 和 "" 都会报 unknown stream network。没有传输层的协议在这里只接受 tcp(或空字符串)。 |
security | string (enum) | 否 | "none" | none(或空字符串)表示不再加一层,tls 表示在 ws 或 grpc 下面加一层 TLS。首尾空格会被忽略,但区分大小写。其他任何值都报 unknown stream security "..." (expected "tls" or "none")。network = "tcp" 时不接受 tls,应改写为 network = "tls"。network = "tls" 时,无论这里写什么,连接都是 TLS。 |
tls | table | 视情况 | — | 证书、私钥和证书校验设置,只有 stream 真正用到 TLS 时才会读取;例外是 ws 或 grpc 出站总会读取 server_name,作为 Host 或 :authority 的后备值。使用 TLS 的入站必须在这里写 cert_file 和 key_file。见 [stream.tls] 表。 |
ws | table | 否 | — | WebSocket 的路径和 Host,只有 network = "ws" 时才会读取。见 [stream.ws] 表。 |
grpc | table | 视情况 | — | gRPC 的服务名和 authority,只有 network = "grpc" 时才会读取;此时必须设置 grpc.service_name。见 [stream.grpc] 表。 |
[inbound.stream.tls] · [outbound.stream.tls] · 详见 传输层与 TLS
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
server_name | string | 否 | — | 仅用于出站。作为 SNI 发送、并用来校验服务器证书的名称。未设置时使用出站的 server。如果这个名称是 IP 地址,则不发送 SNI,证书里必须包含该 IP。ws 或 grpc 出站(无论是否带 TLS)也会拿它作为 ws.host 或 grpc.authority 的后备值。入站忽略此项。 |
allow_insecure | bool | 否 | false | 仅用于出站。完全跳过证书链和主机名校验。不能与 ca_file 同时设置(报 tls.allow_insecure and tls.ca_file cannot both be set)。入站忽略此项。 |
ca_file | path | 否 | — | 仅用于出站。PEM 格式的 CA 证书文件,在系统根证书之外额外信任这些 CA;主机名仍然会校验。文件里没有证书时报 no certificate in CA PEM bundle。不能与 allow_insecure 同时设置。入站忽略此项。 |
cert_file | path | 视情况 | — | 仅用于入站;入站使用 TLS 时必填(否则报 tls stream needs tls.cert_file)。PEM 格式的证书链:叶子证书在前,中间证书在后。出站忽略此项,不支持客户端证书。 |
key_file | path | 视情况 | — | 仅用于入站;入站使用 TLS 时必填(否则报 tls stream needs tls.key_file)。与叶子证书对应的 PEM 私钥;私钥与证书不匹配时报 no private key assigned。出站忽略此项。 |
WebSocket
Section titled “WebSocket”[inbound.stream.ws] · [outbound.stream.ws] · 详见 传输层与 TLS
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
path | string | 否 | "/" | 升级请求的 HTTP 路径。空路径视为 /,缺少开头的 / 会自动补上,所以 ray 等同于 /ray。?ed=N 查询参数不算路径的一部分:在出站上它开启最多 N 字节(上限 16384)的 early data;在入站上它会被去掉并忽略。入站对请求路径做精确比较,其他路径一律返回 404。 |
host | string | 否 | — | 入站:设置后,请求的 Host 头必须与之相同(不区分大小写,忽略 :port),否则升级请求返回 404;不设置则接受任何 Host。出站:要发送的 Host 头,未设置时依次使用 tls.server_name 和 server;它不影响 TLS 的 SNI。server 是 IPv6 地址时应设置此项,因为裸 IPv6 地址不能直接作为 URI 主机。 |
[inbound.stream.grpc] · [outbound.stream.grpc] · 详见 传输层与 TLS
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
service_name | string | 视情况 | — | network = "grpc" 时必填(否则报 grpc stream needs grpc.service_name)。隧道路径为 /SERVICE/Tun 和 /SERVICE/TunMulti。名称原样拼进路径,所以不要带斜杠。两端必须使用相同的名称。 |
authority | string | 否 | — | 仅用于出站。每个请求的 HTTP/2 :authority,未设置时依次使用 tls.server_name 和 server;它不影响 TLS 的 SNI。server 是 IPv6 地址时应设置此项,因为裸 IPv6 地址不能直接作为 URI authority。入站不检查 authority,也忽略此项。 |
路由与负载均衡
Section titled “路由与负载均衡”[route] · 详见 路由
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
default | string | 否 | — | 所有规则都不匹配时使用的出站或负载均衡器的 tag。不写时,文件里的第一个 [[outbound]] 就是默认出站;负载均衡器不会被隐式选为默认。若该 tag 既不对应出站也不对应负载均衡器,则报 route references unknown outbound tag: <tag>。 |
geoip | path | 视情况 | — | v2ray 格式 geoip.dat 的路径。只要有规则使用 geoip 就必须设置(否则报 a geoip matcher is used but no geoip file is configured),没有规则使用时根本不会打开这个文件。相对路径按进程的工作目录解析,而不是配置文件所在目录。启动时、--test 时以及每次重载时都会读取该文件,只保留规则里引用到的 code。 |
geosite | path | 视情况 | — | v2ray 格式 geosite.dat 的路径。只要有规则使用 geosite 就必须设置(否则报 a geosite matcher is used but no geosite file is configured),没有规则使用时根本不会打开这个文件。相对路径的解析和读取时机与 geoip 相同。 |
rule | array of tables | 否 | [] | 路由规则,写作 [[route.rule]] 块(单数:[[route.rules]] 是未知字段)。按文件中的顺序逐条尝试,第一条匹配的规则决定出站。 |
[[route.rule]] · 详见 路由
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
outbound | string | 是 | — | 接收本规则所匹配流的出站或负载均衡器的 tag。tag 不存在时报 route references unknown outbound tag: <tag>。 |
domain_suffix | array of strings | 否 | [] | 匹配该域名本身及其所有子域名,按标签边界匹配:example.com 匹配 example.com 和 a.example.com,不匹配 notexample.com。不区分大小写。不要加前导点:.example.com 什么也匹配不到。 |
domain_keyword | array of strings | 否 | [] | 域名中任意位置包含该字符串即匹配:ads 会匹配 ads.example.com,也会匹配 downloads.example.com。不区分大小写。 |
domain_full | array of strings | 否 | [] | 只匹配完全相同的域名,不含子域名。不区分大小写。 |
domain_regex | array of strings | 否 | [] | Rust regex 语法的正则表达式,对转为小写后的域名求值。不自动锚定:要匹配整个域名,请加上 ^ 和 $。表达式本身不会被转为小写,所以请用小写书写。表达式无效时报 invalid domain regex "<pattern>": …。 |
cidr | array of strings | 否 | [] | 目标 IP 地址落在该网段内即匹配,例如 10.0.0.0/8 或 2001:db8::/32。只写地址表示单个主机。主机位必须为零(否则报 invalid cidr "10.0.0.1/8": host part of address was not zero)。目标地址是域名时永远不匹配。 |
source_cidr | array of strings | 否 | [] | 客户端地址落在该网段内即匹配。语法和报错与 cidr 相同。来自 Unix socket 入站的流没有客户端地址,永远不匹配。 |
port | array of strings | 否 | [] | 目标端口,写成字符串:单个端口 "443",或闭区间 "8000-9000"。数字两侧可以有空格。直接写整数是类型错误(expected a string);下界大于上界的区间报 invalid port spec: "9000-8000" has a lower bound above its upper bound。 |
network | string (enum) | 否 | — | 流的传输协议:tcp 或 udp。只能写一个字符串,不能写数组,且只接受小写。其他取值报 invalid rule network "<value>" (expected "tcp" or "udp")。 |
inbound_tag | array of strings | 否 | [] | 从这些入站进入的流即匹配。按原样比较,区分大小写。不会与文件中的入站核对,所以写错的 tag 也能通过校验,只是永远不匹配。 |
geosite | array of strings | 否 | [] | [route].geosite 中的列表:写 code,或写 code@attr 只取带该属性的条目。code 和属性都不区分大小写。不要写 geosite: 前缀。code 不存在时报 geosite code not found: <code>;属性不存在时可以通过校验,但什么也匹配不到。 |
geoip | array of strings | 否 | [] | [route].geoip 中的列表:code 匹配列表内的目标 IP,!code 匹配列表外的目标 IP。不区分大小写。与 cidr 一样,两种写法都永远不会匹配以域名给出的目标地址。code 不存在时报 geoip code not found: <code>。 |
[[balancer]] · 详见 负载均衡器
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
tag | string | 是 | — | 负载均衡器的名称。[route].default 和 [[route.rule]].outbound 引用它的方式与引用出站完全相同。它不能与任何 [[outbound]] 的 tag 重复,也不能与另一个负载均衡器的 tag 重复;两种情况都报 balancer tag <tag> collides with an outbound tag。 |
outbounds | array of strings | 是 | — | 成员出站,按 tag 精确匹配。至少一个(否则报 a balancer needs at least one outbound)。只接受 [[outbound]] 的 tag:不存在的 tag 或另一个负载均衡器的 tag 都报 balancer <tag> references unknown outbound tag: <member>。每个成员都必须有可供 TCP 连接探测的 server 和 port。hysteria2 成员一律被拒绝;freedom、blackhole 和 wireguard 成员通常没有 server 和 port,因此也被拒绝;两种情况都报 balancer <tag>: outbound <member> has no upstream a TCP health probe can reach, so it cannot be balanced。在 failover 策略下,列表顺序就是优先级。同一个 tag 写两次也会被接受,并按两个成员计算。 |
strategy | string (enum) | 否 | "failover" | 为每个新的流挑选健康成员的方式:failover 取 outbounds 顺序中第一个健康成员,round_robin 依次轮流使用各个健康成员。按原样匹配,区分大小写;其他值(例如 "roundrobin" 或 "Failover")报 unknown balancer strategy "<value>" (expected "failover" or "round_robin")。 |
probe_interval | u64 | 否 | 30 | 一个成员的一次健康探测结束后,等待多少秒再开始下一次。每个成员按各自的节奏探测,配置启动后立即进行第一次探测。0 也会被接受,此时探测一次接一次、没有间隔,会持续不断地向上游建立连接。 |
probe_timeout | u64 | 否 | 5 | 一次探测(包括域名解析)最多可用的秒数,超时即认为该成员不可用。0 也会被接受,但一次探测只剩到下一个定时器 tick(约 1 毫秒)为止的时间,除非连接几乎立即建立,否则成员会被标记为不可用。请至少设为 1。 |
[dns] · 详见 DNS
| 键 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
backend | string (enum) | 否 | "system" | 解析结果的来源:system(主机解析器,即 getaddrinfo)、udp(基于 UDP 的普通 DNS)、tls(DNS over TLS,RFC 7858)或 https(DNS over HTTPS,RFC 8484)。只接受小写;其他值会报错 dns: unknown backend "…" (expected "system", "udp", "tls" or "https")。 |
server | string | 视情况 | — | udp、tls、https 必填。解析服务器的 socket 地址,写成带端口的 IP 字面量,例如 "192.0.2.53:53" 或 "[2001:db8::53]:853"。写主机名或漏写端口会被拒绝,报 dns: invalid server address: invalid socket address syntax,因为此时还没有可以用来解析它的解析器。对 https 而言,实际拨号的就是这个地址,与 url 里的主机和端口无关。system 忽略此项。 |
server_name | string | 视情况 | — | tls 必填。作为 SNI 发送、并用来校验解析服务器证书的名称。它不会从 server 推断;缺少时报 dns: the tls backend needs a server name to verify against。其他后端都忽略此项,包括 https,后者从 url 中取名称。 |
url | string | 视情况 | — | https 必填,必须以 https:// 开头。其中的主机名作为 SNI 和 Host 头发送,也用于校验证书;从第一个 / 起的部分是请求路径,没有路径时使用 /dns-query。URL 中的端口会被忽略;主机在第一个 : 处截断,所以请写成域名:IPv6 字面量能通过配置检查,但每次查询都会失败。带 userinfo(user@)或主机为空的 URL 会被拒绝。其他后端忽略此项。 |
ca_file | path | 否 | — | 额外信任的 CA 证书(PEM),供 tls 和 https 在系统信任库之外使用,适合使用私有证书的解析服务器。只要设置了这个键,无论哪种后端都会读取该文件,所以即使是 system 或 udp,文件不存在也会导致配置失败;只有 tls 和 https 会解析其内容,文件中没有证书时报 no certificate in CA PEM bundle。相对路径以进程的工作目录为基准。 |