跳转到内容

术语表

本页定义指南其余部分所依赖的术语,按英文原词的字母顺序排列。每个词条只有一两句话,并链接到完整讲解该主题的页面。有些词在 etemenanki-app 和 katana 中的含义略有不同,遇到这种情况词条会专门说明。

每个词条的标题是中文页面使用的译名,正文中括号内给出英文原词。如果译名本身就是英文原词,例如 generation(一代实例),中文页面保留英文,并在首次出现时附上括号内的释义。标注“保留英文”的名称一律不翻译。完整对照表见本页末尾的中文术语。

大多数术语都对应客户端连接穿过代理时所经过的某个阶段。下图中标注 katana 的三个阶段只存在于 katana;在 etemenanki-app 中,流从入站直接进入路由器,再从路由器直接到达出站。

flowchart LR
  C["客户端"] --> L["监听器与传输层"]
  L --> I["入站:协议核心"]
  I --> F["流(可能经过嗅探)"]
  F --> A["katana:准入"]
  A --> R["路由器:规则、地理数据"]
  R --> AU["katana:审计规则"]
  AU --> M["katana:计量器"]
  M --> O["出站或负载均衡器"]
  O --> D["目标地址"]

出站的地址族(address family)由 address_family 设置,决定它解析域名时可以使用哪些 IP 版本,以及按什么顺序尝试:auto(默认)、ipv4_only、ipv6_only、prefer_ipv4 或 prefer_ipv6。对 freedom 而言它作用于每个目标地址,对 wireguard 作用于隧道内的目标地址,对代理协议出站则作用于其 server 域名。参见 address_family。

准入(admission)是 katana 在每个流被路由之前所做的检查:确认该流的用户仍在节点当前的用户列表中。已被面板移除的用户会在这里被拒绝;通过准入的流会拿到该用户的租约和流量计数器。参见 katana 的工作方式。

审计规则(audit rule)是 katana 用来匹配每个流所请求主机名的正则表达式。一旦匹配,该流即被拒绝,并为该用户记录一次命中。规则来自面板和本地的 rule_list_path 文件。命中面板自身规则的记录会上报给 SSPanel,由它保存检测日志;命中本地规则的记录,以及在 Xboard 或 V2board 上的所有命中,都不会上报。参见目标审计。

背压(backpressure)是接收方较慢时让发送方随之放慢的机制。每连接的运行时使用固定大小的缓冲区:当连接的一端不接收数据时,它就停止从另一端读取,于是发送方只能等待,而不是由代理不断缓存越来越多的数据。WireGuard 出站共享隧道中的每个流也是如此:隧道为每个流只排队有限的数据量,因此某个流的目标停止读取时,只有该流自己的发送方需要等待,隧道中的其他流照常传输。开发者指南介绍了这一机制。

负载均衡器(balancer)即 etemenanki-app 中的 [[balancer]],它把多个出站归到同一个 tag 下,凡是能用出站 tag 的地方都可以用这个 tag。TCP 连接探测会检查每个成员,默认每 30 秒一次;failover 选择第一个健康的成员,round_robin 轮流使用健康的成员,所有成员都不可用时使用第一个成员。katana 没有负载均衡器。参见负载均衡器。

blackhole(也可写作 block)是丢弃流量的出站,通常用作屏蔽规则的目标。两个程序对 TCP 的处理不同:etemenanki-app 先向客户端返回成功,然后不发送任何数据就结束该流;katana 则在拨号之前就拒绝该流。两者都会丢弃 UDP 数据包且不作应答。参见 freedom 与 blackhole 和 katana 路由。

承载连接(carrier connection)是承载一个 mux.cool 会话的那条客户端连接。它自身的目标地址 v1.mux.cool:0 只是一个标记,从不会被拨号;关闭承载连接会结束其上的所有子流。参见 Mux 和 XUDP。

circuit(保留英文)是 Hysteria 2 QUIC 连接内部的一条被代理的 TCP 流或 UDP 关联。客户端在每条 QUIC 连接上只认证一次,之后在其上打开 circuit;max_circuits 限制每个监听器上的 circuit 数量。参见连接与 circuit 上限。

