使用 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
┌─────────────────────┐
│ Windows / macOS │
│ Linux Client │
│ │
│ VNC Viewer │
└──────────┬──────────┘

│ RFB / TCP
│ 5900 + Display

┌─────────────────────┐
│ Linux Server │
│ │
│ TigerVNC Server │
│ │ │
│ ▼ │
│ GNOME / XFCE │
└─────────────────────┘

客户端通过 VNC Viewer 获取服务器桌面的图像变化,同时把键盘和鼠标事件发送回服务器,从而实现远程桌面控制。

本文结合实际 Linux Server 运维场景,使用 TigerVNC + GNOME + systemd 搭建一套可长期运行的 VNC 远程桌面环境,并补充端口、防火墙、SSH Tunnel、多用户、黑屏排查以及版本兼容问题。

本文主配置适用于 Rocky Linux / AlmaLinux / RHEL 8.3~9,以及采用相同 TigerVNC systemd 管理方式的发行版。


一、先理解 VNC 的 Display 和端口

VNC 中经常会看到这样的地址:

1
192.168.1.100:2

这里的 :2 不是 TCP 端口,而是 VNC Display Number

VNC 默认端口计算方式是:

1
TCP Port = 5900 + Display Number

因此:

Display TCP Port
:0 5900
:1 5901
:2 5902
:3 5903

例如:

1
192.168.1.100:2

对应:

1
192.168.1.100:5902

本文统一使用:

1
2
3
Display :2
TCP Port 5902
User vncuser

在较新的 RHEL 9 TigerVNC 配置中,Red Hat 也建议从 :2 / 5902 开始为 VNC 用户分配独立桌面会话。


二、确认 Linux 服务器环境

首先查看系统版本:

1
cat /etc/os-release

查看服务器 IP:

1
ip addr

也可以使用:

1
hostname -I

例如服务器地址:

1
192.168.10.20

如果服务器存在 Docker、Kubernetes、虚拟网卡等环境,ip addr 可能看到:

1
2
3
4
5
6
lo
docker0
cni0
virbr0
ens192
eno1

通常应该选择真实接入网络的物理网卡或虚拟机业务网卡地址,例如:

1
ens192

而不是:

1
2
3
127.0.0.1
docker0
cni0

三、检查服务器是否安装桌面环境

VNC Server 本身并不等于 Linux Desktop。

如果服务器只有 Minimal Install,那么即使 TigerVNC 正常启动,也没有 GNOME、XFCE 等桌面可以显示。

查看当前默认启动目标:

1
systemctl get-default

如果返回:

1
multi-user.target

说明服务器通常以命令行模式启动。

查看 GNOME 是否存在:

1
rpm -qa | grep -E "gnome-shell|gnome-session"

也可以查看可用的图形 Session:

1
ls /usr/share/xsessions/

四、安装 GNOME Desktop

如果服务器已经安装 GNOME,可以跳过这一节。

在 Rocky Linux / AlmaLinux / RHEL 中,可以先查看软件组:

1
sudo dnf group list

安装 Server with GUI:

1
sudo dnf group install -y "Server with GUI"

设置默认进入图形模式:

1
sudo systemctl set-default graphical.target

如果希望立即切换:

1
sudo systemctl isolate graphical.target

也可以直接重启:

1
sudo reboot

需要注意,服务器安装完整 GNOME 会额外占用较多磁盘、内存和软件包。

如果服务器资源比较紧张,可以考虑使用 XFCE 等轻量级桌面,但不同发行版的 XFCE 安装和 VNC Session 名称会有所不同,本文主要使用 GNOME。


五、安装 TigerVNC Server

安装 TigerVNC:

1
sudo dnf install -y tigervnc-server

确认软件包:

1
rpm -qa | grep tigervnc

正常情况下可以看到类似:

1
2
tigervnc-server-...
tigervnc-selinux-...

查看 systemd Unit:

1
systemctl cat vncserver@.service

