https://geek-blogs.com/blog/start-vnc-server-linux

[TigerVNC](https://tigervnc.org/)

[Download VNC Viewer by RealVNC®](https://www.realvnc.com/en/connect/download/viewer/)

## 什么是VNC

虚拟网络计算（VNC，Virtual Network Computing）是一种远程桌面协议，允许用户通过网络控制另一台计算机的图形界面。在Linux系统中，VNC服务器是实现远程图形化管理的重要工具，广泛用于服务器维护、远程办公、技术支持等场景。与命令行SSH相比，VNC提供了直观的图形界面，降低了操作门槛，尤其适合需要频繁交互图形应用（如CAD、办公软件）的场景。

在开始前，请确保你的Linux系统满足以下条件：

- **操作系统**：主流Linux发行版
- **权限**：拥有`sudo`或root权限（用于安装软件和配置服务）。
- **网络**：服务器需联网（用于下载安装包），且客户端能访问服务器的IP地址（本地局域网或公网）。
- **桌面环境**：若服务器为“无桌面”版本（如Ubuntu Server），需先安装图形桌面环境（见3.1节）。
- **性能影响**：图形化界面会持续占用大量CPU和内存资源（通常至少需要额外1-2 GiB内存），可能导致低配实例**响应减缓**。建议仅为特定、必要的业务场景（如自动化测试、图形渲染）安装GUI。对于常规的服务器管理，建议使用命令行工具。

选择VNC服务器

| 名称         | 特点                                   | 适用场景             | 推荐指数 |
| ------------ | -------------------------------------- | -------------------- | -------- |
| **TigerVNC** | 开源、轻量、性能好，支持加密（需配置） | 大多数Linux服务器    | ★★★★★    |
| **TightVNC** | 压缩算法优秀，适合低带宽网络           | 远程办公、低网速环境 | ★★★★☆    |

**推荐选择TigerVNC**：它是目前最活跃的开源VNC实现，兼容性好，配置简单，且支持通过SSH隧道加密传输，适合大多数场景。下文将以TigerVNC为例展开。



## 安装VNC服务器

### 安装依赖（服务器端桌面环境）

请根据实例规格和需求，选择合适的桌面环境和远程访问协议。选择更轻量的桌面环境可以有效降低资源消耗。



| 桌面环境 (DE)                                     | 资源占用 (内存)                | 推荐最低实例规格 |
| :------------------------------------------------ | :----------------------------- | :--------------- |
| [**XFCE**](https://www.xfce.org/)                 | 低 (约 500-800 MB)             | 2 vCPU, 2 GiB    |
| [**MATE**](https://mate-desktop.org/)             | 中 (约 800 MB-1.2 GiB)         | 2 vCPU, 4 GiB    |
| [**GNOME**](https://www.gnome.org/)               | 高 (约 1.5 GiB+)               | 4 vCPU, 8 GiB    |
| [**KDE Plasma**](https://kde.org/plasma-desktop/) | 中等偏高 (约 400 MB - 1.5 GiB) | 4 vCPU, 4 GiB    |



安装XFCE桌面环境。 

```bash
sudo apt update && sudo apt install -y xfce4 xfce4-goodies lightdm lightdm-gtk-greeter
sudo reboot
```

等待系统重启完成，出现图形化界面，确认安装成功。

> Ubuntu 默认不允许 root 进行图形登录。请创建普通用户用于桌面会话，必要时赋予 sudo 权限，避免以 root 直接操作桌面。



如果需要移除图形化界面，请执行以下命令：

 

```shell
# 1. 停止并卸载XFCE相关包
sudo apt-get purge -y xfce4* lightdm*

# 2. 自动移除不再需要的依赖包
sudo apt-get autoremove -y --purge

# 3. 重启系统
sudo reboot
```





### 安装VNC服务器软件



```bash
sudo apt install tigervnc-standalone-server tigervnc-common -y
```

查看启动后的实例

```bash
vncserver -list                                            

TigerVNC server sessions:

X DISPLAY #	RFB PORT #	RFB UNIX PATH	PROCESS ID #	SERVER
2         	5902      	             	29254       	Xtigervnc

```



## 配置VNC服务器



### 设置VNC访问密码

首次启动VNC前，需设置访问密码（仅首次执行时需要）：

```
vncpasswd/vncserver
```

执行后按提示输入密码（至少6位），并选择是否设置“仅查看”密码（一般选“n”，即无需仅查看权限）。密码会存储在 `~/.vnc/passwd` 文件中（权限为`600`，仅所有者可读）。

### 配置xstartup文件（启动桌面环境）

VNC服务器通过 `~/.vnc/xstartup` 脚本启动图形界面，需手动配置以指定桌面环境。

1. 创建/编辑xstartup文件：

   ```
   nano ~/.vnc/xstartup
   ```

2. 根据桌面环境粘贴以下内容（以**Xfce**为例）：

   ```
   #!/bin/bash
   export DISPLAY=":1"
   export XAUTHORITY="$HOME/.Xauthority"
   unset SESSION_MANAGER
   unset DBUS_SESSION_BUS_ADDRESS
   startxfce4 &
   exec xfce4-session
   
   ```

3. 保存文件并添加执行权限：

	```
	chmod +x ~/.vnc/xstartup
	```





### 4.3 定义显示编号与分辨率

VNC服务器通过“显示编号”区分不同会话，格式为 `:n`（n为整数，如`:1`），对应端口为 `5900 + n`（如`:1`对应5901端口）。

分辨率可在启动时通过 `-geometry` 参数指定（默认通常为1024x768），例如 `1920x1080`。

## 启动VNC服务器

首次测试时，可手动启动VNC会话：

```
vncserver :1 -geometry 1920x1080 -depth 24 --localhost
```

- `:1`：显示编号（对应端口5901）。
- `-geometry 1920x1080`：分辨率（按需调整，如1280x720）。
- `-depth 24`：颜色深度（24位真彩色，可选16/32）。

**输出示例**：

```
New 'localhost.localdomain:1 (user)' desktop is localhost.localdomain:1
Starting applications specified in /home/user/.vnc/xstartup
Log file is /home/user/.vnc/localhost.localdomain:1.log
```

此时VNC服务器已启动，会话信息（PID、日志路径）可通过 `vncserver -list` 查看：

```bash
vncserver -list


TigerVNC server sessions:

X DISPLAY #	RFB PORT #	RFB UNIX PATH	PROCESS ID #	SERVER
1         	5901      	             	33068       	Xtigervnc

```



### 5.2 配置系统服务（持久化运行)

手动启动的VNC会话在服务器重启后会失效，需配置为系统服务（通过systemd）实现开机自启。

#### 

1. 创建systemd服务文件（以显示编号`:1`为例）：

   ```
   sudo nano /etc/systemd/system/vncserver@:1.service
   ```

2. 粘贴以下内容（**替换`User`为你的用户名**，如`ubuntu`或`root`）：

   ```
   [Unit]
   Description=Remote desktop service (VNC)
   After=syslog.target network.target
   
   [Service]
   Type=forking
   User=chen
   Group=chen
   WorkingDirectory=/home/chen
   
   # 清理残留的锁文件和 socket
   ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill :1 > /dev/null 2>&1 || :'
   ExecStartPre=/bin/rm -f /tmp/.X1-lock /tmp/.X11-unix/X1
   ExecStart=/usr/bin/vncserver :1 -geometry 1920x1080 -depth 24 -localhost no
   ExecStop=/usr/bin/vncserver -kill :1
   
   [Install]
   WantedBy=multi-user.target
   ```

3. 重新加载systemd配置并启动服务：

   ```
   sudo systemctl daemon-reloadsudo systemctl enable --now vncserver@:1.service  # 启用并立即启动
   ```

4. 检查服务状态：

   ```
   sudo systemctl status vncserver@:1.service
   ```

   若显示 `active (running)`，则服务配置成功。



## 6. 连接到VNC服务器

### 6.1 安装VNC客户端

客户端需安装VNC查看器软件，常用工具：

- **TigerVNC Viewer**（跨平台，推荐）：[官网下载](https://tigervnc.org/)
- **RealVNC Viewer**（功能丰富）：[官网下载](https://www.realvnc.com/en/connect/download/viewer/)
- **Remmina**（Linux自带，支持多协议）：Ubuntu/Debian可直接安装 `sudo apt install remmina -y`

### 6.2 配置防火墙允许VNC端口

VNC默认使用 `5900 + 显示编号` 端口（如`:1`对应`5901`，`:2`对应`5902`）。需在服务器防火墙中开放对应端口：

#### Ubuntu/Debian（使用ufw）：

```bash
sudo ufw allow 5901/tcp  # 允许5901端口（显示编号:1）
sudo ufw reload
```

1. 打开VNC Viewer，在地址栏输入 `服务器IP:显示编号`（如 `192.168.1.100:1` 或 `server.example.com:1`）。
2. 点击“连接”，输入4.1节设置的VNC密码。
3. 成功连接后，即可看到服务器的图形桌面界面。



<img src="https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/image-20260422193342178.png" alt="image-20260422193342178" />

![image-20260422193156781](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/image-20260422193156781.png)



## 安全加固：保护VNC连接

⚠️ 注意：VNC协议默认不加密（密码虽加密，但传输内容明文），存在安全风险。需通过以下方法加固：

###  使用SSH隧道加密VNC流量（推荐）

通过SSH隧道将VNC流量加密传输，无需开放VNC端口（仅需开放SSH端口22）。

#### 客户端操作（以Windows为例，使用Xshell）

1. 在对应的，在“属性”中输入服务器IP和SSH端口（默认22）。
2. 导航到“SSH > Tunnels”，添加端口转发规则：
   - **Source port**：`localhost:590`（本地端口）
   - **Destination**：`localhost:5901`（服务器的VNC端口）
   - 本地端口：任意，只要是windows没有使用的都可以，本次填写5901
   - 目标端口：根据步骤2.4查看的该应用正在监听的端口来确定，本次填写5901

![image-20260422193226503](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/image-20260422193226503.png)

![image-20260422184826508](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/image-20260422184826508.png)

![image-20260422193018425](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/image-20260422193018425.png)

设置强密码与访问控制#
强密码：使用字母+数字+符号的复杂密码（vncpasswd命令可随时修改）
限制IP访问：通过防火墙仅允许特定IP连接（如局域网IP），例如：ufw限制仅192.168.1.0/24网段访问VNC

`sudo ufw allow from 192.168.1.0/24 to any port 5901/tcp
7.3 `

禁用明文传输（VNC over SSL） 

TigerVNC支持通过SSL加密传输，需生成证书并配置：

1. 生成SSL证书：

   ```
   mkdir -p ~/.vnc/certs && cd ~/.vnc/certsopenssl req -new -x509 -days 365 -nodes -out vnc.pem -keyout vnc.pemchmod 600 vnc.pem
   ```

2. 修改VNC启动命令（在systemd服务文件中添加 `-SecurityTypes TLSVnc`）：

   ```
   ExecStart=/usr/bin/vncserver %i -geometry 1920x1080 -depth 24 -SecurityTypes TLSVnc -X509Cert
   ```



错误报告：



![image-20260425213716824](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/image-20260425213716824.png)



## 应用于生产环境

在生产环境中使用图形化界面需要审慎评估，并遵循以下最佳实践。

- **资源规划**：根据选择的桌面环境，预留足够的CPU和内存资源以保证正常安装并使用。通过[查看实例监控信息](https://help.aliyun.com/zh/ecs/user-guide/view-the-monitoring-information-of-an-ecs-instance)持续观察资源使用率，必要时升级实例配置。
- **安全加固**：
  - **最小权限原则**：创建一个专用于GUI登录的非root普通用户，避免使用root用户直接操作桌面。
  - **系统更新**：定期执行 `sudo dnf update` 或 `sudo apt upgrade`，及时修补桌面环境和底层系统的安全漏洞。

- 实践：
  - **多会话管理**：启动多个VNC会话（如`:1`、`:2`），通过 `vncserver :2` 或修改systemd服务文件实现。
  - **备份配置**：定期备份 `~/.vnc/xstartup` 和 `/etc/systemd/system/vncserver@:1.service`。
  - **监控会话**：通过 `vncserver -list` 或 `ps aux | grep vnc` 检查活跃会话，闲置会话及时关闭（`vncserver -kill :1`）。



创建用户

```bash
sudo adduser abc
sudo usermod -ag sudo abc
su - abc
```

查看防火墙开放的端口

```bash
sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
7000/tcp                   ALLOW IN    Anywhere                  
22/tcp                     ALLOW IN    Anywhere   

检查某个端口是否开放
sudo ufw status | grep 8080
```

使用netstat查看监听端口

```bash
sudo netstat -tuln

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.54:53           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
```

Timed out waiting for a response from the computer

```
netstat -tlnp | grep 5901
```



你很可能看到类似下面的输出，注意 `127.0.0.1:5901` 或 `localhost:5901`

`tcp        0      0 127.0.0.1:5901          0.0.0.0:*               LISTEN      11903/Xtigervnc`

这个输出说明 VNC 服务只监听在本地环回地址（`127.0.0.1`）上，无法响应来自外部网络的连接请求

解决这个问题，只需在启动 VNC 服务时加上 `-localhost no` 参数，明确告诉它监听所有网络接口，从而接受外部连接

`vncserver :1 -geometry 1920x1080 -depth 24 -localhost no`

这次，你应该会看到 `0.0.0.0:5901`（代表监听所有 IPv4 地址）或 `*:5901`。这才是正确的状态，意味着 VNC 服务已准备好接受来自你本地电脑的连接请求

`tcp        0      0 0.0.0.0:5901            0.0.0.0:*               LISTEN      43366/Xtigervnc  `






