Skip to content
Tenvo AI · 实时 · v0.16.4 · TLS · 每设备证书 · AGPL-3.0 · 免费方案 · 30 台设备 · 可自托管基础设施 · 自带 API 密钥 · MCP,适用于 CLAUDE & CURSOR
返回博客教程

Linux 远程桌面服务器:X11VNC 与 RustDesk 设置

Tenvo Editorial Team7 分钟阅读
Linux 远程桌面服务器:X11VNC 与 RustDesk 设置

你正尝试远程管理或支持 Linux 机器,并厌倦了脆弱的临时解决方案——用 SSH 进行 shell 访问、手动复制大文件,或每次都给某人发送一个 TeamViewer 链接。

你需要远程管理或支持 Linux 机器,并厌倦了脆弱的临时方案——用 SSH 仅获取 shell、手动复制大文件,或每次都让别人打开一个 TeamViewer 链接。若想在 Linux 上部署一个在启动时自动启动、能在重启后存活且可自托管在你控制下的服务器端远程桌面,本文介绍两种实用的服务器端方案:用于经典 X11 会话的 X11VNC,以及用于现代自托管信令/中继的 RustDesk 服务器守护进程。

何时运行专用的 linux 远程桌面服务器(以及原因)

判断是否适合服务器端远程桌面的快速清单:

  • 需要无人值守或无头访问机器(实验室服务器、办公桌面、信息亭)。
  • 希望有一个单一、始终在线的终端,可以在不让他人先启动客户端的情况下直接连接。
  • 偏好自托管(无第三方云),或希望通过本地中继避免直接暴露 RDP/VNC 端口。
  • 想将经典的 X11 VNC 访问与现代的 NAT 穿透/中继结合,提升客户端使用便利性。

X11VNC 是一个小巧、成熟的服务器端 VNC 守护进程,会导出 X11 显示器上当前的内容(通常为 :0)。RustDesk 的服务器组件(hbbs + hbbr)提供信令(rendezvous)和可选中继,用于在客户端位于 NAT 后时建立连接。这两者可以共存:X11VNC 提供始终在线的 VNC 端点,RustDesk 则提供无需端口转发即可让远程客户端找到主机的托管方式。

选项 A — X11VNC:稳定、简单的服务器端 X11 访问

当机器运行基于 X11 的桌面,且你希望有一个开机启动的简单 VNC 服务器时,使用 X11VNC。X11VNC 经受时间考验(很多仓库中的常见稳定版本:x11vnc 0.9.16),并能很好地与 systemd 集成。

安装并保护 x11vnc

在 Debian/Ubuntu 上:

sudo apt update
sudo apt install -y x11vnc

创建一个密码文件(使用强口令)。将 'remote' 替换为远程用户的主目录所有者。

sudo -u remote mkdir -p /home/remote/.vnc
sudo -u remote x11vnc -storepasswd /home/remote/.vnc/passwd
sudo chown -R remote:remote /home/remote/.vnc

查找与你的显示管理器对应的 X authority 文件。常见位置:

  • LightDM:/var/run/lightdm/root/:0
  • GDM (GNOME):/run/user/1000/gdm/Xauthority 或检查 /home/<username>/.Xauthority

手动启动 x11vnc 一次以验证配置:

sudo -u remote x11vnc -display :0 -auth /home/remote/.Xauthority -rfbauth /home/remote/.vnc/passwd -forever -shared -noxdamage -o /var/log/x11vnc.log

用于始终在线服务的 systemd 单元

将此文件放在 /etc/systemd/system/x11vnc.service — 编辑 User、Group 和 -auth 路径以匹配你的发行版/显示管理器。

[Unit]
Description=x11vnc server for display :0
After=graphical.target

[Service]
Type=simple
User=remote
Group=remote
ExecStart=/usr/bin/x11vnc -display :0 -auth /home/remote/.Xauthority -rfbauth /home/remote/.vnc/passwd -forever -shared -noxdamage -repeat -o /var/log/x11vnc.log
Restart=on-failure