如果能够正常输出 Service 配置,说明 TigerVNC Server 已安装。


六、不要直接使用 root 跑 VNC

不建议让 root 用户直接暴露 VNC Desktop。

一方面安全风险非常高,另一方面 GNOME、D-Bus、权限和 Session 管理在 root 图形会话下也可能出现异常。

建议创建专门的普通用户,例如:

1
sudo useradd -m vncuser

设置 Linux 登录密码:

1
sudo passwd vncuser

如果已经有日常使用的 Linux 用户,也可以直接使用现有账号。


七、配置 VNC 用户与 Display

新版本 TigerVNC 推荐通过:

1
/etc/tigervnc/vncserver.users

管理用户和 Display 的映射关系。

编辑文件:

1
sudo vim /etc/tigervnc/vncserver.users

加入:

1
:2=vncuser

表示:

1
2
3
4
5
vncuser

└── Display :2

└── TCP 5902

如果需要多个用户,可以继续配置:

1
2
3
:2=vncuser
:3=developer
:4=tester

对应:

1
2
3
vncuser    -> :2 -> 5902
developer -> :3 -> 5903
tester -> :4 -> 5904

每个用户应该使用独立的 Display Number。


八、配置 VNC Desktop Session

TigerVNC 的全局默认配置文件为:

1
/etc/tigervnc/vncserver-config-defaults

编辑:

1
sudo vim /etc/tigervnc/vncserver-config-defaults

建议至少配置:

1
2
3
session=gnome
alwaysshared
geometry=1920x1080

其中:

session

1
session=gnome

表示 VNC 启动 GNOME Desktop。

可以通过:

1
ls /usr/share/xsessions/

确认系统中实际存在的 Session。


alwaysshared

1
alwaysshared

允许多个 VNC Viewer 同时连接同一个桌面 Session。

例如两台客户端同时连接:

1
192.168.10.20:2

看到的是同一个 vncuser 桌面。


geometry

1
geometry=1920x1080

控制远程桌面的默认分辨率。

服务器资源比较有限时,可以改成:

1
geometry=1600x900

或者:

1
geometry=1280x720

高分辨率会增加:

  • 显存/内存占用;
  • 网络流量;
  • VNC 编码开销;
  • 弱网环境下的卡顿。

九、设置 VNC 密码

VNC 密码和 Linux 用户密码不是一回事。

切换到 VNC 用户:

1
sudo -iu vncuser

设置密码:

1
vncpasswd

根据提示输入密码。

完成后退出:

1
exit

不要使用:

1
sudo vncpasswd

否则很容易把密码写到 root 的配置目录,而不是 vncuser 的用户目录。


十、处理 SELinux Context

Rocky Linux / RHEL 默认启用 SELinux。

如果之前手工修改过 .vnc 目录,或者从其他服务器复制过配置,可以恢复 SELinux Context。

切换到 VNC 用户:

1
sudo -iu vncuser

执行:

1
restorecon -RFv ~/.vnc

较新的 TigerVNC 版本会逐渐把用户配置和状态数据放到:

1
2
~/.config/tigervnc
~/.local/state/tigervnc

如果这些目录已经存在,也可以检查:

1
restorecon -RFv ~/.config/tigervnc ~/.local/state/tigervnc

然后:

1
exit

十一、启动 VNC Server

这里使用的是 Display:

1
:2

因此启动对应 systemd Service:

1
sudo systemctl enable --now vncserver@:2.service

查看状态:

1
sudo systemctl status vncserver@:2.service

正常情况下应该看到:

1
Active: active (running)

查看端口:

1
sudo ss -lntp | grep 5902

也可以:

1
sudo lsof -iTCP:5902 -sTCP:LISTEN

十二、查看 VNC 日志

如果 VNC 无法启动,第一件事不是反复重装,而是看 systemd 日志。

执行:

1
sudo journalctl -u vncserver@:2.service -e

持续查看:

1
sudo journalctl -u vncserver@:2.service -f

查看本次启动:

1
sudo journalctl -u vncserver@:2.service -b

TigerVNC 新版本还可能把用户 Session 状态和日志写入:

1
~/.local/state/tigervnc/

可以切换用户后查看:

1
sudo -iu vncuser
1
find ~/.local/state/tigervnc -maxdepth 2 -type f -print

十三、方式一:直接通过 VNC 端口连接

如果只在可信内网使用,可以直接开放 VNC 端口。

本文只使用:

1
5902/tcp

因此推荐只开放单个端口:

1
sudo firewall-cmd --permanent --add-port=5902/tcp

重新加载:

1
sudo firewall-cmd --reload

确认:

1
sudo firewall-cmd --list-ports

应该看到:

1
5902/tcp

Red Hat 也提供了预定义的:

1
2
sudo firewall-cmd --permanent --add-service=vnc-server
sudo firewall-cmd --reload

但该 Service 通常会开放一个 VNC 端口范围。

如果实际只使用 5902,按照最小权限原则,直接开放:

1
5902/tcp

会更加清晰。


十四、使用 VNC Viewer 连接

客户端可以使用:

  • TigerVNC Viewer;
  • RealVNC Viewer;
  • Remmina;
  • 其他兼容 RFB/VNC 协议的客户端。

服务器地址:

1
192.168.10.20

Display:

1
:2

可以尝试输入:

1
192.168.10.20:2

部分客户端习惯使用 TCP Port:

1
192.168.10.20:5902

连接成功后输入之前通过:

1
vncpasswd

设置的密码,即可进入 Linux GNOME Desktop。


十五、更推荐:使用 SSH Tunnel 访问 VNC

如果服务器能够通过 SSH 访问,更建议不要直接把 VNC 端口暴露在公网。

VNC 负责:

1
图形桌面

SSH 负责:

1
2
3
加密传输
身份认证
安全隧道

客户端执行:

1
ssh -N -L 5902:127.0.0.1:5902 vncuser@192.168.10.20

含义是:

1
2
3
4
5
6
7
8
Client localhost:5902

│ SSH Tunnel

Server 127.0.0.1:5902


TigerVNC :2

此时 VNC Viewer 不再连接:

1
192.168.10.20:5902

而是连接:

1
127.0.0.1:5902

或者:

1
localhost:5902

如果完全使用 SSH Tunnel,可以不在 firewalld 中开放 5902/tcp,外部网络只需要能够访问服务器的 SSH 端口。

检查:

1
sudo firewall-cmd --list-all

确认没有:

1
5902/tcp

即可。


十六、让 SSH Tunnel 更方便

如果经常连接,可以在客户端:

1
~/.ssh/config

配置:

1
2
3
4
5
6
Host linux-desktop
HostName 192.168.10.20
User vncuser
LocalForward 5902 127.0.0.1:5902
ServerAliveInterval 30
ServerAliveCountMax 3

以后只需要:

1
ssh -N linux-desktop

然后 VNC Viewer 连接:

1
127.0.0.1:5902

这样比每次手写完整的 ssh -L 命令方便很多。


十七、如果服务器在 NAT 或内网后面

有时 Linux Desktop Server 并没有公网 IP,例如:

1
2
3
4
5
6
7
8
Client

Internet

Router / NAT

192.168.10.20
Linux Server

不建议直接在路由器上把:

1
5902

映射到公网。

更推荐:

1
2
3
4
5
VPN
+
SSH
+
VNC

例如:

  • WireGuard;
  • OpenVPN;
  • Tailscale;
  • 企业 VPN;
  • Zero Trust 网络。

推荐架构:

1
2
3
4
5
6
7
8
9
10
11
12
Laptop

│ VPN

Private Network

│ SSH Tunnel

Linux Server


TigerVNC

而不是:

1
2
3
4
5
6
7
Internet


Public 5902


VNC Server

