Skip to content

前置端口转发服务

管理员在「协议服务 → 创建协议服务」选择“实际协议监听”或“前置端口转发”。前置转发选择 A 的端口和 B 的现有协议作为父协议;A 只部署原始端口转发,不创建 B 的协议监听,客户端握手和认证始终在 B 完成。独立的“网络前置”菜单已合并,旧地址跳转到协议服务的前置转发分区。保存、编辑、停用和删除都会进入持久化节点发布队列;失败自动重试,列表展示排队状态与失败原因。

权限与订阅

前置线路是入口 A 与落地协议 B 的组合服务,可以独立加入节点组。节点组分别保存 protocol_endpoint_ids(直连协议服务)与 network_entry_ids(前置线路)。套餐继续选择节点组,用户仅获得该节点组明确分配的服务。

入口授权与落地授权必须分别显式给予。例如,节点组只勾选 A→B 时,仅保存入口使用范围,不创建或同步 B 的用户凭据。只有同一订阅的节点组还显式包含 B,才会为该订阅生成 B 的认证凭据,并交付 B 直连与已授权的 A→B。没有 B 凭据时,订阅导出会省略无法认证的协议节点,不生成假凭据或导出 B 的静态共享凭据。

B 承载用户鉴权和流量结算。凭据按订阅和已明确授权的落地协议生成;多个已授权入口可以复用同一落地凭据,流量倍率沿用 B。移除 B 授权后,即使 A 仍在组内,订阅投影和新的 B 运行配置也会排除旧凭据,协调任务会将旧凭据标为撤销。远端生效仍依赖配置成功发布,离线节点可能暂时保留旧运行配置。订阅模板中的策略组仅组织已授权节点,不能补齐落地权限。

前置线路只替换客户端连接地址和端口,保留 B 的 TLS、Reality、SNI 与传输参数;原本隐式采用 B 域名的证书校验名称会被显式保留。A 的代理路径凭据加密保存,仅下发 A,不回显到管理端,也不下发订阅。

A 或 B 配置尚在发布队列时,前置线路暂不下发;入口停用、A/B 离线或分配被移除时也不下发。不自动补发 B 直连。删除入口时在数据库事务内自动清理节点组关联;删除 A、B 或落地协议会清理相关入口,并为仍保留的 A 排队撤除配置。SSH 不可达不阻止本地删除。

升级现有入口

升级会创建独立的节点组入口关联表,不会把旧入口自动授权给所有能使用 B 的用户。现有入口的转发配置保留,管理员需要在前置服务编辑器的“关联节点组”或「节点组 → 前置线路」明确分配后才恢复订阅交付。B 已有的明确组成员保持原样,不根据入口关联新增 B 成员。若有历史版本产生的隐式 B 凭据,显式授权过滤会阻止其订阅交付与运行配置下发,凭据协调会将其撤销。

分发权限与连接隔离

A 是不鉴权的原始 TCP/UDP 转发器,不会单独认证用户。只授予 A 而未授予 B 时,B 拒绝用户属于预期行为。明确授予 B 的用户本来就有 B 的直连资格;同一凭据经过哪个透明入口,不构成新的权限边界。本功能不宣称能够禁止已授权 B 的用户手动换地址。

运行方式与兼容

A 是固定目标的原始 TCP/UDP 转发器,B 执行协议解密、用户鉴权和用户流量结算。A 的网络统计仍会记录传输量,但不产生 B 用户的第二份扣费。B 看到的网络源地址是转发路径的出口地址。

生成的 Zero 入站复用已有的 udp.enabled;全局和入站开关均默认开启:

json
{
  "tag": "entry-1",
  "listen": {"address": "0.0.0.0", "port": 10000},
  "udp": {"enabled": true},
  "protocol": {
    "type": "direct",
    "target": "landing.example.com", "port": 443
  }
}

