mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
1683 字
5 分钟
VNC 远程桌面安装教程

VNC 安装与搭建教程:远程桌面访问的便捷方案#

在服务器管理和远程办公场景中,我们常常需要通过图形界面操作远程主机。虽然 SSH 是命令行访问的利器,但当我们需要运行图形化应用(如浏览器、IDE、配置工具)时,就需要一个远程桌面解决方案。VNC(Virtual Network Computing)正是这样一款轻量、跨平台的远程桌面协议,它允许你在本地显示远程服务器的桌面,如同坐在服务器前一样操作。

本文将带你从零开始,在 Ubuntu 服务器上安装和配置 VNC 服务器,并安全地通过客户端进行连接。

1. VNC 简介#

VNC 基于 RFB(Remote Frame Buffer)协议,采用客户端/服务器架构。服务器端将屏幕图像压缩后发送给客户端,客户端将键盘鼠标输入传回服务器,实现远程交互。

常见的 VNC 服务器软件有:

  • TigerVNC:目前最活跃的开源实现,性能好,支持系统服务化
  • x11vnc:可直接复用现有 X 会话,适合临时共享桌面
  • TightVNC:轻量级,对带宽优化较好

本文将以 TigerVNC 为例进行部署,因其稳定、易用且与 Ubuntu 集成良好。

2. 环境准备#

  • 操作系统:Ubuntu 20.04 / 22.04 LTS
  • 拥有 sudo 权限的用户
  • 确保服务器有图形界面(如 Xfce、GNOME 等)或准备安装轻量桌面
  • 网络连通,防火墙允许 VNC 端口(默认 5901 开始)

注意:如果你的服务器没有图形界面(如最小化安装),需要先安装一个桌面环境。推荐使用轻量级 Xfce 以减少资源占用。

3. 安装 VNC 服务器#

更新软件源并安装 TigerVNC:

sudo apt update
sudo apt install tigervnc-standalone-server tigervnc-common -y

安装完成后,验证安装:

vncserver -version

4. 配置 VNC 服务器#

4.1 设置 VNC 密码#

每个用户需要单独设置 VNC 密码(用于客户端连接认证)。使用以下命令:

vncpasswd

系统会提示输入两次密码,并询问是否设置只读密码(可选)。密码文件默认保存在 ~/.vnc/passwd

4.2 配置桌面环境#

VNC 服务器启动时会运行 ~/.vnc/xstartup 脚本,该脚本决定启动哪个桌面环境。我们需要创建并编辑这个文件。

首先,创建 .vnc 目录(如果不存在):

mkdir -p ~/.vnc

然后编辑 ~/.vnc/xstartup

nano ~/.vnc/xstartup

内容示例(使用 Xfce 桌面):

#!/bin/bash
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
startxfce4 &

如果使用 GNOME 或其他桌面,相应修改启动命令。确保文件具有可执行权限:

chmod +x ~/.vnc/xstartup

4.3 测试启动 VNC 服务器#

首次启动可以指定显示号(通常从 1 开始,对应端口 5901):

vncserver :1 -geometry 1280x720 -depth 24
  • :1 表示显示号 1,监听端口 5901
  • -geometry 设置分辨率
  • -depth 设置颜色深度

启动成功后,会输出类似 New 'hostname:1 (user)' desktop is hostname:1 的信息。

4.4 停止 VNC 服务器#

停止指定显示号的 VNC 服务:

vncserver -kill :1

5. 将 VNC 配置为系统服务#

为了让 VNC 在系统启动时自动运行,并便于管理,我们可以创建 systemd 服务文件。

创建服务文件 /etc/systemd/system/vncserver@.service(注意 @ 符号,用于传递显示号):

sudo nano /etc/systemd/system/vncserver@.service

内容如下(替换 USER 为实际用户名):

[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target
[Service]
Type=forking
User=USER
Group=USER
WorkingDirectory=/home/USER
PIDFile=/home/USER/.vnc/%H:%i.pid
ExecStartPre=/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver :%i -geometry 1280x720 -depth 24
ExecStop=/usr/bin/vncserver -kill :%i
[Install]
WantedBy=multi-user.target

保存文件后,重新加载 systemd:

sudo systemctl daemon-reload

启动服务并设置开机自启(例如显示号 1):

sudo systemctl enable vncserver@1
sudo systemctl start vncserver@1

检查服务状态:

sudo systemctl status vncserver@1

6. 安装轻量级桌面环境(可选)#

如果服务器没有图形界面,需要先安装一个桌面。推荐 Xfce:

sudo apt install xfce4 xfce4-goodies -y

如果希望安装更完整的 GNOME 桌面(资源消耗较大):

sudo apt install ubuntu-desktop -y

安装完成后,确认 ~/.vnc/xstartup 中启动了正确的桌面。

7. 连接 VNC 客户端#

7.1 直接连接(不推荐公网)#

在本地电脑上安装 VNC 客户端,如:

  • Remmina(Linux)
  • TigerVNC Viewer(跨平台)
  • RealVNC Viewer(跨平台)
  • VNC Viewer(移动端)

连接地址填写 服务器IP:5901(显示号 1 对应端口 5901),输入之前设置的密码即可。

7.2 通过 SSH 隧道(安全连接)#

直接在公网开放 VNC 端口存在安全风险,推荐通过 SSH 隧道转发。

在本地终端执行:

ssh -L 5901:localhost:5901 user@server_ip

保持 SSH 连接,然后在 VNC 客户端中连接 localhost:5901,数据将通过 SSH 加密传输。

也可以使用 SSH 的 -L 参数配合 VNC 客户端。

8. 防火墙配置#

如果确实需要直接暴露 VNC 端口,请在防火墙中放行对应端口(例如 5901):

sudo ufw allow 5901/tcp

但在生产环境中,强烈建议使用 SSH 隧道或 VPN,避免 VNC 直接暴露公网。

9. 常见问题与解决#

问题解决方法
连接时提示“Authentication failed”检查 VNC 密码是否正确;确认 ~/.vnc/passwd 文件存在且权限正确(600)
启动 VNC 时报错“Could not start Xvnc”检查是否已有 VNC 进程占用显示号;使用 vncserver -kill :1 清理后重试
桌面显示为灰色或只有终端检查 ~/.vnc/xstartup 脚本是否正确启动桌面;尝试手动执行该脚本排错
客户端画面卡顿降低分辨率或颜色深度(如 -geometry 1024x768 -depth 16);使用 SSH 隧道并调整压缩算法
systemd 服务无法启动检查服务文件中的路径和用户;查看日志 journalctl -u vncserver@1
VNC 连接后无法使用键盘/鼠标确认 VNC 客户端未禁用输入;检查服务器端是否有输入设备权限问题

10. 总结#

通过本文,你已经在 Ubuntu 上成功搭建了 VNC 服务器,并学会了通过客户端安全连接。无论是远程管理服务器上的图形应用,还是临时需要桌面环境,VNC 都是一个轻量、高效的解决方案。

进一步优化建议

  • 使用 x11vnc 共享现有物理桌面(适用于服务器已有显示器的情况)
  • 配合 autossh 维持稳定的 SSH 隧道
  • 为不同用户分配不同显示号,实现多用户远程桌面

进一步学习资源

温馨提示:VNC 本身未加密,公网使用务必通过 SSH 隧道或 VPN,保障数据传输安全。定期更新 VNC 软件,避免已知漏洞。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

VNC 远程桌面安装教程
http://blog.mcstarland.top/posts/vnc/
作者
MEMZGBL
发布于
2026-03-28
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00