如何在Ubuntu 22.04上安装和配置VNC

介绍

虚拟网络计算,或称VNC,是一种连接系统,允许您使用键盘和鼠标与远程服务器上的图形桌面环境进行交互。对于尚未熟悉命令行的用户来说,它使管理远程服务器上的文件、软件和设置变得更加容易。

在本指南中,您将使用TightVNC在Ubuntu 22.04服务器上设置VNC服务器,并通过SSH隧道安全连接到它。然后,您将在本地计算机上使用VNC客户端程序通过图形桌面环境与您的服务器进行交互。

先决条件

要完成本教程,您需要:

  • 一个已配置了非root管理用户和使用UFW配置了防火墙的Ubuntu 22.04服务器。要完成此设置,请按照我们的Ubuntu 22.04初始服务器设置指南操作。
  • A local computer with a VNC client installed. The VNC client you use must support connections over SSH tunnels:

步骤 1 — 安装桌面环境和 VNC 服务器

默认情况下,Ubuntu 22.04 服务器没有安装图形桌面环境或 VNC 服务器,因此您需要先安装这些。

在选择 VNC 服务器和桌面环境时,您有很多选择。在本教程中,您将安装最新的 Xfce 桌面环境和来自官方 Ubuntu 存储库的 TightVNC 软件包。Xfce 和 TightVNC 都以轻量级和快速而闻名,这将有助于确保即使在较慢的互联网连接下,VNC 连接也能流畅稳定。

连接到服务器后,使用 SSH 更新软件包列表:

  1. sudo apt update

现在安装 Xfce 以及 xfce4-goodies 软件包,它包含一些桌面环境的增强功能:

  1. sudo apt install xfce4 xfce4-goodies

在安装过程中,可能会提示您选择 Xfce 的默认显示管理器。显示管理器是一种程序,通过图形界面允许您选择并登录到桌面环境。只有当您使用 VNC 客户端连接时,才会使用 Xfce,在这些 Xfce 会话中,您将已经作为非 root 的 Ubuntu 用户登录。因此,在本教程中,您选择的显示管理器并不重要。选择任何一个并按 ENTER 键。

安装完成后,安装 TightVNC 服务器:

  1. sudo apt install tightvncserver

接下来,运行 vncserver 命令来设置 VNC 访问密码,创建初始配置文件,并启动一个 VNC 服务器实例:

  1. vncserver

您将被提示输入和验证用于远程访问您的机器的密码:

Output
You will require a password to access your desktops. Password: Verify:

密码必须是 6 到 8 个字符长。超过 8 个字符的密码将被自动截断。

一旦验证密码,您将有选项创建一个只读密码。使用只读密码登录的用户将无法通过鼠标或键盘控制 VNC 实例。如果您想要向使用您的 VNC 服务器的其他人演示某些内容,这是一个有用的选项,但这并不是必需的。

然后,该过程会创建必要的默认配置文件和服务器连接信息。此外,它会在端口5901上启动默认服务器实例。这个端口称为显示端口,VNC将其称为:1。VNC可以在其他显示端口上启动多个实例,:2指的是端口5902:3指的是5903,依此类推:

Output
Would you like to enter a view-only password (y/n)? n xauth: file /home/sammy/.Xauthority does not exist New 'X' desktop is your_hostname:1 Creating default startup script /home/sammy/.vnc/xstartup Starting applications specified in /home/sammy/.vnc/xstartup Log file is /home/sammy/.vnc/your_hostname:1.log

请注意,如果您想要更改密码或添加只读密码,可以使用vncpasswd命令来执行:

  1. vncpasswd

此时,VNC服务器已安装并正在运行。现在您将配置它以启动Xfce,并通过图形界面访问服务器。

步骤2 — 配置VNC服务器

VNC服务器需要知道启动时要运行哪些命令。具体来说,VNC需要知道应连接到哪个图形桌面环境。

VNC服务器在启动时运行的命令位于名为xstartup的配置文件中,该文件位于您的主目录下的.vnc文件夹中。启动脚本是在上一步运行vncserver命令时创建的,但您将创建自己的启动脚本以启动Xfce桌面。