codec(保留英文)是代理协议的客户端一半:它向上游服务器写出握手,封装发出的数据,并解开返回的数据。socks、http、shadowsocks、trojan、vless 和 vmess 出站都是运行在传输层之上的 codec。参见开发者指南。

配置检查(configuration check),即 --test,会加载并构建配置,但不绑定任何端口,也不联系面板,然后输出 Configuration OK.(etemenanki-app)或 Configuration OK(katana),或者输出发现的第一个错误。只在绑定时才会出现的问题,例如端口已被占用,不会被检查出来。参见命令行。

connector(连接器)是协议核心需要为某个流建立出站连接时所调用的组件。在 etemenanki-app 中,connector 对流进行路由,并让选中的出站去拨号;在 katana 中,它还会对用户做准入、应用审计规则,并用计量器包裹该连接。参见开发者指南。

协议核心(core,protocol core)是以 sans-I/O 状态机形式编写的协议服务端一半:它接收客户端的字节,并以“打开这个目标地址”“转发这些字节”或“关闭”之类的效果作为回应,自己从不操作 socket。大多数入站协议都是协议核心;SOCKS 入站是例外,它有自己的驱动。参见开发者指南。

custom_config(保留英文)是 SSPanel 节点的一个 JSON 字段,katana 从中读取节点的端口、传输层、TLS 设置及相关选项。当面板报告的版本为 2021.11 或更高时,katana 读取该字段;设置了 disable_custom_config = true 或面板版本较旧时,它改为解析旧式的 server 字符串;而较新的面板若发送空的 custom_config,则视为错误。参见 SSPanel。

数据报(datagram)即一个 UDP 数据包。被代理时,每个数据报都携带自己的目标地址,因此两个程序都按数据包逐个路由 UDP,而不是每个关联只路由一次。参见 UDP 如何到达出站。

欠额(debt)是令牌桶的负余额。katana 对每次传输都全额扣费,即使传输量超过桶的容量也是如此;该用户随后的传输要等到补充的令牌还清欠额后才能进行,因此无论数据块多大,平均速率都保持不变。参见以欠额代替等待令牌。

默认路由(default route)是没有任何规则匹配时流所使用的出站。在 etemenanki-app 中它是 [route].default,未设置 default 时则是文件中的第一个 [[outbound]];在 katana 中它是 [node.route].default,默认值为 direct。参见 tag 与默认路由。

拨号器(dialer)负责打开主机的出站 TCP 连接和 UDP socket。TCP 拨号器会依次尝试目标的各个地址,每次尝试最多等待 10 秒,并保留第一个成功建立的连接。参见开发者指南。

DNS 解析器(DNS resolver)为出站把域名解析为地址。[dns] 选择后端:system(主机解析器,默认)、udp、tls(DNS over TLS)或 https(DNS over HTTPS),解析结果会被缓存。etemenanki-app 为每个 generation 构建一个解析器;katana 的所有节点共享一个解析器。参见 DNS。

ETag(保留英文)是面板随响应发送的版本标记。katana 会在 If-None-Match 中回传上一次收到的 ETag;如果面板返回 304 Not Modified,就说明没有变化,katana 继续使用已有的数据。参见 ETag。

fail closed(出错即拒绝)指在出现错误或未知情况时直接拒绝,而不是退回宽松的默认值。两个程序都会拒绝未知的键,以及 protocol、network、security 等设置的未知取值,因此一个拼写错误会让配置无法加载,而不是比如悄悄关闭 TLS;katana 还会拒绝要求它未实现功能的节点。参见严格是有意为之。

流(flow)是一次被代理的请求,也是路由、准入和计量的基本单位:一个 TCP 请求、mux.cool 中的一个子流、一个 UDP 关联或一条 Hysteria 2 流。它携带目标地址、已认证的用户、客户端地址以及嗅探到的域名(如有)。参见路由。

freedom(也可写作 direct)是从本机直接连接到流的目标地址的出站,它使用 DNS 解析器解析域名。在 katana 中,这两个名称都内置于出站池。参见 freedom 与 blackhole。

