Skip to content

服务发布器

服务发布器就是 ServicePublisher。它是 Linux 无头接入端,适合部署在 NAS、家庭服务器、云主机或其他长期在线的服务机器上。

它会把这台 Linux 机器接入指定 PNC 节点,并向核心节点上报这台机器提供的服务清单。

config.yaml 中的 server_node 推荐填写唯一节点名称。当前仍兼容填写在线 server_id,但 server_id 会随 CoreServer 重启变化;新版 ServicePublisher 会记录上次成功连接的节点名称,并在旧 id 失效时按名称重新解析当前节点。

内置代理出口

ServicePublisher 可以作为 Windows Client 的代理出口。在 config.yaml 中启用:

yaml
proxy:
  enabled: true
  protocol: "mixed"
  port: 7890
  connect_timeout_seconds: 10
  idle_timeout_seconds: 300

代理服务会在 VNT 会话建立后绑定到当前 PNC 虚拟 IP,只接受来自 PNC 网络的访问。mixed 同时支持 HTTP 代理和 SOCKS5 TCP CONNECT,也可以改为 httpsocks5。启用后,ServicePublisher 会自动放行对应 TUN 入站 TCP 端口,并通过服务清单心跳上报 accessMode: "proxy"proxy 元数据,Client 代理页面会把它显示为可选出口。

首版代理出口不提供账号密码认证,默认安全边界是“只绑定 PNC IP + TUN 防火墙”。不要把该端口通过公网端口映射或额外防火墙规则暴露给不可信网络。v1 只承诺 TCP 代理,不转发业务 UDP。

固定 PNC IP

默认情况下,ServicePublisher 的 PNC 虚拟 IP 由目标 CoreServer 动态分配。如果这台机器部署在 NAS、服务器或容器环境中,并长期给其他客户端提供服务,可以在 config.yaml 中改为手动模式:

yaml
pnc_ip_mode: "manual"
pnc_ip: "172.23.10.50"

pnc_ip_mode: "dynamic" 会保持默认动态分配行为;pnc_ip_mode: "manual" 会请求 CoreServer 分配 pnc_ip。手动地址必须位于目标核心节点的虚拟网段内,不能是网关地址,也不能与其他在线设备冲突。默认核心节点网段为 172.23.0.0/16,网关为 172.23.0.1

常见问题

首次运行绑定失败

请在 ConfigServer 管理后台开启新设备绑定,或手动启用当前机器码。

找不到目标节点

确认 server_node 填写的是在线节点名称或当前 server_id,并确认对应 CoreServer 正常上报心跳。长期部署建议使用唯一节点名称;如果旧配置里填的是已经失效的 server_id,需要依赖 ConfigServer 的旧 id alias 或本机 state 中记录的上次节点名称过渡。

容器重建后被识别为新设备

请持久化 PNC_STATE_PATH 对应目录,或者在 config.yaml 中固定 machine_code

服务无法访问

检查服务是否监听在正确地址,确认 Linux 本机防火墙、firewall_rules 和目标端口都允许访问。

Client 代理页面看不到出口

确认 ServicePublisher 已连接目标节点、proxy.enabledtrue,且日志中出现代理监听地址。代理能力只有在数据面可用并成功向 CoreServer 上报服务清单后才会出现在 Client 中;如果代理端口被占用、VNT 正在重连或 TUN 暂不可用,Client 会显示暂无在线代理出口。

手动 PNC IP 启动失败

检查 pnc_ip 是否位于目标 CoreServerVNTS_GATEWAY/VNTS_NETMASK 网段内,并确认没有其他设备正在使用该地址。地址冲突时,ServicePublisher 会停止当前会话并按重试策略重新连接。

日志出现 not tun device

not tun device 表示 VNT 已收到远端数据包,但本机 TUN 设备写入端不可用,数据无法进入 Linux 网络栈。ServicePublisher 不会因为一次瞬时数据面异常立刻重建整个会话,而是暂停服务清单心跳,并等待 VNT 内置重连或重新注册流程恢复 TUN;如果数据面连续不可用超过 30 秒,会停止旧会话并重新从 ConfigServer 按节点名称解析当前 CoreServer 实例。

如果使用 Docker 部署,请保留 network_mode: hostprivileged: true,或提供等价的 /dev/net/tun 与网络管理能力。只有 VNT fatal error、会话真正停止、服务清单上报失败或数据面不可用超时时,ServicePublisher 才会清理当前会话并重建;如果连续启动失败或会话级失效达到 max_reconnect_attempts,进程会以非零状态退出,建议由 Docker 或 systemd 自动重启兜底。收到 SIGTERM/SIGINT/SIGQUIT 时,ServicePublisher 会取消正在进行的配置解析、连接和上报任务,请求 VNT 停止并用带超时的 best-effort 方式清理防火墙;如果温和退出被底层 TUN 或 iptables 卡住,进程会在 8 秒内强制退出,避免 docker compose down 被长时间阻塞。

Developed by SleepyCelery & subtlyrabbit. Thanks to VNT & Tauri.