[Install]
WantedBy=graphical.target

启用并启动:

sudo systemctl daemon-reload
sudo systemctl enable --now x11vnc.service
sudo journalctl -u x11vnc -f

网络与安全注意事项

VNC 默认不加密。强化服务器端 VNC 端点的选项:

  • 绑定到 localhost 并要求通过 SSH 隧道访问:以 -rfbport 5901 运行 x11vnc,并在 systemd 中只监听 127.0.0.1,然后使用 SSH -L 5901:localhost:5901 进行转发。
  • 使用 VPN 访问主机所在的局域网。
  • 用防火墙限制访问(下面有 ufw 示例)。
  • 如果需要直接让远程客户端在没有 SSH 的情况下访问,可将 VNC 放在 stunnel/NGINX TLS 代理后面(会增加 CPU 与复杂性)。
# Basic UFW rule to allow local-network VNC only
sudo ufw allow from 192.168.0.0/16 to any port 5900 proto tcp
# Or bind to localhost and tunnel via SSH for remote access

说明:X11VNC 需要 X11 会话。在 Wayland(某些发行版上的 GNOME)上,可使用兼容 Wayland 的服务器(例如 wayvnc)或使用桌面自带的远程桌面功能(通常为 RDP)。

选项 B — RustDesk 服务器守护进程:自托管的 rendezvous 与 中继

RustDesk 允许你自托管信令(hbbs)和中继服务器(hbbr),使客户端在不暴露原始 VNC/RDP 端口的情况下找到并到达主机。如果你已经为桌面会话运行 X11VNC,可以在其前端使用 RustDesk 以实现 NAT 穿透并提升客户端体验。RustDesk 的服务器组件通常以 docker 镜像形式发布;查阅项目发布页 — 示例服务器标签可能包含 v1.2.0(部署前请在 RustDesk 仓库核实当前标签)。

简单的 Docker Compose 示例

该 compose 会启动 hbbs(rendezvous)和 hbbr(可选中继)。示例中显示的端口为社区文档常用默认端口(若上游更改请相应调整)。

version: '3.7'
services:
  hbbs:
    image: rustdesk/rustdesk-server:latest
    container_name: rustdesk-hbbs
    restart: unless-stopped
    ports:
      - '21112:21112/tcp'   # rendezvous
    environment:
      - HBBS_KEY=your_secret_key_here

  hbbr:
    image: rustdesk/rustdesk-server:latest
    container_name: rustdesk-hbbr
    restart: unless-stopped
    ports:
      - '21113:21113/udp'   # relay

注意:

  • 将 HBBS_KEY(或按当前 RustDesk 文档要求的其他环境变量)替换为安全的值。
  • RustDesk 的官方镜像名和环境变量在不同发行版间可能会变动——在生产环境中部署前请查阅 RustDesk 服务器仓库的说明。

连接客户端

在客户端(RustDesk 桌面/移动端)上,将客户端指向你的 hbbs 服务器地址(域名或公网 IP):例如 1.2.3.4:21112。如果 hbbr 中继可用且需要,客户端在直连(P2P)失败时会使用中继来转发流量。你可以配置客户端远程控制运行在主机上的 RustDesk agent,或把 RustDesk 作为中介连接到主机上已存在的 VNC 服务(通常在主机上运行 RustDesk agent,再由 agent 转发到 X11VNC 会话)。

不使用 Docker 的 systemd 方案

如果不希望使用 Docker,可按项目文档构建 rustdesk-server 二进制并将 hbbs 与 hbbr 安装为 systemd 服务。打包方式随发布而异;Docker 方法是最快的可复现部署手段。

安全、NAT 穿透,以及何时避免暴露端口

