青蛙小白
博客 / 2024/05

自建RustDesk服务器

2024/05/20 · — 字 · 阅读约 — 分钟 ·
目录

RustDesk Server

Docker Compose

推荐Docker Compose安装:

services:
  hbbs:
    container_name: hbbs
    image: rustdesk/rustdesk-server:latest
    command: hbbs
    volumes:
      - ./data:/root
    network_mode: "host"

    depends_on:
      - hbbr
    restart: unless-stopped

  hbbr:
    container_name: hbbr
    image: rustdesk/rustdesk-server:latest
    command: hbbr
    volumes:
      - ./data:/root
    network_mode: "host"
    restart: unless-stopped

开放防火墙端口

确保在防火墙中打开这些端口:

  • hbbs:
    • 21114 (TCP): 用于网页控制台,仅在 Pro 版本中可用。
    • 21115 (TCP): 用于 NAT 类型测试。
    • 21116 (TCP/UDP): 请注意 21116 应该同时为 TCP 和 UDP 启用。 21116/UDP 用于 ID 注册和心跳服务。21116/TCP 用于 TCP 打洞和连接服务。
    • 21118 (TCP): 用于支持网页客户端。
  • hbbr:
    • 21117 (TCP): 用于中继服务。
    • 21119 (TCP): 用于支持网页客户端。

如果不需要网页客户端支持,可以禁用相应的端口: 21118、21119

firewall-cmd开放端口的示例命令:

firewall-cmd --permanent --add-port=21114-21119/tcp
firewall-cmd --permanent --add-port=21116/udp
firewall-cmd --reload

# firewall-cmd --permanent --remove-port=21114-21119/tcp
# firewall-cmd --permanent --remove-port=21116/udp
# firewall-cmd --reload

如果安装了UFW,也可使用以下命令配置防火墙:

ufw allow 21114:21119/tcp
ufw allow 21116/udp
sudo ufw enable

注意

  1. 21116端口同时为 TCP 和 UDP,这个要在防火墙上开放,不要漏掉UDP
  2. 如果RustDesk Server是部署在 OpenStack 等云平台上的虚拟机,请务必在平台的安全组中配置相应的防火墙策略,以开放上述所需端口。

理解各端口的作用

21114 (TCP): 用于网页控制台,仅在 Pro 版本中可用

Pro版本功能,略过

21115 (TCP): 用于 NAT 类型测试

RustDesk 客户端要想做到P2P直连,必须知道自己是否能被外网访问。如果两边都是对称 NAT,直连基本没戏,只能走中继 (hbbr)。所以连接前要测试 NAT 类型。

RustDesk 客户端在启动时,会尝试通过 hbbs 的 21115/TCP 端口:

  1. 探测公网可见 IP 和端口 客户端向 hbbs 发送请求,hbbs 看到的来源 IP/端口可能和客户端自己认为的不一样。这样能识别 NAT 是否改写了端口。

  2. 区分 NAT 类型

    • 开放 / Full Cone NAT → 直连成功率很高。
    • 受限锥形 (Restricted Cone NAT) → 大部分情况下能打洞成功。
    • 端口受限 (Port-Restricted Cone NAT) → 打洞更难。
    • 对称 NAT (Symmetric NAT) → 几乎无法 P2P,只能走中继 (21117)。
  3. 决定连接策略

    • 如果 NAT 类型“友好”,RustDesk 就会优先尝试 P2P。
    • 如果 NAT 类型“不友好”,RustDesk 会直接转向中继 (21117)。

21115 端口的作用就是让 hbbs 充当一个“探测点”,帮客户端确认自己处于哪种 NAT 类型,从而决定能否直连还是必须用中继。

21116/UDP 用于 ID 注册和心跳服务

ID 注册:

  • 当客户端启动时,它会随机生成一个ID
  • 客户端通过21116/UDP把自己的信息(ID、公网 IP、端口、NAT 类型等)注册到hbbs(ID server)。
  • hbbs 维护一个ID → 节点地址表,用来让其他客户端能够找到当前的客户端。

心跳服务:

  • 客户端会定期通过UDP包向 hbbs 发“心跳”。
  • hbbs依靠心跳来:
    • 确认客户端是否在线。
    • 刷新客户端的公网地址和端口(因为NAT映射可能过期)。
    • 保持NAT映射存活(UDP打洞需要映射一直有效)。

21116/TCP 用于 TCP 打洞和连接服务

  • 当双方 NAT 情况允许时,执行TCP 打洞
  • 如果 UDP 不可达,尝试建立 TCP 通道
  • 在必要时,作为连接控制和数据传输的备用通道

21117/TCP:中继服务(Relay)

  • 当客户端之间"无法直接 P2P 连接"(例如双方都在对称 NAT 或防火墙阻挡 UDP/TCP 打洞)时,RustDesk 会使用 中继服务器 (hbbr)转发流量。
  • 21117/TCP就是中继服务监听的端口,负责:
    • 接收客户端发来的数据。
    • 将数据转发给目标客户端。

可以理解为:当直连失败时,所有流量都会通过21117/TCP“绕道”

21118/TCP & 21119/TCP:支持网页客户端

  • hbbs - 21118/TCP
  • hbbr - 21119/TCP

RustDesk 除了桌面客户端外,还有网页端:

  • 提供 HTTP/HTTPS 或 WebSocket 通道,让网页客户端能连接到 RustDesk 服务。
  • 转发控制命令和远程桌面数据,类似桌面客户端的功能。

如果所使用的客户端的网络环境决定了不可能实现直连的话,即都需要中继服务(Relay)的话,这种情况下最少需要向外部暴露以下端口:

  • 21116/UDP
  • 21116/TCP
  • 21117/TCP

客户端

Mac客户端

  • 日志目录~/Library/Logs/RustDesk
  • 配置目录~/Library/Preferences/com.carriez.RustDesk

Windows客户端

  • 日志目录C:\Users\Administrator\AppData\Roaming\RustDesk\log
  • 配置目录C:\Users\Administrator\AppData\Roaming\RustDesk\config

强制使用中继服务

  • 方法1: 连接时输入 ID/r
  • 方法2: 连接历史列表里的Peer的选项菜单里有一个Always connect via relay的复选框

其他问题

RustDesk客户端远程连接Windows服务器分辨率过低问题

Windows服务器在没有物理显示器插着的情况下,显卡驱动不会加载正常的EDID信息,所以只会给出几个很低的分辨率(800×600 / 1024×768)。RustDesk也就只能看到这些分辨率。

解决方法:

  1. 下载“虚拟显示器驱动” (Virtual Display Driver)

    • Virtual-Display-Driver
    • 它会给 Windows 增加一个“假显示器”,这样系统就能解锁 1080p、2K、4K 等分辨率。
  2. 安装方法

    • 打开设备管理器 → 添加过时硬件 → 从磁盘安装 → 指定解压后的 .inf 文件。
    • 安装完成后,会在“显示适配器”或“监视器”下看到一个Virtual Display Driver。
  3. 切换分辨率

    • 右键桌面 → 显示设置 → 选择新加的虚拟显示器 → 设置所需分辨率。
    • RustDesk 就能以这个分辨率连接。
TAGS # linux
评论