选择“TCP 与 UDP”时,入口 A 和面板本地的校验内核必须在 build-infoprotocol_capabilities 中声明 direct.inbound.udp.supported=true。仅能解析 udp.enabled 不代表支持原始 UDP 转发;未声明能力时拒绝发布。选择“仅 TCP”时生成 udp.enabled=false,保留旧内核可用的 TCP 配置;Hysteria2 不允许选择仅 TCP。仅 TCP 的 Shadowsocks 前置线路在 Clash、sing-box 和 Zero 订阅中明确关闭 UDP,原始 SS 分享链接不能通用表达这个限制,导入后也只能用于 TCP。B 直连线路不受影响。旧内核的 direct 只接收 TCP;新内核默认同时监听 TCP 和 UDP。升级后需要仅 TCP 的现有入口应明确关闭 UDP;UDP 端口冲突会导致激活失败并回滚,不能静默降级为 TCP。B 不因前置功能本身需要升级。

目标使用 B 协议的对外地址和对外端口;A 的监听端口与对外端口可以不同,以支持已有端口映射。管理员应确保 A 的 TCP、UDP 端口以及 A 到 B 的路径可达。A 与 B 必须为不同节点,入口端口不能与 A 的协议、用户端口或其他入口重复。历史独立用户端口未迁移完成时拒绝创建,需先重新发布 B 完成统一协议端口迁移。

可选代理路径

前置服务默认“直连落地”,不需要代理池。需要代理时,在「节点资产 → A 的详情 → 共享代理池」创建池,再在服务的“A 到 B 的路径”选择“使用 A 的共享代理池”。池配置是节点内资源,只能由同一 A 上的入口引用。

新建共享池时可配置代理节点、测速组、选择组和多跳链路,并选择最终出口 target。配置使用 Zero JSON;保存前检查节点标识、成员引用和协议参数,具体格式见下方示例。

多条入口绑定各自的 B 协议端口,共用一份带 pool-ID/ 前缀的代理图及测速状态,不会按入口复制 URLTest。每条入口独立生成匹配规则;选择直连的入口显式绕过池。代理池本身的内部认证不改变客户端协议在 B 完成握手和用户认证的事实。

更新池会排队发布 A,所有引用入口一起生效;删除仍被引用的池会被拒绝。删除节点资产时自动清理其入口、关联及自有代理池,不执行 SSH 或供应商清理。保存池配置经过 Zero 校验,替换配置还会检查所有已引用入口的 TCP/UDP 兼容性,失败回滚。凭据加密保存,不下发给订阅客户端,列表和保存响应也不返回配置。旧的入口独立代理路径保留兼容,可切换成共享池或直连。

完整路径示例:

json
{
  "outbounds": [
    {"tag":"hop1","protocol":{"type":"socks5","server":"proxy1.example.com","port":1080}},
    {"tag":"hop2","protocol":{"type":"shadowsocks","server":"proxy2.example.com","port":1080,"cipher":"aes-128-gcm","password":"replace-me"}}
  ],
  "outbound_groups": [
    {"tag":"chain","type":"relay","proxies":["hop1","hop2"]},
    {"tag":"auto","type":"url_test","outbounds":["hop1","hop2"],"interval_seconds":300}
  ],
  "target":"chain"
}

url_test 在多个候选出口中选择,relay.proxies 则按顺序组成多跳代理链,两者含义不同。保存时由 Zero 校验结构、协议字段与引用关系;具体出口还需要支持实际使用的 TCP/UDP 路径。在“TCP 与 UDP”模式下,已知不支持 UDP 的 HTTP CONNECT、VLESS Vision 和以 SOCKS5 为最后一跳的 UDP 代理链会被明确拒绝;仅 TCP 模式允许由内核校验通过的 TCP 路径。每个共享池的出口和组标签只添加一次池前缀;旧的独立路径仍按入口隔离。

前置线路保留 B 的 TLS/SNI/Reality 身份,以及 WebSocket 和 HTTP/2 的 Host;仅连接地址和端口替换为 A,避免长域名、CDN 或证书校验随入口地址发生变化。UDP 为每个客户端建立独立转发会话,避免多个用户向同一 B 协议发送数据时回包混淆。

ZeroDeNet