generation(一代实例)是 etemenanki-app 为某一版配置所运行的全部内容:监听器及其 accept 循环、路由器、负载均衡器探测和 DNS 解析器。重载时先构建并检查新的 generation,然后停止旧的 generation(这会结束其所有连接),再启动新的。katana 不会以这种方式整体替换状态;它一次只重建一个节点的监听器,而且只在变更确实需要时才重建。参见热重载。

地理数据(geodata)指 v2ray 格式的 geoip.dat 和 geosite.dat 文件。geoip 代码匹配列表中的目标 IP 地址,!code 匹配列表之外的地址;geosite 代码匹配一组域名,code@attr 只保留带有该属性的条目。代码不区分大小写,文件路径写在 [route] 或 [node.route] 中,并且只加载被引用的代码。参见路由。

握手(handshake)是在任何有效载荷传输之前建立连接的交互过程。基于 TCP 的入站有两层握手:传输层握手(TLS、WebSocket 升级、gRPC 的 HTTP/2 前言)和协议握手(客户端在其中完成认证并告知目标地址),每一层都必须在 10 秒内完成。参见上限。

热重载(hot reload)在不重启进程的情况下应用修改后的配置文件;两个程序都会监视配置文件所在的目录。etemenanki-app 在文件字节发生变化时替换整个 generation,这会断开所有连接;katana 则只应用差异部分,因此很多修改不会中断连接。无法解析或构建的文件会被记录到日志,当前运行的配置保持不变。在 etemenanki-app 中,新 generation 绑定端口时旧 generation 已经停止,因此此时无法绑定端口的入站会被记录到日志并保持停止,其他入站照常服务。参见热重载和 katana 热重载。

入站(inbound)负责接受客户端连接,由一个监听器、一种协议(socks、http、shadowsocks、trojan、vless、vmess、hysteria2 或 tun)以及(部分协议所需的)传输层组成。在 etemenanki-app 中,每个 [[inbound]] 都由你自己编写;在 katana 中,由面板对节点的描述充当这一角色。参见入站。

租约(lease)是 katana 为每个用户持有的句柄,用于结束该用户的连接。当 katana 在一次刷新中移除某个用户,或者该用户的凭据转移到另一个用户 ID 时,它会取消该租约,该用户所有已打开的连接随之结束;保留下来的用户继续持有自己的租约,其连接在刷新后仍然存在。参见用户刷新保留什么。

遗留流量(leftover traffic)是为已离开节点用户列表的用户统计的字节,或者记在限速变更后被 katana 替换掉的计数器上的字节。katana 会保留这些字节,并在之后的周期中上报,按用户 ID 合并到同一行,因此不会丢失流量。参见用户离开、变更或回归。

监听器(listener)是入站用来接受连接的已绑定 socket:一个 TCP 端口、一个 Unix socket 路径,或者 Hysteria 2 的一个 UDP 端口。tun 入站没有监听器,因为它拥有的是一个网络设备;katana 为每个节点运行一个监听器。参见入站。

masquerade(伪装响应)是 Hysteria 2 入站对所有不是有效认证的请求(包括凭据错误的请求)给出的固定 HTTP/3 响应。默认是一个简单的 404 page not found。参见伪装响应。

匹配条件(matcher)是路由规则中的一个条件键,例如 domain_suffix、cidr、port、geosite 或 inbound_tag。只要规则中任一匹配条件的任一条目匹配,该规则就匹配;无法要求两个条件同时成立。参见路由。

计量器(meter)是 katana 套在每条出站连接外面的包装层。它为流量计费统计用户的上传和下载字节,并用该用户的令牌桶控制其速率。参见限速如何执行。

mod_mu(保留英文)是 SSPanel 的节点 API,位于 /mod_mu/ 下。设置 panel_type = "SSpanel" 时,katana 通过它获取节点信息、用户和审计规则,并提交流量和审计命中。参见 SSPanel。

mux.cool(保留英文)是 Xray 的多路复用协议,在一条 VLESS、VMess 或 Trojan 连接上承载多个子流。入站会自动接受它,每条承载连接最多 256 个子流;出站从不发送 mux.cool。参见 Mux 和 XUDP。