两种避免直接暴露桌面端口的高层策略:

  1. 将 VNC/RDP 绑定到 localhost;要求通过 SSH/VPN 达到主机。这是单管理员环境下最简单、最易审计的选项。
  2. 自托管中继/信令(RustDesk),并使用 TLS + 认证。这样可减少主机上开放端口,但需运行并保护中继服务器。

防火墙片段(UFW):

# Allow only SSH from your office and block the rest
sudo ufw allow from 203.0.113.0/24 to any port 22 proto tcp
sudo ufw deny 5900/tcp

# If running RustDesk server on the relay box (example)
sudo ufw allow 21112/tcp
sudo ufw allow 21113/udp

实用的安全检查清单:

  • 为 VNC 或 RustDesk agent 帐户使用强认证。
  • 轮换或保护服务器密钥(RustDesk HBBS key),并保持镜像为最新。
  • 使用 IDS/监控以在端口扫描和登陆失败时告警。
  • 如需加密的桌面会话,可在中继前使用反向代理(Nginx/Caddy)终止 TLS,并强制使用 TLS 1.2+ 及强加密套件。

运维提示、故障排查与维护

常见问题与解决方法:

  • VNC 上没有可见桌面:确认 X 显示为 :0(ps aux | grep X),并且 x11vnc 使用了正确的 -auth 文件。
  • 服务在启动时不运行:将 systemd 的 WantedBy 设置为 graphical.target,并确认显示管理器在 x11vnc 之前启动。
  • RustDesk 客户端无法访问服务器:确认 DNS 与防火墙;使用 telnet/IP 工具测试,并检查容器日志(docker-compose logs -f)。
  • 性能差:为 x11vnc 启用 -noxdamage(在某些工作负载中可减少撕裂并降低 CPU),并在客户端可用时考虑调整压缩/编码设置。

维护清单:

  • 每周应用操作系统安全更新。在 Debian/Ubuntu 上可通过 unattended-upgrades 自动化小范围补丁。
  • 跟踪 RustDesk 或 x11vnc 的上游仓库以获取安全修复。如果使用 docker 镜像,应安排镜像刷新与重部署流程。
  • 备份配置文件和任何 TLS 证书;尽可能将 HBBS 密钥存储在机密管理器中。

何时商业工具或 RDP 更合适

诚实的权衡:

  • TeamViewer / AnyDesk:在对非技术用户的极致易用性、普遍的 NAT 穿透能力和精良的移动端体验方面更占优。如果需要对数百个非技术终端提供即时、零运维支持,商业 SaaS 服务可能物有所值。参见我们在 rustdesk-vs-anydesk 的对比说明。
  • RDP (Microsoft Remote Desktop):在 Windows 服务器和桌面上,原生 RDP 通常在性能和功能(剪贴板、文件传输、声音)上更好。但若不通过 VPN 或堡垒机保护,RDP 会暴露更高风险的攻击面。

如果你的主要目标是自托管和隐私,且能接受更多的初始设置与持续维护,X11VNC + RustDesk 服务器的组合是一个稳健且实用的方案。

延伸阅读与内部资源

如果想完全避免端口转发,请阅读我们的操作指南: Remote desktop without port forwarding。如需更高层次的部署方案,请参见 Self-hosted remote desktop guide。关于安全加固最佳实践,查看 Remote desktop security

最后,Tenvo 专注于开源、自托管的远程桌面工具集——如果你需要一个为自托管和跨平台使用设计的替代客户端/服务器,请查看我们的下载或定价页面以开始: /download/pricing。我们在其他文章中也描述了类似的部署模式并保持示例更新。

如果你需要针对特定发行版、显示管理器,或要为特定环境调优 systemd 启动配置,请告诉我发行版和显示管理器(例如 Ubuntu 22.04 with GDM),我会为你提供定制的单元文件和 auth 路径命令。准备好后,可下载 Tenvo 或尝试构建上文描述的栈——起点: /download

获取 Tenvo

准备自己试用吗?

免费支持 30 台设备,无需信用卡。两分钟内即可运行并连接。