因为您将要更改 VNC 服务器的配置,首先停止运行在端口 5901 上的 VNC 服务器实例,使用以下命令:

  1. vncserver -kill :1

输出将会是这样的,尽管您会看到不同的 PID:

Output
Killing Xtightvnc process ID 17648

在修改 xstartup 文件之前,请备份原始文件:

  1. mv ~/.vnc/xstartup ~/.vnc/xstartup.bak

现在创建一个新的 xstartup 文件并在文本编辑器中打开它,比如 nano

  1. nano ~/.vnc/xstartup

然后在文件中添加以下行:

~/.vnc/xstartup
#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &

文件的第一行是一个 shebang。在 *nix 平台上,可执行的纯文本文件中的 shebang 告诉系统将该文件传递给哪个解释器以进行执行。在这种情况下,您将文件传递给 Bash 解释器。这将允许每个后续行按顺序执行命令。

文件中的第一个命令 xrdb $HOME/.Xresources 告诉 VNC 的 GUI 框架读取服务器用户的 .Xresources 文件。 .Xresources 是用户可以更改图形桌面的某些设置的地方,比如终端颜色、光标主题和字体呈现。第二个命令告诉服务器启动 Xfce。每当启动或重新启动 VNC 服务器时,这些命令将自动执行。

在添加这些行后保存并关闭文件。如果您使用的是 nano,请按 CTRL + X,然后输入 Y,最后按 ENTER 来执行此操作。

为了确保 VNC 服务器能够正确使用这个新的启动文件,您需要将其设置为可执行:

  1. chmod +x ~/.vnc/xstartup

然后重新启动VNC服务器:

  1. vncserver -localhost

请注意,这次命令包含-localhost选项,该选项将VNC服务器绑定到您服务器的环回接口。这将导致VNC仅允许来自安装有该服务器的连接。

在下一步中,您将在本地计算机和服务器之间建立SSH隧道,从根本上欺骗VNC,让其认为来自本地计算机的连接是从服务器发起的。这种策略将为VNC增加额外的安全层,因为只有那些已经具有SSH访问权限的用户才能访问它。

您将看到类似于此的输出:

Output
New 'X' desktop is your_hostname:1 Starting applications specified in /home/sammy/.vnc/xstartup Log file is /home/sammy/.vnc/your_hostname:1.log

配置完成后,您就可以准备从本地计算机连接到VNC服务器了。

步骤 3 — 安全连接到VNC桌面

VNC本身在连接时不使用安全协议。要安全地连接到服务器,您将建立一个SSH隧道,然后告诉您的VNC客户端使用该隧道进行连接,而不是直接连接。

在本地计算机上创建一个安全转发到VNC的localhost连接的SSH连接。您可以使用以下ssh命令在Linux或macOS终端上执行此操作:

  1. ssh -L 59000:localhost:5901 -C -N -l sammy your_server_ip

这是这个ssh命令选项的含义:

  • -L 59000:localhost:5901-L 开关指定本地计算机上的给定端口(59000)将被转发到目标服务器上给定的主机和端口(localhost:5901,意味着目标服务器上的端口 5901,定义为 your_server_ip)。请注意,您指定的本地端口有些是任意的;只要该端口尚未绑定到其他服务,您就可以将其用作隧道的转发端口。
  • -C:此标志启用压缩,可帮助最小化资源消耗并加快速度。
  • -N:此选项告诉 ssh 您不想执行任何远程命令。当您只想转发端口时,此设置很有用。
  • -l sammy your_server_ip-l 开关允许您指定连接到服务器后要登录的用户。请确保将 sammyyour_server_ip 替换为您的非 root 用户名称和您服务器的 IP 地址。

注意:此命令建立一个 SSH 隧道,将来自您的 VNC 服务器上端口 5901 的信息转发到本地计算机上端口 59000,通过每台机器上的端口 22,即 SSH 的默认端口。假设您已按照先决条件 Ubuntu 22.04 的初始服务器设置指南 进行操作,您将已添加一个 UFW 规则,以允许通过 OpenSSH 连接到您的服务器。

这比简单地打开服务器防火墙允许连接到端口5901更安全,因为那样会允许任何人通过VNC访问您的服务器。通过SSH隧道连接,您将VNC访问限制在已经具有SSH访问权限的机器上。