节点(node)是面板中的一个代理服务器条目,由节点 ID 标识。katana 为配置文件中的每个 [[node]] 提供服务,每个节点都有自己的面板连接、监听器和路由表。配置文件设置节点类型,面板决定其端口、传输层、TLS 设置和用户(Hysteria 2 节点也可以改从 [node.hysteria] 获取端口)。无法启动的节点,例如因为面板不可达或端口仍被占用,会不断重试:首次失败后 katana 等待 1 秒,之后每次等待时间翻倍,最长 60 秒;如果 update_periodic 更短,则以它为上限。修改该节点的配置条目会立即触发重试。参见节点和节点启动失败时。

节点身份(node identity)是确定某个 [[node]] 条目所服务的面板节点的一组值:panel_type、api.host、api.node_id、api.key,以及在 NewV2board 和 V2board 上 katana 向面板请求的节点类型(enable_vless = true 的 V2ray、Vmess 或 Vless 节点为 vless,否则为小写的 node_type)。在配置文件中修改其中任何一个,都会用一个全新的节点替换原节点,而不是更新它。其他所有修改都会作用到运行中的节点,包括 api.timeout 等其余 [node.api] 配置项;修改 [node.api] 会为节点创建新的面板客户端。参见节点身份。

节点 tag(node tag)是 katana 在部分日志行中用来称呼节点的名称,也用于区分各节点的审计规则和命中记录:由节点类型、监听地址和端口以下划线连接而成,例如 V2ray_0.0.0.0_443。由于其中包含端口,面板把节点改到其他端口时它也会随之变化。参见节点。

节点类型(node type),即 [node.api] 中的 node_type,告诉 katana 面板描述的是哪种节点:V2ray(VMess,或在 enable_vless = true 时为 VLESS)、Trojan、Shadowsocks 或 Hysteria2。比较时不区分大小写,并接受 vmess、vless、hysteria 和 hy2 作为别名;仅写 vless 并不会启用 VLESS。SSPanel 节点不能是 Shadowsocks。参见协议。

出站(outbound)是流离开代理的出口。freedom 直接连接,blackhole 丢弃流量,代理协议通过上游服务器中继,wireguard 经由 WireGuard 隧道发送;每个 [[outbound]] 都有一个供路由引用的 tag。参见出站,katana 提供的协议另见 katana 出站。

出站池(outbound pool)是每个 katana 节点都可以路由到的出站集合:内置的 direct、freedom、block 和 blackhole,加上每个顶层 [[outbound]]。所有节点共享同一个出站池,修改任何一个 [[outbound]] 都会重建出站池以及每个节点的监听器。参见 katana 出站。

面板(panel)是管理用户、套餐和节点的 Web 应用,例如 Xboard、V2board 或 SSPanel。katana 通过 UniProxy 或 mod_mu 向面板轮询节点设置和用户,并把流量上报给它。参见支持的面板。

许可(permit)是固定大小限额中的一个名额,在其所计数的对象存续期间一直被占用。流式入站(接受 TCP 或 Unix socket 连接的入站)允许 65,536 个活跃连接,每个连接从 accept 起一直持有许可直到关闭,同时允许 2,048 个仍处于握手阶段的连接;katana 监听器有同样的两项限制,另外还有 512 个预认证许可。Hysteria 2 和 TUN 入站有各自的限制。参见上限和连接护栏。

占位值(placeholder)是示例中明显虚构的值,例如 example.com、192.0.2.0/24 中的地址、UUID 11111111-2222-3333-4444-555555555555 或密码 replace-with-a-long-random-password。本指南选用的占位值都能通过解析器,这样 --test 就能检查文件的其余部分,但在正式投入使用之前,你必须替换每一个占位值。完整示例见配置文件和 katana 快速开始。

轮询周期(poll cycle)是 katana 针对单个节点的控制循环。每隔 update_periodic 秒(默认 60),节点从面板获取设置和用户,应用其中的变化,刷新审计规则,并上报流量和审计命中。对节点 [node.api] 配置项的修改,或对构建其监听器所用本地设置(例如 listen_ip、证书或路由)的修改,一旦被接受,就会立即运行一次周期,而不必等待定时器。参见轮询周期。

