RustDesk 1.1.16 服务端 Docker Compose 部署指南

用 Docker Compose 在 Ubuntu 22.04 单机部署 RustDesk 1.1.16 自建服务端:hbbs/hbbr 双服务编排、21115-21119 端口矩阵验证、Ed25519 密钥对确认与客户端接入配置全链路实测通过。

RustDeskRustDesk远程控制自托管2026/10/25

RustDesk 1.1.16 服务端 Docker Compose 部署指南

目标:用 Docker Compose 在单台 Ubuntu 22.04 服务器上从零部署 RustDesk 自建服务端(hbbs ID/Rendezvous 服务器 + hbbr Relay 中继服务器),完成「独立网络 → 编排启动 → 端口矩阵验证 → 密钥对确认 → 客户端接入配置」的完整链路。本文全部命令与回显已在 Docker Engine 29.9.2(Compose v5.6.1)环境实测通过。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • Docker Engine:29.9.2,Docker Compose 插件 v5.6.1
  • RustDesk 服务端版本:1.1.16(2026-07-20 发布,官方最新稳定版,发布信息查询日期 2026-10-25)
  • 官方镜像:rustdesk/rustdesk-server:1.1.16(multi-arch manifest,实测磁盘占用 19 MB)
  • 端口规划(RustDesk 标准端口,生产建议直接映射这组端口):
    • hbbs:21115/TCP(NAT 类型测试)、21116/TCP+UDP(ID 注册与心跳、打洞协调)、21118/TCP(WebSocket,Web 客户端)
    • hbbr:21117/TCP(中继)、21119/TCP(WebSocket,Web 客户端)
  • 编排目录:/opt/rustdesk/(示例路径,含 docker-compose.yml、data/hbbs/、data/hbbr/)
  • 独立网络:rustdesk-1.1.16-net(bridge,网段 10.89.70.0/24)
  • 客户端接入信息(部署产物):ID 服务器 = 服务器地址,Key = data/hbbs/id_ed25519.pub 内容

二、镜像选型说明

RustDesk 官方在 Docker Hub 提供两个服务端镜像仓库,选型先定仓库再定标签:

项目取值说明
rustdesk/rustdesk-server本文选用scratch 极简基础(实测 19 MB,无 shell、无包管理器),Entrypoint/Cmd 均为空,靠编排的 command: hbbs / command: hbbr 直接启动对应二进制;hbbs 与 hbbr 拆成两个服务,职责分离、日志分离、可独立重启伸缩
rustdesk/rustdesk-server-s6备选内置 s6-overlay 监督进程,单实例同时跑 hbbs+hbbr 两个进程,用 RELAY/ENCRYPTED_ONLY/KEY_PUB/KEY_PRIV 等环境变量注入配置;适合「一个服务跑全套」的简易场景,但两进程耦合在同一实例内

标签策略(Docker Hub 实测,查询日期 2026-10-25):

标签性质适用
1.1.16精确版本,multi-arch manifest(自动按宿主架构选层)生产推荐,与本文回显一致
1.1.16-amd64 / 1.1.16-arm64v8 / 1.1.16-armv7架构专属标签需锁定架构或 manifest 解析异常时使用
1 / latest滚动标签,跟随最新稳定版升级可控性差,生产不建议

镜像关键元数据(docker inspect 实测):

Entrypoint=null Cmd=null WorkingDir=/root ExposedPorts=null Volumes=null User=
  • 镜像不含 Entrypoint,编排里的 command: hbbs 即整条启动命令(二进制位于 /usr/bin/),工作目录 /root 即密钥对与 SQLite 数据库的落盘目录——这就是唯一需要持久化的路径
  • 未声明任何暴露端口与挂载点,端口矩阵与数据卷全由编排显式给出(见第四章)
  • 镜像为 scratch 形态、内部无 shell,docker exec 进入不可用;运行时治理走 loopback 控制台(见十、常用运维命令)

💡 说明:本文全部使用 1.1.16 精确标签。双服务分离形态下 hbbs 与 hbbr 可分别升级、分别排障,是官方 docker 部署文档的推荐编排方式。

三、前置条件

  1. 服务器已安装 Docker Engine 与 Compose 插件,验证:
docker version --format 'Engine {{.Server.Version}}'

实测输出:

Engine 29.9.2
docker compose version

实测输出:

Docker Compose version v5.6.1
  1. 端口空闲确认:21115–21119 未被占用:
