使用 VNC 远程控制 Linux Desktop 服务器:TigerVNC 安装、配置与安全访问
前言
日常管理 Linux 服务器时,大多数操作通过 SSH 就足够了,但有些场景仍然离不开图形桌面,例如:
- 运行只能通过 GUI 操作的软件;
- 使用浏览器、IDE、仿真工具或桌面应用;
- 远程维护一台安装了 GNOME、XFCE 等桌面环境的 Linux 工作站;
- 管理实验室、开发环境或内网 Desktop Server;
- 需要从 Windows、macOS 或另一台 Linux 机器直接控制 Linux 图形桌面。
这时可以使用 VNC(Virtual Network Computing)。
VNC 采用 Client/Server 架构:
1 | |
客户端通过 VNC Viewer 获取服务器桌面的图像变化,同时把键盘和鼠标事件发送回服务器,从而实现远程桌面控制。
本文结合实际 Linux Server 运维场景,使用 TigerVNC + GNOME + systemd 搭建一套可长期运行的 VNC 远程桌面环境,并补充端口、防火墙、SSH Tunnel、多用户、黑屏排查以及版本兼容问题。
本文主配置适用于 Rocky Linux / AlmaLinux / RHEL 8.3~9,以及采用相同 TigerVNC systemd 管理方式的发行版。
一、先理解 VNC 的 Display 和端口
VNC 中经常会看到这样的地址:
1 | |
这里的 :2 不是 TCP 端口,而是 VNC Display Number。
VNC 默认端口计算方式是:
1 | |
因此:
| Display | TCP Port |
|---|---|
:0 |
5900 |
:1 |
5901 |
:2 |
5902 |
:3 |
5903 |
例如:
1 | |
对应:
1 | |
本文统一使用:
1 | |
在较新的 RHEL 9 TigerVNC 配置中,Red Hat 也建议从 :2 / 5902 开始为 VNC 用户分配独立桌面会话。
二、确认 Linux 服务器环境
首先查看系统版本:
1 | |
查看服务器 IP:
1 | |
也可以使用:
1 | |
例如服务器地址:
1 | |
如果服务器存在 Docker、Kubernetes、虚拟网卡等环境,ip addr 可能看到:
1 | |
通常应该选择真实接入网络的物理网卡或虚拟机业务网卡地址,例如:
1 | |
而不是:
1 | |
三、检查服务器是否安装桌面环境
VNC Server 本身并不等于 Linux Desktop。
如果服务器只有 Minimal Install,那么即使 TigerVNC 正常启动,也没有 GNOME、XFCE 等桌面可以显示。
查看当前默认启动目标:
1 | |
如果返回:
1 | |
说明服务器通常以命令行模式启动。
查看 GNOME 是否存在:
1 | |
也可以查看可用的图形 Session:
1 | |
四、安装 GNOME Desktop
如果服务器已经安装 GNOME,可以跳过这一节。
在 Rocky Linux / AlmaLinux / RHEL 中,可以先查看软件组:
1 | |
安装 Server with GUI:
1 | |
设置默认进入图形模式:
1 | |
如果希望立即切换:
1 | |
也可以直接重启:
1 | |
需要注意,服务器安装完整 GNOME 会额外占用较多磁盘、内存和软件包。
如果服务器资源比较紧张,可以考虑使用 XFCE 等轻量级桌面,但不同发行版的 XFCE 安装和 VNC Session 名称会有所不同,本文主要使用 GNOME。
五、安装 TigerVNC Server
安装 TigerVNC:
1 | |
确认软件包:
1 | |
正常情况下可以看到类似:
1 | |
查看 systemd Unit:
1 | |
如果能够正常输出 Service 配置,说明 TigerVNC Server 已安装。
六、不要直接使用 root 跑 VNC
不建议让 root 用户直接暴露 VNC Desktop。
一方面安全风险非常高,另一方面 GNOME、D-Bus、权限和 Session 管理在 root 图形会话下也可能出现异常。
建议创建专门的普通用户,例如:
1 | |
设置 Linux 登录密码:
1 | |
如果已经有日常使用的 Linux 用户,也可以直接使用现有账号。
七、配置 VNC 用户与 Display
新版本 TigerVNC 推荐通过:
1 | |
管理用户和 Display 的映射关系。
编辑文件:
1 | |
加入:
1 | |
表示:
1 | |
如果需要多个用户,可以继续配置:
1 | |
对应:
1 | |
每个用户应该使用独立的 Display Number。
八、配置 VNC Desktop Session
TigerVNC 的全局默认配置文件为:
1 | |
编辑:
1 | |
建议至少配置:
1 | |
其中:
session
1 | |
表示 VNC 启动 GNOME Desktop。
可以通过:
1 | |
确认系统中实际存在的 Session。
alwaysshared
1 | |
允许多个 VNC Viewer 同时连接同一个桌面 Session。
例如两台客户端同时连接:
1 | |
看到的是同一个 vncuser 桌面。
geometry
1 | |
控制远程桌面的默认分辨率。
服务器资源比较有限时,可以改成:
1 | |
或者:
1 | |
高分辨率会增加:
- 显存/内存占用;
- 网络流量;
- VNC 编码开销;
- 弱网环境下的卡顿。
九、设置 VNC 密码
VNC 密码和 Linux 用户密码不是一回事。
切换到 VNC 用户:
1 | |
设置密码:
1 | |
根据提示输入密码。
完成后退出:
1 | |
不要使用:
1 | |
否则很容易把密码写到 root 的配置目录,而不是 vncuser 的用户目录。
十、处理 SELinux Context
Rocky Linux / RHEL 默认启用 SELinux。
如果之前手工修改过 .vnc 目录,或者从其他服务器复制过配置,可以恢复 SELinux Context。
切换到 VNC 用户:
1 | |
执行:
1 | |
较新的 TigerVNC 版本会逐渐把用户配置和状态数据放到:
1 | |
如果这些目录已经存在,也可以检查:
1 | |
然后:
1 | |
十一、启动 VNC Server
这里使用的是 Display:
1 | |
因此启动对应 systemd Service:
1 | |
查看状态:
1 | |
正常情况下应该看到:
1 | |
查看端口:
1 | |
也可以:
1 | |
十二、查看 VNC 日志
如果 VNC 无法启动,第一件事不是反复重装,而是看 systemd 日志。
执行:
1 | |
持续查看:
1 | |
查看本次启动:
1 | |
TigerVNC 新版本还可能把用户 Session 状态和日志写入:
1 | |
可以切换用户后查看:
1 | |
1 | |
十三、方式一:直接通过 VNC 端口连接
如果只在可信内网使用,可以直接开放 VNC 端口。
本文只使用:
1 | |
因此推荐只开放单个端口:
1 | |
重新加载:
1 | |
确认:
1 | |
应该看到:
1 | |
Red Hat 也提供了预定义的:
1 | |
但该 Service 通常会开放一个 VNC 端口范围。
如果实际只使用 5902,按照最小权限原则,直接开放:
1 | |
会更加清晰。
十四、使用 VNC Viewer 连接
客户端可以使用:
- TigerVNC Viewer;
- RealVNC Viewer;
- Remmina;
- 其他兼容 RFB/VNC 协议的客户端。
服务器地址:
1 | |
Display:
1 | |
可以尝试输入:
1 | |
部分客户端习惯使用 TCP Port:
1 | |
连接成功后输入之前通过:
1 | |
设置的密码,即可进入 Linux GNOME Desktop。
十五、更推荐:使用 SSH Tunnel 访问 VNC
如果服务器能够通过 SSH 访问,更建议不要直接把 VNC 端口暴露在公网。
VNC 负责:
1 | |
SSH 负责:
1 | |
客户端执行:
1 | |
含义是:
1 | |
此时 VNC Viewer 不再连接:
1 | |
而是连接:
1 | |
或者:
1 | |
如果完全使用 SSH Tunnel,可以不在 firewalld 中开放 5902/tcp,外部网络只需要能够访问服务器的 SSH 端口。
检查:
1 | |
确认没有:
1 | |
即可。
十六、让 SSH Tunnel 更方便
如果经常连接,可以在客户端:
1 | |
配置:
1 | |
以后只需要:
1 | |
然后 VNC Viewer 连接:
1 | |
这样比每次手写完整的 ssh -L 命令方便很多。
十七、如果服务器在 NAT 或内网后面
有时 Linux Desktop Server 并没有公网 IP,例如:
1 | |
不建议直接在路由器上把:
1 | |
映射到公网。
更推荐:
1 | |
例如:
- WireGuard;
- OpenVPN;
- Tailscale;
- 企业 VPN;
- Zero Trust 网络。
推荐架构:
1 | |
而不是:
1 | |
十八、常用管理命令
启动
1 | |
停止
1 | |
重启
1 | |
查看状态
1 | |
设置开机启动
1 | |
取消开机启动
1 | |
查看日志
1 | |
查看监听端口
1 | |
查看防火墙
1 | |
十九、常见问题:VNC 连接不上
1. 先检查服务
1 | |
如果没有运行:
1 | |
然后:
1 | |
2. 检查 5902 是否监听
1 | |
如果没有结果,说明 VNC Server 本身没有成功启动。
如果有监听,但客户端无法连接,则继续检查:
- firewalld;
- 云服务器 Security Group;
- VMware / NAT 网络;
- 路由器 ACL;
- VPN;
- 客户端到服务器的网络连通性。
3. 测试网络
客户端:
1 | |
测试 TCP:
1 | |
或者:
1 | |
如果使用 SSH Tunnel,只测试:
1 | |
二十、常见问题:连接后黑屏或灰屏
VNC 最经典的问题之一就是:
1 | |
或者:
1 | |
重点检查以下几项。
1. GNOME 是否安装
1 | |
查看 Session:
1 | |
2. session 配置是否正确
检查:
1 | |
确认存在:
1 | |
3. 用户是否已经占用了本地图形 Session
不要让同一个用户同时:
1 | |
如果遇到 Session 冲突,可以为 VNC 单独创建:
1 | |
这是服务器环境中最省事的做法。
4. 查看 journalctl
1 | |
很多所谓的“VNC 黑屏”,本质上并不是 VNC 网络问题,而是:
1 | |
二十一、Wayland 与 NVIDIA 问题
GNOME 新版本越来越多地使用 Wayland,而传统 TigerVNC 的虚拟 X Session 与 Wayland 并不是完全等价的技术路线。
如果服务器使用 NVIDIA Proprietary Driver,并且 VNC Session 无法正常启动,可以检查:
1 | |
必要时使用 Xorg。
例如:
1 | |
修改后重启服务器:
1 | |
这类问题尤其容易出现在:
- NVIDIA GPU 工作站;
- CUDA 开发机;
- AI Server;
- GNOME + Proprietary NVIDIA Driver;
- 从旧版本系统升级到新版本系统。
二十二、TigerVNC 与“控制物理桌面”不是一回事
这里非常容易理解错。
常见 VNC 使用方式实际上分成两类。
TigerVNC Xvnc
创建一个新的虚拟桌面:
1 | |
因此你通过:
1 | |
看到的桌面,通常不是服务器显示器当前正在显示的 :0。
这非常适合:
- Headless Server;
- 多用户开发服务器;
- 一台 Linux Server 同时给多个用户使用;
- 不想影响物理控制台 Session。
x0vncserver / x11vnc
如果目标是:
远程看到服务器显示器上“当前正在显示的那个桌面”。
那么需要的是“共享已有 Display”,而不是新建一个虚拟 Display。
TigerVNC 项目中的 x0vncserver 就属于这种模式,它共享现有的 X Display。
因此,在选方案前先确认你的需求:
1 | |
本文主要讲的是第一种:
1 | |
二十三、多用户 VNC Server
TigerVNC 非常适合一台服务器为多个开发人员提供独立 GUI。
例如:
1 | |
分别启动:
1 | |
端口分别为:
1 | |
每个用户执行自己的:
1 | |
最终:
1 | |
每个人都有自己的 Linux 用户环境、Home Directory 和 Desktop Session。
二十四、VNC 性能优化
VNC 的性能主要受以下因素影响:
1 | |
1. 不要盲目使用 4K
如果只是运维服务器:
1 | |
通常已经够用。
开发使用可以设置:
1 | |
除非确实有需求,否则不建议服务器默认跑:
1 | |
2. 关闭不必要的 GNOME 动画
VNC 传输的是桌面图像变化。
大量动画、透明效果、视频播放都会明显增加:
1 | |
远程开发机应该优先考虑:
1 | |
而不是桌面特效。
3. 内网和公网采用不同策略
局域网:
1 | |
通常已经足够。
跨公网:
1 | |
往往更加可靠和安全。
如果网络延迟很高,并且大量使用视频、3D、GPU GUI,VNC 体验可能并不理想,需要考虑:
- RDP;
- NICE DCV;
- NoMachine;
- Xpra;
- 专业 GPU Remote Workstation 方案。
二十五、安全建议
VNC 能用不代表应该直接暴露到 Internet。
生产或长期运行环境至少建议做到:
不使用 root VNC
使用普通用户:
1 | |
不把 5900~5999 整段开放到公网
只开真正需要的端口。
更推荐完全不开放 VNC:
1 | |
配合 VPN
对于家庭实验室、公司内网或云服务器:
1 | |
通常比公网直接暴露 VNC 更合理。
使用独立用户
把:
1 | |
隔离开。
不要所有远程桌面都使用同一个管理员账号。
限制 SSH 来源
如果通过 SSH Tunnel 使用 VNC,可以进一步通过:
- SSH Key;
- 禁止 root SSH;
- 禁止密码登录;
- 防火墙白名单;
- Fail2ban;
- VPN ACL;
控制 SSH 入口。
整个安全边界就会比直接暴露 VNC 清晰很多。
二十六、RHEL 10 / Rocky Linux 10 特别说明
这里是很多旧教程在新系统上会踩的坑。
在 RHEL 10 中,Red Hat 已经移除了 TigerVNC Server 软件包,包括:
1 | |
RHEL 10 官方图形远程访问路线已经转向:
1 | |
Rocky Linux 10 也继承了这一变化。
因此,如果你使用:
1 | |
再执行:
1 | |
很可能会发现软件包不存在。
这不是 YUM/DNF 坏了,而是发行版已经改变了官方远程桌面技术路线。
可以按需求选择:
需求一:只是远程管理 Rocky/RHEL 10 Desktop
优先考虑:
1 | |
需求二:必须使用 VNC 协议
可以研究:
1 | |
但需要额外处理:
- 软件源;
- SELinux;
- systemd;
- Wayland/Xorg;
- 安全更新维护。
如果没有“必须兼容 VNC”的历史系统约束,就没有必要为了 VNC 强行和新发行版较劲。
二十七、一套推荐的最终部署方案
如果是 Rocky Linux 9 / RHEL 9 Desktop Server,推荐架构:
1 | |
服务器端核心配置:
1 | |
1 | |
以及:
1 | |
1 | |
启动:
1 | |
客户端:
1 | |
VNC Viewer:
1 | |
这套方式兼顾了:
1 | |
总结
VNC 的基本思路并不复杂:
1 | |
真正容易出问题的地方主要是:
1 | |
对于 Rocky Linux / RHEL 8、9,一套比较规范的 TigerVNC 配置应该使用:
1 | |
而不是继续复制早期版本的 vncserver@.service 模板。
如果只是内网临时使用,可以直接通过:
1 | |
连接。
如果是长期使用、跨网络或者服务器具备公网访问能力,更推荐:
1 | |
最后还要特别注意:RHEL 10 / Rocky Linux 10 已经不再提供 TigerVNC Server,官方远程桌面方向已经转为 GNOME Remote Desktop + RDP。
所以部署前第一条命令最好不是:
1 | |
而是:
1 | |
先确认系统版本,再决定技术路线。这样能少踩很多“教程明明没错,但就是装不上”的时代之坑。
参考资料
- CSDN:《VNC配置远程控制服务器》
- Red Hat Enterprise Linux 9 Documentation:Remotely accessing the desktop as multiple users
- Red Hat Enterprise Linux 10 Release Notes:TigerVNC has been removed
- TigerVNC Documentation:Xvnc / x0vncserver