十八、常用管理命令

启动

1
sudo systemctl start vncserver@:2.service

停止

1
sudo systemctl stop vncserver@:2.service

重启

1
sudo systemctl restart vncserver@:2.service

查看状态

1
sudo systemctl status vncserver@:2.service

设置开机启动

1
sudo systemctl enable vncserver@:2.service

取消开机启动

1
sudo systemctl disable vncserver@:2.service

查看日志

1
sudo journalctl -u vncserver@:2.service -e

查看监听端口

1
sudo ss -lntp | grep 5902

查看防火墙

1
sudo firewall-cmd --list-all

十九、常见问题:VNC 连接不上

1. 先检查服务

1
sudo systemctl status vncserver@:2.service

如果没有运行:

1
sudo systemctl restart vncserver@:2.service

然后:

1
sudo journalctl -u vncserver@:2.service -e

2. 检查 5902 是否监听

1
sudo ss -lntp | grep 5902

如果没有结果,说明 VNC Server 本身没有成功启动。

如果有监听,但客户端无法连接,则继续检查:

  • firewalld;
  • 云服务器 Security Group;
  • VMware / NAT 网络;
  • 路由器 ACL;
  • VPN;
  • 客户端到服务器的网络连通性。

3. 测试网络

客户端:

1
ping 192.168.10.20

测试 TCP:

1
nc -vz 192.168.10.20 5902

或者:

1
telnet 192.168.10.20 5902

如果使用 SSH Tunnel,只测试:

1
nc -vz 127.0.0.1 5902

二十、常见问题:连接后黑屏或灰屏

VNC 最经典的问题之一就是:

1
2
能连接
但是只有黑屏

或者:

1
2
3
灰色背景
鼠标能动
桌面不出来

重点检查以下几项。

1. GNOME 是否安装

1
rpm -qa | grep gnome-session

查看 Session:

1
ls /usr/share/xsessions/

2. session 配置是否正确

检查:

1
cat /etc/tigervnc/vncserver-config-defaults

确认存在:

1
session=gnome

3. 用户是否已经占用了本地图形 Session

不要让同一个用户同时:

1
2
3
本地 GNOME 登录
+
独立 TigerVNC Session

如果遇到 Session 冲突,可以为 VNC 单独创建:

1
vncuser

这是服务器环境中最省事的做法。


4. 查看 journalctl

1
sudo journalctl -u vncserver@:2.service -e

很多所谓的“VNC 黑屏”,本质上并不是 VNC 网络问题,而是:

1
2
3
4
5
GNOME Session 启动失败
D-Bus Session 异常
桌面组件退出
权限异常
SELinux Context 异常

二十一、Wayland 与 NVIDIA 问题

GNOME 新版本越来越多地使用 Wayland,而传统 TigerVNC 的虚拟 X Session 与 Wayland 并不是完全等价的技术路线。

如果服务器使用 NVIDIA Proprietary Driver,并且 VNC Session 无法正常启动,可以检查:

1
/etc/gdm/custom.conf

必要时使用 Xorg。

例如:

1
2
3
[daemon]
WaylandEnable=False
DefaultSession=gnome-xorg.desktop

修改后重启服务器:

1
sudo reboot

这类问题尤其容易出现在:

  • NVIDIA GPU 工作站;
  • CUDA 开发机;
  • AI Server;
  • GNOME + Proprietary NVIDIA Driver;
  • 从旧版本系统升级到新版本系统。

二十二、TigerVNC 与“控制物理桌面”不是一回事

这里非常容易理解错。

常见 VNC 使用方式实际上分成两类。

TigerVNC Xvnc

创建一个新的虚拟桌面:

1
2
3
4
Physical Monitor -> Desktop :0

TigerVNC
└── Virtual Desktop :2

因此你通过:

1
:2

看到的桌面,通常不是服务器显示器当前正在显示的 :0