ss -ltn | grep -E '2111[5-9]' || echo "21115-21119 空闲"

实测输出(部署前):

21115-21119 空闲
  1. ⚠️ 防火墙/安全组必须同时放通 TCP 21115–21119 与 UDP 21116。UDP 21116 承载客户端注册与心跳,只放 TCP 不放 UDP 是自建部署最常见的「客户端显示离线」根因(见十一、常见问题 Q1)。

四、部署步骤

本章按「创建网络 → 编写编排文件 → 启动 → 日志验证 → 端口验证 → 密钥对确认 → 客户端接入」的顺序完成 0→1 部署。预期结果:hbbs/hbbr 双服务健康运行,客户端可凭「ID 服务器 + Key」接入。

4.1 创建独立网络

为整套服务创建独立 bridge 网络并显式指定网段,避免与其他业务网段冲突:

docker network create -d bridge --subnet 10.89.70.0/24 rustdesk-1.1.16-net

实测输出:

0b10b679eef70ebbc1d7c6c532a4276eb63ec7f1d8aedb727f308423fcb07063

💡 说明:hbbs 与 hbbr 同网络互通(hbbs 向客户端下发的中继地址、以及 -r 指定的 relay-servers 场景都依赖两服务互通)。若网段与现有网络冲突,换一个空闲 /24 并同步修改编排文件即可。

4.2 编写编排文件

创建部署目录 /opt/rustdesk/,写入 docker-compose.yml:

mkdir -p /opt/rustdesk && cd /opt/rustdesk

docker-compose.yml 完整内容:

name: rustdesk-1.1.16-stack

services:
  hbbs:
    container_name: rustdesk-1.1.16-hbbs
    image: rustdesk/rustdesk-server:1.1.16
    command: hbbs
    ports:
      - "21115:21115"
      - "21116:21116"
      - "21116:21116/udp"
      - "21118:21118"
    volumes:
      - ./data/hbbs:/root
    networks:
      - rustdesk-net
    restart: unless-stopped

  hbbr:
    container_name: rustdesk-1.1.16-hbbr
    image: rustdesk/rustdesk-server:1.1.16
    command: hbbr
    ports:
      - "21117:21117"
      - "21119:21119"
    volumes:
      - ./data/hbbr:/root
    networks:
      - rustdesk-net
    restart: unless-stopped

networks:
  rustdesk-net:
    external: true
    name: rustdesk-1.1.16-net

逐项说明:

  • name:显式指定 Compose 项目名 rustdesk-1.1.16-stack,避免多套部署目录同名导致 down 误删其他在跑实例
  • image:精确版本标签 1.1.16,与本文回显一致
  • command: hbbs / command: hbbr:镜像无 Entrypoint,整条命令即启动对应服务进程;hbbs 不带参数时监听全部默认端口、工作目录 /root
  • ports:完整端口矩阵。注意 "21116:21116/udp" 独立成行——Compose 默认协议为 TCP,UDP 映射必须显式声明
  • volumes:./data/hbbs 挂到 hbbs 工作目录 /root(密钥对 + SQLite 数据库落盘点);./data/hbbr 挂到 hbbr 工作目录(运行时黑名单文件 blacklist.txt/blocklist.txt 落盘点,初始为空目录)
  • networks:接入 4.1 创建的外部网络;external: true + 显式 name 指向已建网络
  • restart: unless-stopped:进程异常退出或宿主机重启后自动拉起

4.3 启动服务

docker compose up -d

实测输出:

 Container rustdesk-1.1.16-hbbs Creating 
 Container rustdesk-1.1.16-hbbr Creating 
 Container rustdesk-1.1.16-hbbr Created 
 Container rustdesk-1.1.16-hbbs Created 
 Container rustdesk-1.1.16-hbbs Starting 
 Container rustdesk-1.1.16-hbbr Starting 
 Container rustdesk-1.1.16-hbbs Started 
 Container rustdesk-1.1.16-hbbr Started 

确认运行状态:

docker compose ps

实测输出:

NAME                   IMAGE                             COMMAND   SERVICE   CREATED                  STATUS                  PORTS
rustdesk-1.1.16-hbbr   rustdesk/rustdesk-server:1.1.16   "hbbr"    hbbr      Less than a second ago   Up Less than a second   0.0.0.0:21117->21117/tcp, [::]:21117->21117/tcp, 0.0.0.0:21119->21119/tcp, [::]:21119->21119/tcp
rustdesk-1.1.16-hbbs   rustdesk/rustdesk-server:1.1.16   "hbbs"    hbbs      Less than a second ago   Up Less than a second   0.0.0.0:21115-21116->21115-21116/tcp, [::]:21115-21116->21115-21116/tcp, 0.0.0.0:21118->21118/tcp, [::]:21118->21118/tcp, 0.0.0.0:21116->21116/udp, [::]:21116->21116/udp

💡 说明:PORTS 列可一次性核对端口矩阵:hbbs 的 21115-21116/TCP + 21118/TCP + 21116/UDP、hbbr 的 21117/TCP + 21119/TCP 全部在映射中,即编排生效。

4.4 启动日志验证

查看 hbbs 启动日志:

docker logs rustdesk-1.1.16-hbbs

实测输出:

[2026-10-25 04:19:09.279881 +00:00] INFO [src/common.rs:121] Private key comes from id_ed25519
[2026-10-25 04:19:09.279909 +00:00] INFO [src/rendezvous_server.rs:1243] Key: tIOS6+HyV3YtZbGh57aTlN5cKrAF2Kg0w2gjWgm2dYY=
[2026-10-25 04:19:09.279912 +00:00] INFO [src/peer.rs:84] DB_URL=./db_v2.sqlite3
[2026-10-25 04:19:09.281108 +00:00] INFO [src/rendezvous_server.rs:107] serial=0
[2026-10-25 04:19:09.281119 +00:00] INFO [src/common.rs:45] rendezvous-servers=[]
[2026-10-25 04:19:09.281124 +00:00] INFO [src/rendezvous_server.rs:109] Listening on tcp/udp :21116
[2026-10-25 04:19:09.281130 +00:00] INFO [src/rendezvous_server.rs:110] Listening on tcp :21115, extra port for NAT test
[2026-10-25 04:19:09.281133 +00:00] INFO [src/rendezvous_server.rs:111] Listening on websocket :21118
[2026-10-25 04:19:09.281216 +00:00] INFO [src/rendezvous_server.rs:146] mask: None
[2026-10-25 04:19:09.281222 +00:00] INFO [src/rendezvous_server.rs:147] local-ip: ""
[2026-10-25 04:19:09.281234 +00:00] INFO [src/common.rs:45] relay-servers=[]
[2026-10-25 04:19:09.281809 +00:00] INFO [src/rendezvous_server.rs:161] ALWAYS_USE_RELAY=N
[2026-10-25 04:19:09.281839 +00:00] INFO [src/rendezvous_server.rs:193] Start

关键行解读:

  • Private key comes from id_ed25519 + Key: tIOS6+HyV3YtZbGh57aTlN5cKrAF2Kg0w2gjWgm2dYY=:服务端身份密钥对已加载(首次启动会自动生成,见第五章),Key: 行即客户端要配置的公钥
  • DB_URL=./db_v2.sqlite3:设备注册信息持久化到工作目录内嵌 SQLite
  • Listening on tcp/udp :21116、tcp :21115、websocket :21118:hbbs 三端口监听确认
  • ALWAYS_USE_RELAY=N:默认不强制中继(优先 P2P 打洞直连)

查看 hbbr 启动日志:

docker logs rustdesk-1.1.16-hbbr

实测输出:

[2026-10-25 04:19:09.438307 +00:00] INFO [src/relay_server.rs:61] #blacklist(blacklist.txt): 0
[2026-10-25 04:19:09.438329 +00:00] INFO [src/relay_server.rs:76] #blocklist(blocklist.txt): 0
[2026-10-25 04:19:09.438331 +00:00] INFO [src/relay_server.rs:82] Listening on tcp :21117
[2026-10-25 04:19:09.438333 +00:00] INFO [src/relay_server.rs:84] Listening on websocket :21119
[2026-10-25 04:19:09.438334 +00:00] INFO [src/relay_server.rs:87] Start
[2026-10-25 04:19:09.438382 +00:00] INFO [src/relay_server.rs:105] DOWNGRADE_THRESHOLD: 0.66
[2026-10-25 04:19:09.438389 +00:00] INFO [src/relay_server.rs:115] DOWNGRADE_START_CHECK: 1800s
[2026-10-25 04:19:09.438390 +00:00] INFO [src/relay_server.rs:125] LIMIT_SPEED: 32Mb/s
[2026-10-25 04:19:09.438392 +00:00] INFO [src/relay_server.rs:136] TOTAL_BANDWIDTH: 1024Mb/s
[2026-10-25 04:19:09.438393 +00:00] INFO [src/relay_server.rs:146] SINGLE_BANDWIDTH: 128Mb/s

