简介
虚拟网络计算(Virtual Network Computing,VNC)是一种连接系统,允许您使用键盘和鼠标与远程服务器上的图形桌面环境进行交互。对于尚未熟悉命令行的用户来说,它使得在远程服务器上管理文件、软件和设置变得更加容易。
在本指南中,您将在 Ubuntu 20.04 服务器上使用 TightVNC 设置一个 VNC 服务器,并通过 SSH 隧道安全地连接到它。然后,您将在本地计算机上使用 VNC 客户端程序通过图形桌面环境与服务器进行交互。
先决条件
要完成本教程,您需要:
- 一个安装了非 root 管理员用户和配置了 UFW 防火墙的 Ubuntu 20.04 服务器。要完成此设置,请按照我们的 Ubuntu 20.04 初始服务器设置指南。
- 一个安装了 VNC 客户端的本地计算机。您使用的 VNC 客户端必须支持通过 SSH 隧道进行连接:
- 在 Windows 上,您可以使用 TightVNC、RealVNC 或 UltraVNC。
- 在 macOS 上,您可以使用内置的屏幕共享程序,或者使用跨平台应用程序如 RealVNC。
- 在 Linux 上,您可以选择多种选项,包括
vinagre
、krdc
、RealVNC 或 TightVNC。
步骤 1 — 安装桌面环境和 VNC 服务器
默认情况下,Ubuntu 20.04 服务器不会安装图形桌面环境或 VNC 服务器,因此您需要先安装这些组件。
在选择 VNC 服务器和桌面环境时,您有多种选择。在本教程中,您将安装最新的 Xfce 桌面环境和来自官方 Ubuntu 仓库的 TightVNC 软件包。Xfce 和 TightVNC 都以轻量和快速著称,这将有助于确保即使在较慢的互联网连接上,VNC 连接也能保持流畅和稳定。
通过 SSH 连接到服务器后,更新软件包列表:
sudo apt update
现在安装 Xfce 以及 xfce4-goodies
软件包,其中包含一些桌面环境的增强功能:
sudo apt install xfce4 xfce4-goodies
在安装过程中,您可能会被提示选择 Xfce 的默认显示管理器。显示管理器是一个允许您通过图形界面选择并登录到桌面环境的程序。您只会在使用 VNC 客户端连接时使用 Xfce,并且在这些 Xfce 会话中,您已经以非 root 的 Ubuntu 用户登录。因此,在本教程的目的下,您选择的显示管理器并不重要。选择其中一个并按 ENTER
键。
安装完成后,安装 TightVNC 服务器:
sudo apt install tightvncserver
接下来,运行 vncserver
命令来设置 VNC 访问密码,创建初始配置文件,并启动一个 VNC 服务器实例:
vncserver
系统将提示您输入并验证远程访问机器的密码:
You will require a password to access your desktops. Password: Verify:
密码必须在六到八个字符之间。超过 8 个字符的密码将被自动截断。
验证密码后,您将有选项创建一个只读密码。使用只读密码登录的用户将无法使用鼠标或键盘控制 VNC 实例。如果您想要在 VNC 服务器上向其他人演示某些内容,这是一个有用的选项,但不是必需的。
该过程随后将创建必要的默认配置文件和服务器的连接信息。此外,它会在端口 5901
上启动一个默认服务器实例。此端口称为 显示端口,VNC 将其表示为 :1
。VNC 可以在其他显示端口上启动多个实例,:2
对应端口 5902
,:3
对应 5903
,依此类推:
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
命令进行操作:
vncpasswd
到此为止,VNC 服务器已安装并运行。现在让我们配置它以启动 Xfce,并通过图形界面访问服务器。
第二步 — 配置 VNC 服务器
VNC 服务器需要知道在启动时要执行哪些命令。具体来说,VNC 需要知道它应该连接到哪个图形桌面环境。
VNC 服务器在启动时运行的命令位于名为 xstartup
的配置文件中,该文件位于您的主目录下的 .vnc
文件夹中。启动脚本是在上一步运行 vncserver
命令时创建的,但您将创建自己的启动脚本来启动 Xfce 桌面。
因为您将要更改 VNC 服务器的配置方式,首先使用以下命令停止运行在端口 5901
上的 VNC 服务器实例:
vncserver -kill :1
输出将类似于以下内容,尽管您将看到不同的 PID:
Killing Xtightvnc process ID 17648
在修改 xstartup
文件之前,先备份原始文件:
mv ~/.vnc/xstartup ~/.vnc/xstartup.bak
现在创建一个新的 xstartup
文件并在文本编辑器(如 nano
)中打开它:
nano ~/.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 服务器能够正确使用这个新的启动文件,您需要将其设置为可执行:
chmod +x ~/.vnc/xstartup
然后重新启动 VNC 服务器:
vncserver -localhost
请注意,这次命令包括 -localhost
选项,它将 VNC 服务器绑定到服务器的回环接口。这将导致 VNC 仅允许来自安装了 VNC 的服务器的连接。
在下一步中,您将在本地计算机和服务器之间建立一个 SSH 隧道,从本质上来说,这会让 VNC 以为连接来自您的本地计算机是源自您的服务器。这种策略将为 VNC 增加额外的安全层,因为唯一能够访问它的用户是那些已经具有 SSH 访问权限的用户。
您将看到类似于以下内容的输出:
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 服务器了。
第三步 — 安全连接到 VNC 桌面
VNC 本身在连接时不使用安全协议。为了安全地连接到您的服务器,您将建立一个 SSH 隧道,然后告诉您的 VNC 客户端使用该隧道进行连接,而不是直接连接。
在本地计算机上通过 Linux 或 macOS 终端使用以下 ssh
命令创建一个安全地转发到 VNC 的 localhost
连接的 SSH 连接:
[environment local] 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
开关让您指定连接到服务器后要登录的用户。请确保将sammy
和your_server_ip
替换为您的非 root 用户的名称和服务器的 IP 地址。
如果您使用 PuTTY 连接到服务器,您可以通过右键单击终端窗口的顶部栏,然后单击 Change Settings… 选项来创建一个 SSH 隧道:
!右键单击顶部栏以显示 Change Settings 选项
在 PuTTY 重新配置窗口的左侧树菜单中找到 Connection 分支。展开 SSH 分支,然后单击 Tunnels。在 Options controlling SSH port forwarding 屏幕上,将 59000
输入为 Source Port,将 localhost:5901
输入为 Destination,如下所示:
!示例 PuTTY SSH 隧道配置
然后单击 Add 按钮,然后单击 Apply 按钮以实施隧道。
一旦隧道运行,使用 VNC 客户端连接到 localhost:59000
。您将被提示使用您在第一步中设置的密码进行身份验证。
连接后,您将看到默认的 Xfce 桌面。它应该看起来像这样:
!连接到 Ubuntu 20.04 服务器的 VNC,使用 Xfce 桌面环境
您可以使用文件管理器或命令行访问主目录中的文件,如下所示:
!通过 VNC 连接到 Ubuntu 20.04 的文件管理器
在本地终端中按 CTRL+C
停止 SSH 隧道并返回到提示符。这也将断开您的 VNC 会话。
现在,您可以配置您的 VNC 服务器以作为一个 systemd 服务运行。
步骤 4 —— 将 VNC 作为系统服务运行
通过设置 VNC 服务器以 systemd 服务的形式运行,您可以像其他服务一样根据需要启动、停止和重新启动它。您还可以使用 systemd 的管理命令来确保 VNC 在服务器启动时启动。
首先,创建一个名为 /etc/systemd/system/vncserver@.service
的新单元文件:
sudo nano /etc/systemd/system/vncserver@.service
名称末尾的 @
符号将允许我们传递参数,您可以在服务配置中使用该参数来指定您在管理服务时要使用的 VNC 显示端口。
将以下行添加到文件中。确保更改 User、Group、WorkingDirectory 的值,并将 PIDFILE 的值中的用户名更改为与您的用户名匹配:
[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 位色,并设置分辨率为 1280x800。您也可以修改这些启动选项以满足您的需求。另外,请注意 ExecStart
命令再次包含 -localhost
选项。
保存并关闭文件。
接下来,让系统知道新的单元文件:
sudo systemctl daemon-reload
启用单元文件:
sudo systemctl enable vncserver@1.service
@
符号后面的 1
表示服务应该出现在哪个显示编号上,这里是默认的 :1
,就像在步骤 2 中讨论的那样。
如果当前实例的 VNC 服务器仍在运行,请停止它:
vncserver -kill :1
然后像启动任何其他 systemd 服务一样启动它:
sudo systemctl start vncserver@1
您可以使用以下命令验证它是否已启动:
sudo systemctl status vncserver@1
如果它已正确启动,输出应如下所示:
● vncserver@1.service - Start TightVNC server at startup Loaded: loaded (/etc/systemd/system/vncserver@.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2020-05-07 17:23:50 UTC; 6s ago Process: 39768 ExecStartPre=/usr/bin/vncserver -kill :1 > /dev/null 2>&1 (code=exited, status=2) Process: 39772 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :1 (code=exited, status=0/SUCCESS) Main PID: 39795 (Xtightvnc) ...
您的 VNC 服务器现在已准备好在服务器启动时使用,并且您可以像任何其他 systemd 服务一样使用 systemctl
命令来管理它。
但是,客户端方面不会有任何区别。要重新连接,请再次启动您的 SSH 隧道:
[本地环境] ssh -L 59000:localhost:5901 -C -N -l sammy your_server_ip
然后使用您的 VNC 客户端软件建立新连接到 localhost:59000
来连接到您的服务器。
结论
您现在在 Ubuntu 20.04 服务器上已经拥有一个安全的 VNC 服务器,并且可以使用用户友好的图形界面来管理文件、软件和设置,还可以远程运行诸如 Web 浏览器之类的图形软件。