预共享密钥(pre-shared key)是通信双方事先都知道的密钥。Shadowsocks 2022 加密方式使用长度与该加密算法密钥长度一致(16 或 32 字节)的 base64 密钥,密钥过短会报错(可用 openssl rand -base64 32 生成,AES-128 加密方式则用 16)。WireGuard 出站可以额外设置可选的 preshared_key(在 katana 中为 pre_shared_key)。参见生成密钥。

速率限制(rate limiting)指把流量控制在固定速率。在本指南中,它是 katana 限速背后的机制:每个节点上为每个用户设一个令牌桶,由该用户在此节点上的所有流共享。参见限速。

REALITY 和 XTLS(均保留英文)是两个程序都未实现的 Xray 功能:REALITY 握手,以及 Vision 等 XTLS flow 模式。etemenanki-app 没有与之对应的键;如果节点的面板设置启用了 REALITY 或设置了 XTLS flow,katana 会拒绝该节点。参见从 Xray 迁移。

中继(relay)是握手之后的阶段,代理在此阶段双向地在客户端和出站之间复制字节,直到连接结束。有效载荷只有从这一阶段开始才会到达目标地址;在此之前的都是握手、嗅探、路由和拨号。参见上限。

路由(routing)为每个流选择一个出站。规则(rule)按书写顺序检查,第一条匹配的规则生效;没有匹配任何规则的流使用默认路由。TCP 流在打开时路由一次,UDP 关联则按数据包逐个路由。参见路由和 katana 路由。

运行时(runtime)是以单个任务运行一条被代理连接的驱动。它读取客户端的传输层,把字节交给协议核心,执行协议核心返回的效果,并拥有协议核心打开的每条出站连接。参见开发者指南。

Salamander(Salamander 混淆)是通过 obfs = "salamander" 启用的 Hysteria 2 混淆。每个 QUIC 数据包都与一个由 obfs_password 和每包随机盐派生出的密钥流做异或,使流量看起来不再像 QUIC;它隐藏了协议特征,但并不提供加密。参见混淆(Salamander)。

sans-I/O(保留英文)描述不执行任何输入输出的协议代码:它消费字节并返回决策,而由独立的运行时负责 socket 和定时器。内核的协议核心和 codec 都以这种方式编写,因此每一个都可以在没有网络的情况下逐字节测试。参见开发者指南。

嗅探(sniffing)从以 IP 寻址的流的最初几个字节中读取域名:TLS ClientHello 中的 SNI,或 HTTP 请求的 Host 头。之后域名规则和 geosite 规则也会匹配这个域名,但流仍然拨号到原始地址。嗅探最多等待 300 ms、最多读取 4 KiB,默认开启。参见嗅探和 katana 嗅探。

限速(speed limit)是用户的带宽上限,单位为 Mbps,由面板为每个用户设置,在 SSPanel 上还可以为节点设置;katana 取其中较小的非零值,并按 1 Mbps = 125,000 字节/秒换算。[node.api].speed_limit 会覆盖该节点上所有来自面板的限速。参见限速。

stream 设置(stream settings),即 [inbound.stream] 和 [outbound.stream] 表,用于选择协议所运行的传输层(transport):tcp、tls、ws(WebSocket)或 grpc,其中 security = "tls" 在 WebSocket 或 gRPC 之下加上 TLS。入站中只有 http、trojan、vless 和 vmess 接受传输层设置;katana 从面板获取传输层。参见传输层。

子流(sub-flow)是 mux.cool 承载连接中的一个流:一条 TCP 流,或者借助 XUDP 的一个 UDP 会话,各自有自己的目标地址。每个子流都单独进行路由和嗅探,在 katana 中还会单独审计和计量。参见 Mux 和 XUDP。

tag(保留英文)是入站、出站或负载均衡器的名称,供规则、default 和日志行使用。tag 按精确值比较,区分大小写;入站 tag 在所有入站中必须唯一,出站和负载均衡器共用同一组 tag。参见 tag 与默认路由。

令牌桶(token bucket)是 katana 的每用户速率限制器。它按用户的限速补充令牌,最多容纳该速率下一秒的量,并由该用户在该节点上的所有流双向共享;超过余额的传输会让令牌桶进入欠额。参见每个用户一个令牌桶。