关键行解读:

  • Listening on tcp :21117 + websocket :21119:hbbr 双端口监听确认
  • 末尾五行是中继带宽 QoS 出厂默认:单连接上限 128Mb/s、总带宽 1024Mb/s、限速 32Mb/s、降级阈值 0.66、降级起始检查 1800s(参数语义详解见同专栏《RustDesk 1.1.16 配置参数详解》)

4.5 端口矩阵验证

宿主机核对 TCP 监听:

ss -ltn | grep 2111

实测输出:

LISTEN 0      4096         0.0.0.0:21115      0.0.0.0:*          
LISTEN 0      4096         0.0.0.0:21116      0.0.0.0:*          
LISTEN 0      4096         0.0.0.0:21117      0.0.0.0:*          
LISTEN 0      4096         0.0.0.0:21118      0.0.0.0:*          
LISTEN 0      4096         0.0.0.0:21119      0.0.0.0:*          
LISTEN 0      4096            [::]:21115         [::]:*          
LISTEN 0      4096            [::]:21116         [::]:*          
LISTEN 0      4096            [::]:21117         [::]:*          
LISTEN 0      4096            [::]:21118         [::]:*          
LISTEN 0      4096            [::]:21119         [::]:*          

核对 UDP 21116:

ss -lun | grep 21116

实测输出:

UNCONN 0      0            0.0.0.0:21116      0.0.0.0:*          
UNCONN 0      0               [::]:21116         [::]:*          

逐个 TCP 连通性验证:

for p in 21115 21116 21117 21118 21119; do nc -zv -w2 127.0.0.1 $p; done

实测输出:

Connection to 127.0.0.1 21115 port [tcp/*] succeeded!
Connection to 127.0.0.1 21116 port [tcp/*] succeeded!
Connection to 127.0.0.1 21117 port [tcp/*] succeeded!
Connection to 127.0.0.1 21118 port [tcp/*] succeeded!
Connection to 127.0.0.1 21119 port [tcp/*] succeeded!

4.6 密钥对确认

服务端身份密钥对位于 hbbs 数据目录,确认公钥(即客户端 Key):

cat data/hbbs/id_ed25519.pub

实测输出:

tIOS6+HyV3YtZbGh57aTlN5cKrAF2Kg0w2gjWgm2dYY=

查看数据目录全貌:

ls -la data/hbbs/ data/hbbr/

实测输出:

data/hbbr/:
total 8
drwxr-xr-x 2 root root 4096 Oct 25 11:55 .
drwxr-xr-x 4 root root 4096 Oct 25 11:53 ..

data/hbbs/:
total 84
drwxr-xr-x 3 root root 4096 Oct 25 12:19 .
drwxr-xr-x 4 root root 4096 Oct 25 11:53 ..
drwxr-xr-x 3 root root 4096 Oct 25 11:53 .config
-rw-r--r-- 1 root root 24576 Oct 25 11:54 db_v2.sqlite3
-rw-r--r-- 1 root root 32768 Oct 25 12:19 db_v2.sqlite3-shm
-rw-r--r-- 1 root root     0 Oct 25 12:19 db_v2.sqlite3-wal
-rw-r--r-- 1 root root 88 Oct 25 11:54 id_ed25519
-rw-r--r-- 1 root root 44 Oct 25 11:54 id_ed25519.pub

⚠️ 注意:id_ed25519(私钥)+ id_ed25519.pub(公钥)就是这套自建服务端的身份。密钥对丢失或重新生成后,所有已配置旧 Key 的客户端将无法通过校验,必须逐台更新 Key。务必把这两个文件纳入备份(备份恢复实测见同专栏《RustDesk 1.1.16 日常运维手册》)。

4.7 客户端接入配置

服务端就绪后,各平台客户端(1.5.0)在「设置 → 网络 → ID/中继服务器」中填入:

配置项取值说明
ID 服务器服务器 IP 或域名(如 rustdesk.example.com)即 hbbs 地址;只填主机,不带端口(默认 21116)
中继服务器留空留空时客户端自动用 ID 服务器地址推导中继(hbbr 21117);hbbr 分离部署到其他主机时才需显式填写
API 服务器留空仅官方托管 Pro 版使用
Keydata/hbbs/id_ed25519.pub 内容(本文实测为 tIOS6+HyV3YtZbGh57aTlN5cKrAF2Kg0w2gjWgm2dYY=)服务端 Ed25519 公钥,用于校验服务端身份并加密信令

💡 说明:Key 正确生效时,客户端主界面底部状态栏从「未就绪」变为「就绪」;Web 客户端(Web 客户端走 WebSocket)还需 21118/21119 可达。主控端与被控端两端都要配置同一套 ID 服务器 + Key。

五、数据持久化说明

整套服务的状态全部落在两个数据目录:

路径内容丢失影响
data/hbbs/id_ed25519 + .pubEd25519 身份密钥对致命:服务端身份变更,全部客户端 Key 失效,需逐台重配
data/hbbs/db_v2.sqlite3(含 -wal/-shm)设备注册信息(peer 表:guid、id、uuid、pk、user 等)已注册设备的 ID 分配与绑定信息丢失,客户端重启后重新注册
data/hbbs/.config/hbbs 运行时配置目录影响小
data/hbbr/黑名单文件 blacklist.txt/blocklist.txt(仅运行时治理后生成)黑/封名单清零

本次实测已验证「实例重建后身份不变」:4.3 章的启动发生在完整重建(down → 删网络 → 重建网络 → up)之后,日志中 Private key comes from id_ed25519 与 Key: tIOS6+HyV3YtZbGh57aTlN5cKrAF2Kg0w2gjWgm2dYY= 和重建前完全一致——只要 data/hbbs 持久化在,服务端身份与设备注册数据就稳定。

六、环境变量表

编排中可注入的核心环境变量(完整参数语义与优先级规则见同专栏《RustDesk 1.1.16 配置参数详解》):

变量作用服务默认值说明
KEYhbbs / hbbr_(hbbs 自动加载或生成密钥对)/ 空(hbbr 不校验)私钥内容或其 base64;设为 _ 表示从工作目录密钥文件加载,空值表示禁用 key 校验
PORThbbs / hbbr21116 / 21117主监听端口,改了需同步改端口矩阵
RELAY_SERVERShbbs空下发给客户端的中继服务器列表(多中继时用空格分隔)
ALWAYS_USE_RELAYhbbsNY 强制全部会话走中继(放弃 P2P 打洞)
DB_URLhbbs./db_v2.sqlite3设备注册库路径(SQLite)
RUST_LOGhbbs / hbbrinfo日志级别(debug/error 等),排障时改 debug
LIMIT_SPEEDhbbr32Mb/s中继限速阈值
SINGLE_BANDWIDTHhbbr128Mb/s单连接带宽上限
TOTAL_BANDWIDTHhbbr1024Mb/s中继总带宽上限

注入示例(编排 environment: 段):

    environment:
      RUST_LOG: info
      RELAY_SERVERS: "rustdesk.example.com"

七、配置参数说明

两个二进制的启动参数(命令行 flag)概览,本文编排均使用默认值:

参数服务默认说明
-p <端口>hbbs / hbbr21116 / 21117覆盖主监听端口(等价于 PORT 变量)
-k <key>hbbs / hbbr见第六章 KEY 行指定私钥(内容/base64/-/_);hbbs 缺省自动加载或生成,hbbr 缺省不校验
-r <主机:端口>hbbs空指定默认中继服务器(等价于 RELAY_SERVERS)
-M <Mb>hbbs2打洞相关内存参数
-Rhbbs关仅中继模式开关(等价 ALWAYS_USE_RELAY=Y)
--config <文件>hbbs无从 INI 配置文件加载参数(见第八章)

💡 说明:hbbs 配置优先级为 命令行 flag > --config INI 文件 > .env 文件 > 继承环境变量;hbbr 为 flag > .env > 继承环境变量。完整参数表与逐项实测见《RustDesk 1.1.16 配置参数详解》。

八、配置文件挂载

默认编排不需要任何配置文件即可运行;需要文件化配置时按以下方式挂载(挂载到工作目录 /root 下生效):

1. INI 配置文件(仅 hbbs 支持):

    command: hbbs --config /root/hbbs.ini
    volumes:
      - ./data/hbbs:/root
      - ./hbbs.ini:/root/hbbs.ini:ro

hbbs.ini 示例:

relay-servers = rustdesk.example.com
always-use-relay = N

2. .env 文件(hbbs / hbbr 均支持): 把 .env 放到各自数据目录即自动加载:

    volumes:
      - ./env/hbbs.env:/root/.env:ro

3. 密钥文件挂载(密钥对不进数据卷的场景): 把已有密钥对挂到工作目录:

    volumes:
      - ./keys/id_ed25519:/root/id_ed25519:ro
      - ./keys/id_ed25519.pub:/root/id_ed25519.pub:ro

⚠️ 注意:hbbr 不支持 --config INI 文件,其配置只能走 flag / .env / 环境变量。

九、等价 docker run

不使用 Compose 时,以下两条命令与第四章编排逐项等价(先手工创建同一网络):

docker run -d --name rustdesk-1.1.16-hbbs --restart unless-stopped \
  --network rustdesk-1.1.16-net \
  -p 21115:21115 -p 21116:21116 -p 21116:21116/udp -p 21118:21118 \
  -v /opt/rustdesk/data/hbbs:/root \
  rustdesk/rustdesk-server:1.1.16 hbbs
docker run -d --name rustdesk-1.1.16-hbbr --restart unless-stopped \
  --network rustdesk-1.1.16-net \
  -p 21117:21117 -p 21119:21119 \
  -v /opt/rustdesk/data/hbbr:/root \
  rustdesk/rustdesk-server:1.1.16 hbbr

💡 说明:等价命令与编排的 ports/volumes/command/restart 一一对应;Compose 方式的优势在端口矩阵与数据卷的声明式管理,生产推荐编排形态。

十、常用运维命令

日常高频操作(升降级、备份恢复与控制台的完整演练见同专栏《RustDesk 1.1.16 日常运维手册》):

# 查看实时日志
docker logs -f rustdesk-1.1.16-hbbs
docker logs -f rustdesk-1.1.16-hbbr

# 重启单个服务
docker compose restart hbbs
docker compose restart hbbr

# 停止/启动整套栈
docker compose down
docker compose up -d

# 升级到新版(以官方发布新标签为例):改 image 标签后执行
docker compose pull
docker compose up -d

镜像为 scratch 形态、无 shell,无法用 docker exec rustdesk-1.1.16-hbbs sh 进入(实测返回 executable file not found)。运行时治理用 loopback 控制台:hbbs 在 21115、hbbr 在 21117 上接受来自 127.0.0.1 的单命令 TCP 连接,可借助同网络共享方式用 nc 发送控制台命令(如 hbbr 的 tb 查询总带宽、hbbs 的 aur 查询强制中继状态),完整命令集与实测见《RustDesk 1.1.16 日常运维手册》。

十一、常见问题

Q1:客户端填好 ID 服务器后一直「未就绪」/显示离线?

按序排查:① UDP 21116 未放通(最常见)——注册与心跳走 UDP,安全组/防火墙只对 TCP 放行就会出现该现象,ss -lun | grep 21116 在服务端应能看到监听;② 客户端「ID 服务器」只填主机不带端口;③ 服务端 docker logs rustdesk-1.1.16-hbbs 确认 Listening on tcp/udp :21116 在。

Q2:客户端提示 key 相关错误、连不上?

客户端配置的 Key 与服务端 data/hbbs/id_ed25519.pub 内容不一致。典型诱因:数据目录被删后 hbbs 重新生成了密钥对(公钥变化),而客户端还配着旧 Key。核对 4.6 的公钥值与客户端配置逐字符一致(含结尾 =)。

Q3:所有会话都走中继、P2P 打洞不成?

先查 hbbs 日志 ALWAYS_USE_RELAY=N 是否被改成 Y;再考虑 NAT 类型——对称型 NAT(对称 NAT)之间打洞天然失败,中继兜底是正常行为,可用 hbbr QoS 参数控制中继带宽成本(见配置参数详解篇)。

Q4:docker exec 进不去、报 executable file not found?

这是 scratch 极简镜像的正常现象——镜像内没有 shell 与任何工具。治理操作走 4.4 日志与 loopback 控制台(见第十章),不要试图 exec。

Q5:Web 客户端能用自建服务端吗?

能。Web 客户端走 WebSocket,需要 hbbs 的 21118 与 hbbr 的 21119 均可达(本文端口矩阵已含);客户端侧同样填 ID 服务器 + Key。

十二、参考链接