努力
加油

Ubuntu Server安装桌面环境后如何通过VNC访问?

在 Ubuntu Server 上安装桌面环境并通过 VNC 访问,是运维和开发中非常常见的需求。但这里有个核心痛点需要前置说明:VNC 协议本身是明文传输的(除非配合 SSH 隧道或 TLS),安全性较差,且配置过程容易踩坑。

目前业界更推荐的做法是使用 NoVNC(基于 HTML5 的 Web 界面)或者 Xrdp(微软远程桌面协议)。如果你坚持要用传统 VNC,以下是经过验证的稳定方案。

我们将采用 GNOME 桌面 + TigerVNC 的组合,因为 GNOME 资源占用相对可控,TigerVNC 性能优于老旧的 VNC4Server。

第一步:安装桌面环境和 VNC 服务端

首先,你需要一个图形界面。Ubuntu Server 默认没有 GUI。

# 更新源
sudo apt update

# 安装 Ubuntu Desktop(包含 GNOME 桌面)
# 注意:这会下载几百 MB 的数据,请确保带宽充足
sudo apt install ubuntu-desktop -y

# 安装 TigerVNC 服务端
sudo apt install tigervnc-standalone-server tigervnc-common -y

注意:ubuntu-desktop 包非常大,如果你的服务器内存较小(如 1GB 以下),建议改为安装轻量级桌面 xubuntu-desktop 或 kubuntu-desktop,或者手动安装最小化桌面组件。

第二步:创建 VNC 用户并设置密码

VNC 的用户认证是基于 Linux 系统用户的。假设你当前登录的用户是 username(请用实际用户名替换)。

# 切换到你的用户
su - username

# 初始化 VNC 配置并设置密码
vncpasswd

输入两次密码后,你会发现在 ~/.vnc/ 目录下生成了配置文件。此时 VNC 服务尚未启动,我们需要配置它开机自启。

第三步:配置 VNC 服务启动脚本

VNC 服务端通常通过 systemd 管理,但为了兼容性,我们创建一个简单的启动脚本。

  1. 编辑配置文件:

    nano ~/.vnc/config
  2. 添加以下内容(根据你的硬件调整分辨率和色深):

    # 会话名称
    session=gnome-session
    # 分辨率
    geometry=1920x1080
    # 监听地址(0.0.0.0 表示允许所有网卡接入,生产环境建议限制 IP)
    listen-address=0.0.0.0
    # 端口号(默认 5900,即 :1)
    port=5900
    # 禁用加密(因现代 VNC 客户端支持 TLS 或通过 SSH 隧道,此处简化处理)
    SecurityTypes=None
  3. 创建一个启动脚本 start_vnc.sh:

    nano ~/start_vnc.sh

内容如下:

#!/bin/bash
# 等待 X server 就绪(简单粗暴的方法,实际生产中可用 xinit 或 display-manager)
sleep 5
# 启动 VNC Server
/usr/bin/vncserver :1 -localhost no -fg

赋予执行权限:

chmod +x ~/start_vnc.sh

第四步:配置 Systemd 服务实现开机自启

为了让 VNC 随系统启动自动运行,我们需要创建一个 systemd 服务文件。

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

填入以下内容(注意将 username 替换为你的实际用户名):

[Unit]
Description=Start TigerVNC server at startup
After=syslog.target network-online.target

[Service]
Type=forking
User=username
Group=username
WorkingDirectory=/home/username

ExecStartPre=-/usr/bin/vncserver -kill %i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver :1 -geometry 1920x1080 -depth 24 -localhost no
ExecStop=/usr/bin/vncserver -kill %i

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

启用并启动服务:

sudo systemctl daemon-reload
sudo systemctl enable vncserver@1.service
sudo systemctl start vncserver@1.service

检查状态:

sudo systemctl status vncserver@1.service

如果看到 active (running),说明服务已启动。你可以查看日志确认是否有报错:

journalctl -u vncserver@1.service -f

第五步:防火墙与网络连接

Ubuntu 默认可能开启了 UFW 防火墙。

# 允许 VNC 端口(5900)
sudo ufw allow from <你的IP段> to any port 5900 proto tcp

# 例如,只允许特定 IP 访问:
sudo ufw allow from 192.168.1.100 to any port 5900 proto tcp

重要安全警告:VNC 流量是未加密的。强烈建议不要直接暴露在公网。最佳实践是通过 SSH 隧道 转发本地端口到服务器 5900 端口,然后使用 VNC 客户端连接 localhost:5900。

SSH 隧道使用方法(推荐):

在你的本地机器终端执行:

ssh -L 5900:localhost:5900 username@your_server_ip

然后在本地 VNC 客户端中,连接地址填写 localhost:5900,这样数据会通过 SSH 加密通道传输,安全性大幅提升。

常见问题排查

  1. 黑屏或无法显示桌面

    • 原因:GNOME 可能需要额外的辅助工具。
    • 解决:安装 gnome-terminal 和其他基础应用:
      sudo apt install gnome-terminal nautilus file-roller -y
    • 有时需要安装 dbus-x11:
      sudo apt install dbus-x11
  2. VNC 连接后鼠标移动缓慢

    • 原因:网络延迟或编码方式。
    • 解决:在 VNC 客户端设置中,尝试更改“颜色深度”为 24 位真彩色,或在服务端 config 中添加 Encoding=raw(牺牲带宽换取速度)。
  3. 重启后 VNC 无法启动

    • 检查 ~/.vnc/config 中的路径是否正确。
    • 确保 systemctl status vncserver@1.service 中没有错误。
    • 某些云厂商(如阿里云、腾讯云)的 Ubuntu 镜像可能预装了不同的显示管理器(如 lightdm),可能与 VNC 冲突。如果遇到此问题,建议卸载 lightdm 并使用 xdg-display-manager 或直接通过 startx 启动桌面。

替代方案建议

如果你发现上述配置过于复杂或稳定性不佳,可以考虑以下替代方案:

  1. XRDP(推荐用于 Windows 用户)

    sudo apt install xrdp
    sudo systemctl enable xrdp

    使用 Windows 自带的“远程桌面连接”即可连接,体验更接近原生 Windows 远程桌面,且支持剪贴板共享。

  2. NoVNC(Web 访问)
    结合 novnc 和 websockify,可以通过浏览器直接访问 VNC 桌面,无需安装任何客户端软件,适合临时应急使用。

  3. Cloud Shell / 云厂商控制台 VNC
    如果你使用的是阿里云 ECS、腾讯云 CVM 等,它们都提供了网页版的 VNC 控制台。在服务器故障导致 SSH 断开时,这是唯一的救急手段。日常使用中,不建议依赖云厂商的控制台 VNC,因为画质差、延迟高。

总结

  • 生产环境:优先使用 XRDP 或 SSH + NoVNC。
  • 开发测试:TigerVNC + GNOME 是标准做法。
  • 安全第一:务必通过 SSH 隧道访问 VNC,切勿将 5900 端口直接暴露给公网。