流量计费(traffic accounting)是 katana 对每个用户上传和下载字节数的统计。计量器在出站一侧统计去掉入站协议封装之后的纯载荷,因此协议和传输层开销不计费,被拒绝的流也不产生任何费用。参见统计哪些字节。

流量上报(traffic reporting)在每个轮询周期把统计的字节数发送给面板,每个用户 ID 一行。上报成功时,katana 精确扣除已上报的量;上报失败时,它保留这些字节,并随下一次上报一起发送。参见流量上报。

TUN 入站(保留英文),即 protocol = "tun",会创建一个三层网络接口,并把主机路由进该接口的 TCP 连接和 UDP 数据包转换为流。它只存在于 etemenanki-app 中。参见 TUN。

UDP 关联(UDP association)是某个客户端经由入站建立的 UDP 会话:SOCKS5 的 UDP ASSOCIATE、通过 VLESS、VMess 或 Trojan 发起的 UDP 请求、XUDP 子流,或 Hysteria 2 的 UDP 会话。它没有单一的目标地址,因此每个数据包都按自身的地址路由;一个关联会为它路由到的每个出站保留一条链路,同一时间最多 64 条。参见 UDP 如何到达出站。

UniProxy(保留英文)是 Xboard 和 V2board 的节点 API,位于 /api/v1/server/UniProxy/ 下。设置 panel_type = "NewV2board" 或 "V2board" 时,katana 调用 config 获取节点设置,调用 user 获取用户,调用 push 上报流量。参见 Xboard 与 V2board。

Xray-core 是 etemenanki-app 在协议和配置模型上所参照的 Go 代理,XrayR 是 katana 所仿照的 Go 面板节点 agent;这两个名称都保留英文。两个程序都不读取它们的配置文件(JSON 和 YAML 格式),而是都使用 TOML。参见从 Xray 迁移和从 XrayR 迁移。

XUDP(保留英文)是 mux.cool 的扩展,让 UDP 子流的每个数据包都携带目标地址,从而使一个子流可以与多个对端通信。入站接受 XUDP;XUDP 全局 ID 会被读取,但不会用于在新连接上恢复会话。参见 Mux 和 XUDP。

中文页面对下表中的每个术语都严格按表中译法翻译,保证同一概念始终只有一个名称。配置键、取值、命令行参数、类型名、文件路径、错误信息和日志行一律不翻译。

English 中文 说明
address family 地址族
admission 准入
audit (rule) 审计(规则)
backpressure 背压
balancer 负载均衡器
cancellation 取消
carrier connection 承载连接
certificate, private key 证书,私钥
circuit circuit 保留英文
codec codec 保留英文
configuration check 配置检查
connector connector(连接器) 英文原词加释义
core (protocol core) 协议核心(core)
datagram 数据报
debt 欠额
default route 默认路由
dialer 拨号器
DNS resolver DNS 解析器
fail closed fail closed(出错即拒绝) 英文短语加释义
flow 流
generation generation(一代实例) 英文原词加释义
geodata 地理数据 geoip 和 geosite 保留
handshake 握手
hot reload 热重载
inbound / outbound 入站 / 出站
invariant 不变量
lease 租约
leftover traffic 遗留流量
listener 监听器
masquerade masquerade(伪装响应) 英文原词加释义
matcher 匹配条件
meter 计量器
node identity 节点身份
node tag 节点 tag
node type 节点类型
obfuscation 混淆
outbound pool 出站池
panel, node 面板,节点
permit (semaphore) 许可(permit)
placeholder 占位值
poll cycle 轮询周期
pre-shared key 预共享密钥
rate limiting 速率限制
relay 中继
routing, rule, matcher 路由,规则,匹配条件
runtime 运行时
sniffing 嗅探
speed limit 限速
sub-flow 子流
tag tag 保留英文
token bucket 令牌桶
traffic accounting 流量计费
traffic reporting 流量上报
transport, stream settings 传输层,stream 设置
UDP association UDP 关联
user table 用户表

以下名称始终保留英文:ETag、mod_mu、mux.cool、REALITY、Salamander、sans-I/O、SSPanel、TUN、UniProxy、V2board、Xboard、Xray-core、XrayR、XTLS 和 XUDP。