如果您正在使用PuTTY连接到服务器,可以通过右键单击终端窗口的顶部栏,然后单击更改设置…选项来创建一个SSH隧道:

在PuTTY重新配置窗口左侧的树形菜单中找到Connection分支。展开SSH分支,然后点击Tunnels。在Options controlling SSH port forwarding屏幕上,将59000输入为Source Port,将localhost:5901输入为Destination,如下所示:

然后点击Add按钮,然后点击Apply按钮来实现隧道。

隧道运行后,使用VNC客户端连接到localhost:59000。您将被提示使用步骤1中设置的密码进行身份验证。

连接后,您将看到默认的Xfce桌面。它应该看起来像这样:

您可以通过文件管理器或命令行访问家目录中的文件,如下所示:

在本地终端中按下CTRL+C停止SSH隧道并返回提示符。这也将断开您的VNC会话。

现在,您可以配置您的VNC服务器以作为systemd服务运行。

步骤 4 — 将 VNC 作为系统服务运行

通过将 VNC 服务器设置为作为 systemd 服务运行,您可以根据需要启动、停止和重新启动它,就像管理其他任何服务一样。您还可以使用 systemd 的管理命令确保 VNC 在服务器启动时启动。

首先,创建一个名为 /etc/systemd/system/[email protected] 的新单元文件:

  1. sudo nano /etc/systemd/system/[email protected]

名称末尾的 @ 符号将允许我们传递一个参数,您可以在服务配置中使用该参数。在管理服务时,您将使用此参数指定要使用的 VNC 显示端口。

将以下行添加到文件中。确保更改 UserGroupWorkingDirectory 的值,以及 PIDFILE 值中的用户名,使其与您的用户名匹配:

/etc/systemd/system/[email protected]
[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target

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

PIDFile=/home/sammy/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 -localhost :%i
ExecStop=/usr/bin/vncserver -kill :%i

[Install]
WantedBy=multi-user.target

ExecStartPre 命令会在 VNC 已运行时停止它。ExecStart 命令会启动 VNC 并将颜色深度设置为 24 位色,分辨率为 1280×800。您也可以修改这些启动选项以满足您的需求。此外,请注意,ExecStart 命令再次包含 -localhost 选项。

保存并关闭文件。

接下来,使系统知道新的单元文件:

  1. sudo systemctl daemon-reload

启用该单元文件:

  1. sudo systemctl enable [email protected]

在@符号后面的1表示服务应该出现在哪个显示屏上,在本例中,默认为:1,如步骤2所述。

如果VNC服务器仍在运行,请停止当前实例:

  1. vncserver -kill :1

然后像启动其他任何systemd服务一样启动它:

  1. sudo systemctl start vncserver@1

您可以使用此命令验证它是否已启动:

  1. sudo systemctl status vncserver@1

如果启动正确,输出应如下所示:

Output
[email protected] - Start TightVNC server at startup Loaded: loaded (/etc/systemd/system/[email protected]; enabled; vendor preset: enabled) Active: active (running) since Mon 2022-04-18 16:57:26 UTC; 20s ago Process: 97088 ExecStartPre=/usr/bin/vncserver -kill :1 > /dev/null 2>&1 (code=exited, status=2) Process: 97092 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 -localhost :1 (code=exited, status=0/SUCCESS) Main PID: 97103 (Xtightvnc) Tasks: 77 (limit: 4665) Memory: 146.7M CPU: 4.459s CGroup: /system.slice/system-vncserver.slice/[email protected] . . .

您的VNC服务器现在已准备好在服务器启动时使用,您可以像管理其他任何systemd服务一样使用systemctl命令进行管理。

但是,在客户端方面不会有任何区别。要重新连接,请再次启动您的SSH隧道:

  1. ssh -L 59000:localhost:5901 -C -N -l sammy your_server_ip

然后使用您的VNC客户端软件建立新连接到localhost:59000以连接到您的服务器。

结论

您现在在您的Ubuntu 22.04服务器上拥有一个安全的VNC服务器,并已成功运行。现在,您可以使用友好的图形界面管理您的文件、软件和设置,并且可以远程运行像Web浏览器这样的图形软件。

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-vnc-on-ubuntu-22-04