介绍
虚拟网络计算,或称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 更新软件包列表:
现在安装 Xfce 以及 xfce4-goodies
软件包,它包含一些桌面环境的增强功能:
在安装过程中,可能会提示您选择 Xfce 的默认显示管理器。显示管理器是一种程序,通过图形界面允许您选择并登录到桌面环境。只有当您使用 VNC 客户端连接时,才会使用 Xfce,在这些 Xfce 会话中,您将已经作为非 root 的 Ubuntu 用户登录。因此,在本教程中,您选择的显示管理器并不重要。选择任何一个并按 ENTER
键。
安装完成后,安装 TightVNC 服务器:
接下来,运行 vncserver
命令来设置 VNC 访问密码,创建初始配置文件,并启动一个 VNC 服务器实例:
您将被提示输入和验证用于远程访问您的机器的密码:
OutputYou will require a password to access your desktops.
Password:
Verify:
密码必须是 6 到 8 个字符长。超过 8 个字符的密码将被自动截断。
一旦验证密码,您将有选项创建一个只读密码。使用只读密码登录的用户将无法通过鼠标或键盘控制 VNC 实例。如果您想要向使用您的 VNC 服务器的其他人演示某些内容,这是一个有用的选项,但这并不是必需的。
然后,该过程会创建必要的默认配置文件和服务器连接信息。此外,它会在端口5901
上启动默认服务器实例。这个端口称为显示端口,VNC将其称为:1
。VNC可以在其他显示端口上启动多个实例,:2
指的是端口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
命令来执行:
此时,VNC服务器已安装并正在运行。现在您将配置它以启动Xfce,并通过图形界面访问服务器。
步骤2 — 配置VNC服务器
VNC服务器需要知道启动时要运行哪些命令。具体来说,VNC需要知道应连接到哪个图形桌面环境。
VNC服务器在启动时运行的命令位于名为xstartup
的配置文件中,该文件位于您的主目录下的.vnc
文件夹中。启动脚本是在上一步运行vncserver
命令时创建的,但您将创建自己的启动脚本以启动Xfce桌面。
因为您将要更改 VNC 服务器的配置,首先停止运行在端口 5901
上的 VNC 服务器实例,使用以下命令:
输出将会是这样的,尽管您会看到不同的 PID:
OutputKilling Xtightvnc process ID 17648
在修改 xstartup
文件之前,请备份原始文件:
现在创建一个新的 xstartup
文件并在文本编辑器中打开它,比如 nano
:
然后在文件中添加以下行:
#!/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 服务器能够正确使用这个新的启动文件,您需要将其设置为可执行:
然后重新启动VNC服务器:
请注意,这次命令包含-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客户端使用该隧道进行连接,而不是直接连接。
在本地计算机上创建一个安全转发到VNC的localhost
连接的SSH连接。您可以使用以下ssh
命令在Linux或macOS终端上执行此操作:
这是这个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 地址。
注意:此命令建立一个 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]
的新单元文件:
名称末尾的 @
符号将允许我们传递一个参数,您可以在服务配置中使用该参数。在管理服务时,您将使用此参数指定要使用的 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
选项。
保存并关闭文件。
接下来,使系统知道新的单元文件:
启用该单元文件:
在@符号后面的1
表示服务应该出现在哪个显示屏上,在本例中,默认为:1
,如步骤2所述。
如果VNC服务器仍在运行,请停止当前实例:
然后像启动其他任何systemd服务一样启动它:
您可以使用此命令验证它是否已启动:
如果启动正确,输出应如下所示:
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隧道:
然后使用您的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