介绍
虚拟网络计算或 VNC 是一种连接系统,允许您使用键盘和鼠标与远程服务器上的图形桌面环境进行交互。对于还不熟悉命令行的用户来说,它使管理远程服务器上的文件、软件和设置变得更加容易。
在本指南中,您将在 Ubuntu 20.04 服务器上设置一个带有TightVNC的 VNC 服务器,并通过 SSH 隧道安全地连接到它。然后,您将使用本地计算机上的 VNC 客户端程序通过图形桌面环境与服务器交互。
先决条件
要完成本教程,您需要:
- 一台 Ubuntu 20.04 服务器,具有非 root 管理用户和使用 UFW 配置的防火墙。要进行设置,请按照我们针对 Ubuntu 20.04 的初始服务器设置指南进行操作。
- 安装了 VNC 客户端的本地计算机。您使用的 VNC 客户端必须支持通过 SSH 隧道的连接:
步骤 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
系统会提示您输入并验证密码以远程访问您的机器:
OutputYou will require a password to access your desktops.
Password:
Verify:
密码长度必须介于 6 到 8 个字符之间。超过 8 个字符的密码将被自动截断。
验证密码后,您将可以选择创建仅供查看的密码。使用仅查看密码登录的用户将无法使用鼠标或键盘控制 VNC 实例。如果您想向使用 VNC 服务器的其他人演示某些内容,这是一个有用的选项,但这不是必需的。
然后,该过程会为服务器创建必要的默认配置文件和连接信息。此外,它会在端口上启动一个默认的服务器实例5901
。此端口称为显示端口,VNC 将其称为:1
. VNC 可以在其他显示端口上启动多个实例,:2
引用 port 5902
,:3
引用5903
,等等:
OutputWould 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 并让我们通过图形界面访问服务器。
步骤 2 — 配置 VNC 服务器
VNC 服务器在启动时需要知道要执行哪些命令。具体来说,VNC 需要知道它应该连接到哪个图形桌面环境。
VNC 服务器在启动时运行的命令位于主目录下文件夹中的配置文件xstartup
中.vnc
。启动脚本是vncserver
在上一步中运行命令时创建的,但您将创建自己的脚本来启动 Xfce 桌面。
因为您将要更改 VNC 服务器的配置方式,所以首先5901
使用以下命令停止在端口上运行的 VNC 服务器实例:
- vncserver -kill :1
尽管您会看到不同的 PID,但输出将如下所示:
OutputKilling 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 只允许来自安装它的服务器的连接。
在下一步中,您将在本地计算机和服务器之间建立 SSH 隧道,这实质上是诱使 VNC 认为来自本地计算机的连接源自您的服务器。此策略将为 VNC 增加一层额外的安全性,因为只有那些已经对您的服务器具有 SSH 访问权限的用户才能访问它。
你会看到类似这样的输出:
OutputNew '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 客户端使用该隧道进行连接,而不是进行直接连接。
在您的本地计算机上创建一个 SSH 连接,以安全地转发到localhost
VNC的连接。您可以使用以下ssh
命令通过 Linux 或 macOS 上的终端执行此操作:
- 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
开关可让您指定连接到服务器后要登录的用户。确保用非 root 用户的名称和服务器的 IP 地址替换sammy
和your_server_ip
。
注意:此命令建立一个 SSH 隧道,通过每台机器上的端口(SSH 的默认端口)将信息从5901
VNC 服务器上的端口转发到59000
本地机器上的端口22
。假设您遵循了Ubuntu 20.04的必备初始服务器设置指南,您将添加一个 UFW 规则以允许通过 OpenSSH 连接到您的服务器。
这比简单地打开服务器的防火墙以允许连接到 port 更安全5901
,因为这将允许任何人通过 VNC 访问您的服务器。通过通过 SSH 隧道进行连接,您将 VNC 访问权限限制在已经对服务器具有 SSH 访问权限的机器上。
如果您使用 PuTTY 连接到您的服务器,您可以通过右键单击终端窗口的顶部栏,然后单击更改设置…选项来创建 SSH 隧道:
在 PuTTY Reconfiguration 窗口左侧的树形菜单中找到Connection分支。展开SSH分支并单击Tunnels。在选项控制SSH端口转发屏幕上,输入59000
为源端口和localhost:5901
为目标,就像这样:
然后单击添加按钮,然后单击应用按钮以实现隧道。
隧道运行后,使用 VNC 客户端连接到localhost:59000
. 系统将提示您使用您在步骤 1 中设置的密码进行身份验证。
连接后,您将看到默认的 Xfce 桌面。它应该是这样的:
您可以使用文件管理器或从命令行访问主目录中的文件,如下所示:
CTRL+C
在您的本地终端中按下以停止 SSH 隧道并返回到您的提示。这也会断开您的 VNC 会话。
现在您可以将 VNC 服务器配置为作为 systemd 服务运行。
步骤 4 — 将 VNC 作为系统服务运行
通过将 VNC 服务器设置为作为 systemd 服务运行,您可以根据需要启动、停止和重新启动它,就像任何其他服务一样。您还可以使用 systemd 的管理命令来确保 VNC 在您的服务器启动时启动。
首先,创建一个名为 的新单元文件/etc/systemd/system/[email protected]
:
- sudo nano /etc/systemd/system/[email protected]
@
名称末尾的符号将让我们传入一个您可以在服务配置中使用的参数。您将使用它来指定管理服务时要使用的 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 位颜色,分辨率为 1280×800。您也可以修改这些启动选项以满足您的需要。另请注意,该ExecStart
命令再次包含该-localhost
选项。
保存并关闭文件。
接下来,让系统知道新的单元文件:
- sudo systemctl daemon-reload
启用单元文件:
- sudo systemctl enable [email protected]
在1
以下的@
符号表示,其显示编号的服务应该出现过,在这种情况下,默认:1
为在步骤2中进行了讨论。
如果 VNC 服务器的当前实例仍在运行,请停止它:
- vncserver -kill :1
然后像启动任何其他 systemd 服务一样启动它:
- sudo systemctl start vncserver@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 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 浏览器。