这非常适合:

  • Headless Server;
  • 多用户开发服务器;
  • 一台 Linux Server 同时给多个用户使用;
  • 不想影响物理控制台 Session。

x0vncserver / x11vnc

如果目标是:

远程看到服务器显示器上“当前正在显示的那个桌面”。

那么需要的是“共享已有 Display”,而不是新建一个虚拟 Display。

TigerVNC 项目中的 x0vncserver 就属于这种模式,它共享现有的 X Display。

因此,在选方案前先确认你的需求:

1
2
3
4
5
6
7
需要独立远程桌面

└── TigerVNC / Xvnc

需要控制物理显示器当前桌面

└── x0vncserver / x11vnc

本文主要讲的是第一种:

1
TigerVNC Virtual Desktop

二十三、多用户 VNC Server

TigerVNC 非常适合一台服务器为多个开发人员提供独立 GUI。

例如:

1
2
3
:2=mario
:3=alice
:4=bob

分别启动:

1
2
3
sudo systemctl enable --now vncserver@:2.service
sudo systemctl enable --now vncserver@:3.service
sudo systemctl enable --now vncserver@:4.service

端口分别为:

1
2
3
mario -> 5902
alice -> 5903
bob -> 5904

每个用户执行自己的:

1
vncpasswd

最终:

1
2
3
4
5
6
7
8
9
               Linux Server

┌────────────────┼────────────────┐
│ │ │
:2 / 5902 :3 / 5903 :4 / 5904
│ │ │
mario alice bob
│ │ │
GNOME GNOME GNOME

每个人都有自己的 Linux 用户环境、Home Directory 和 Desktop Session。


二十四、VNC 性能优化

VNC 的性能主要受以下因素影响:

1
2
3
4
5
6
7
8
分辨率
网络延迟
带宽
桌面动画
图像变化频率
编码方式
客户端压缩参数
服务器 CPU

1. 不要盲目使用 4K

如果只是运维服务器:

1
geometry=1600x900

通常已经够用。

开发使用可以设置:

1
geometry=1920x1080

除非确实有需求,否则不建议服务器默认跑:

1
3840x2160

2. 关闭不必要的 GNOME 动画

VNC 传输的是桌面图像变化。

大量动画、透明效果、视频播放都会明显增加:

1
2
3
4
编码量
网络流量
延迟
CPU 使用率

远程开发机应该优先考虑:

1
2
3
稳定
低延迟
低资源占用

而不是桌面特效。


3. 内网和公网采用不同策略

局域网:

1
VNC Direct

通常已经足够。

跨公网:

1
VPN + SSH Tunnel + VNC

往往更加可靠和安全。

如果网络延迟很高,并且大量使用视频、3D、GPU GUI,VNC 体验可能并不理想,需要考虑:

  • RDP;
  • NICE DCV;
  • NoMachine;
  • Xpra;
  • 专业 GPU Remote Workstation 方案。

二十五、安全建议

VNC 能用不代表应该直接暴露到 Internet。

生产或长期运行环境至少建议做到:

不使用 root VNC

使用普通用户:

1
vncuser

不把 5900~5999 整段开放到公网

只开真正需要的端口。

更推荐完全不开放 VNC:

1
2
3
4
5
6
7
8
9
10
Internet


SSH


localhost:5902


VNC

配合 VPN

对于家庭实验室、公司内网或云服务器:

1
WireGuard / OpenVPN / Tailscale

通常比公网直接暴露 VNC 更合理。


使用独立用户

把:

1
2
3
4
Linux 用户
VNC 用户
服务权限
Home Directory

隔离开。

不要所有远程桌面都使用同一个管理员账号。


限制 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
2
3
4
tigervnc
tigervnc-server
tigervnc-server-minimal
tigervnc-selinux

RHEL 10 官方图形远程访问路线已经转向:

1
2
3
GNOME Remote Desktop
+
RDP

Rocky Linux 10 也继承了这一变化。

因此,如果你使用:

1
2
Rocky Linux 10
RHEL 10

再执行:

1
dnf install tigervnc-server

很可能会发现软件包不存在。

这不是 YUM/DNF 坏了,而是发行版已经改变了官方远程桌面技术路线。

可以按需求选择:

需求一:只是远程管理 Rocky/RHEL 10 Desktop

优先考虑:

1
GNOME Remote Desktop + RDP

需求二:必须使用 VNC 协议

可以研究:

1
2
3
4
x11vnc
x0vncserver
第三方 TigerVNC 软件源
自行编译 TigerVNC

但需要额外处理:

  • 软件源;
  • SELinux;
  • systemd;
  • Wayland/Xorg;
  • 安全更新维护。

如果没有“必须兼容 VNC”的历史系统约束,就没有必要为了 VNC 强行和新发行版较劲。


二十七、一套推荐的最终部署方案

如果是 Rocky Linux 9 / RHEL 9 Desktop Server,推荐架构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
┌─────────────────────────┐
│ Client │
│ │
│ TigerVNC / RealVNC │
│ 127.0.0.1:5902 │
└────────────┬────────────┘

│ SSH Tunnel

┌─────────────────────────┐
│ Linux Server │
│ │
│ sshd :22 │
│ │ │
│ ▼ │
│ 127.0.0.1:5902 │
│ │ │
│ ▼ │
│ TigerVNC :2 │
│ │ │
│ ▼ │
│ GNOME │
│ │ │
│ ▼ │
│ vncuser │
└─────────────────────────┘

服务器端核心配置:

1
/etc/tigervnc/vncserver.users
1
:2=vncuser

以及:

1
/etc/tigervnc/vncserver-config-defaults
1
2
3
session=gnome
alwaysshared
geometry=1920x1080

启动:

1
sudo systemctl enable --now vncserver@:2.service

客户端:

1
ssh -N -L 5902:127.0.0.1:5902 vncuser@SERVER_IP

VNC Viewer:

1
127.0.0.1:5902

这套方式兼顾了:

1
2
3
4
5
6
7
易维护
systemd 管理
用户隔离
开机启动
VNC GUI
SSH 加密
减少公网暴露

总结

VNC 的基本思路并不复杂:

1
2
3
4
5
6
7
8
9
Linux Desktop

TigerVNC Server

Display :2

TCP 5902

VNC Viewer

真正容易出问题的地方主要是:

1
2
3
4
5
6
7
8
9
10
Linux 是否安装桌面
TigerVNC 版本
Display 与端口映射
VNC 用户权限
GNOME Session
Wayland / Xorg
SELinux
firewalld
systemd
公网安全

对于 Rocky Linux / RHEL 8、9,一套比较规范的 TigerVNC 配置应该使用:

1
2
3
/etc/tigervnc/vncserver.users
/etc/tigervnc/vncserver-config-defaults
systemctl enable --now vncserver@:2

而不是继续复制早期版本的 vncserver@.service 模板。

如果只是内网临时使用,可以直接通过:

1
SERVER_IP:5902

连接。

如果是长期使用、跨网络或者服务器具备公网访问能力,更推荐:

1
2
3
4
5
VPN
+
SSH Tunnel
+
VNC

最后还要特别注意:RHEL 10 / Rocky Linux 10 已经不再提供 TigerVNC Server,官方远程桌面方向已经转为 GNOME Remote Desktop + RDP。

所以部署前第一条命令最好不是:

1
dnf install tigervnc-server

而是:

1
cat /etc/os-release

先确认系统版本,再决定技术路线。这样能少踩很多“教程明明没错,但就是装不上”的时代之坑。


参考资料

  • 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

使用 VNC 远程控制 Linux Desktop 服务器:TigerVNC 安装、配置与安全访问
https://allendericdalexander.github.io/2026/08/13/devops/linux/linux-vnc-remote-desktop/
作者
AtLuoFu
发布于
2026年8月13日
许可协议