介绍
虚拟网络计算(VNC)是一种平台独立的协议,允许用户连接到远程计算机系统并从图形用户界面(GUI)使用其资源。
它就像远程控制应用程序:客户端计算机的键盘或鼠标点击通过网络传输到远程计算机。VNC还允许两台计算机之间共享剪辑板。
与网络世界中的其他一切一样,VNC是基于客户端服务器模型:VNC服务器在远程计算机上运行 - 您的Droplet - 以服务到来的客户端请求。
目标
在本教程中,我们将学习如何在CentOS 7上安装和配置VNC服务器。
为了展示 VNC 是如何工作的,我们还会将 GNOME 桌面安装在您的 CentOS 服务器上. 我们会创建两个用户帐户并为它们配置 VNC 访问。
前提条件
本教程中显示的命令、包和文件在 CentOS 7 的最小安装上进行了测试。
- Distro : CentOS 7, 64 位
- 资源要求 : 带 2 GB RAM 的 Droplet
- 要遵循本教程,您应该使用 sudo 用户。 要了解 sudo 特权是如何工作的,您可以参阅 DigitalOcean 教程
警告:您不应该在生产Linux服务器上运行本教程中的任何命令、查询或配置,这可能导致安全问题和停机时间。
步骤 1 – 创建两个用户帐户
首先,我们将创建两个用户帐户,这些帐户将从VNC客户端远程连接到我们的CentOS 7服务器。
- joevnc
- janevnc
运行以下命令来添加 joevnc 的用户帐户:
1sudo useradd -c "User Joe Configured for VNC Access" joevnc
然后运行passwd命令以更改 joevnc 的密码:
1sudo passwd joevnc
输出将要求我们新密码. 一旦提供,帐户将准备登录:
1Changing password for user joevnc.
2New password:
3Retype new password:
4passwd: all authentication tokens updated successfully.
接下来,创建一个帐户 janevnc :
1sudo useradd -c "User Jane Configured for VNC Access" janevnc
设置您的密码 janevnc :
1sudo passwd janevnc
步骤 2 – 安装 GNOME 桌面
现在我们将安装 GNOME 桌面。GNOME 是一个协作的努力:它是一个免费和开源的软件集合,构成了一个非常流行的桌面环境. 还有其他桌面环境,如 KDE,但 GNOME 更受欢迎。
1sudo yum groupinstall -y "GNOME Desktop"
根据您的网络的速度,这可能需要几分钟。
安装包组后,重新启动服务器:
1sudo reboot
故障排除 — 服务器在启动阶段停机
根据您的服务器是如何设置的,当机器启动时,它可能仍然处于启动阶段,显示这样的消息:
1Initial setup of CentOS Linux 7 (core)
21) [!] License information (Licence not accepted)
3Please make your choice from above ['q' to quit | 'c' to continue | 'r' to refresh]:
要通过此步骤,请按 1 (许可证阅读),然后按 2 (接受许可证),然后按 C (继续)。
如果你没有看到这个错误,启动过程顺利,越好越好,你可以转到下一步。
步骤 3 – 安装 TigerVNC 服务器
TigerVNC是允许我们进行远程桌面连接的软件。
安装 Tiger VNC 服务器:
1sudo yum install -y tigervnc-server
這應該顯示出來的結果如下:
1Loaded plugins: fastestmirror, langpacks
2Loading mirror speeds from cached hostfile
3
4. . .
5
6Running transaction
7 Installing : tigervnc-server-1.2.80-0.30.20130314svn5065.el7.x86_64 1/1
8 Verifying : tigervnc-server-1.2.80-0.30.20130314svn5065.el7.x86_64 1/1
9
10Installed:
11 tigervnc-server.x86_64 0:1.2.80-0.30.20130314svn5065.el7
12
13Complete!
现在我们已经安装了 VNC 服务器和 GNOME 桌面,我们还创建了两个用户帐户以通过 VNC 连接。
步骤 4 – 配置两个客户端的 VNC 服务
VNC 服务器在首次安装时不会自动启动. 若要检查此情况,请执行以下命令:
1sudo systemctl status vncserver@:.service
结果将是这样的:
1vncserver@:.service - Remote desktop service (VNC)
2 Loaded: loaded (/usr/lib/systemd/system/vncserver@.service; disabled)
3 Active: inactive (dead)
您也可以运行此命令:
1sudo systemctl is-enabled [email protected]
这应该显示出这样的输出:
1disabled
那么为什么禁用呢?那是因为每个用户都会启动VNC服务戴蒙的单独实例,换句话说,VNC不会作为一个单一的流程运行,以满足每个用户的请求,每个通过VNC连接的用户都必须启动一个新的戴蒙实例(或者系统管理员可以自动化)。
CentOS 7 使用 systemd daemon 来启动其他服务. 在 systemd 中生动运行的每个服务都有一个 service unit file,由 yum 安装程序在 /lib/systemd/system
目录下放置。
在我们的情况下,在 /lib/systemd/system/
目录中创建了一个通用服务单元文件,但在 /etc/systemd/system/
中没有链接。
1sudo ls -l /lib/systemd/system/vnc*
你应该看到:
1-rw-r--r--. 1 root root 1744 Jun 10 16:15 /lib/systemd/system/[email protected]
然后点击`/etc/systemd/system/``下方:
1sudo ls -l /etc/systemd/system/*.wants/vnc*
这个不存在:
1ls: cannot access /etc/systemd/system/*.wants/vnc*: No such file or directory
因此,第一步是为我们的两个用户启动两个新的VNC服务器实例。 要做到这一点,我们将需要在/etc/system/system
下创建两份通用VNC服务单元文件副本。
1sudo cp /lib/systemd/system/[email protected] /etc/systemd/system/vncserver@:4.service
2
3sudo cp /lib/systemd/system/[email protected] /etc/systemd/system/vncserver@:5.service
那么,为什么我们在复制的文件名中添加了两个数字(加上号)?
VNC本身运行在端口5900上,因为每个用户将运行自己的VNC服务器,所以每个用户都必须通过一个单独的端口连接。在文件名中添加一个数字告诉VNC将该服务运行为5900
的子端口
。
接下来,为每个客户端编辑服务单元文件。 使用 vi 编辑器打开 /etc/systemd/system/vncserver@:4.service
文件:
1sudo vi /etc/systemd/system/vncserver@:4.service
看看快速如何
部分告诉我们,我们已经完成了第一步,现在我们需要通过剩余的步骤。评论还告诉我们VNC是一个不受信任的连接。
现在,编辑文件的[服务]
部分,以joevnc
代替<USER>
的实例。 此外,在ExecStart
参数的末尾添加1280x1024
的地理位置
条款。 这只会告诉VNC它应该开始的屏幕大小。 您将总共修改两行。 这里是编辑的文件应该是什么样子(注意整个文件没有显示):
1# The vncserver service unit file
2#
3# Quick HowTo:
4# 1. Copy this file to /etc/systemd/system/vncserver@:<display>.service
5# 2. Edit <USER> and vncserver parameters appropriately
6# ("runuser -l <USER> -c /usr/bin/vncserver %i -arg1 -arg2")
7# 3. Run `systemctl daemon-reload`
8# 4. Run `systemctl enable vncserver@:<display>.service`
9#
10
11. . .
12
13[Unit]
14Description=Remote desktop service (VNC)
15After=syslog.target network.target
16
17[Service]
18Type=forking
19# Clean any existing files in /tmp/.X11-unix environment
20ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
21ExecStart=/sbin/runuser -l joevnc -c "/usr/bin/vncserver %i -geometry 1280x1024"
22PIDFile=/home/joevnc/.vnc/%H%i.pid
23ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
24
25[Install]
26WantedBy=multi-user.target
保存文件并输出 vi。
同样,在 vi 中打开 /etc/systemd/system/vncserver@:5.service
文件,并对用户 janevnc 进行更改:
1sudo vi /etc/systemd/system/vncserver@:5.service
这里只是标记了更改的[服务]
部分:
1[Service]
2Type=forking
3# Clean any existing files in /tmp/.X11-unix environment
4ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
5ExecStart=/sbin/runuser -l janevnc -c "/usr/bin/vncserver %i -geometry 1280x1024"
6PIDFile=/home/janevnc/.vnc/%H%i.pid
7ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
接下来,运行以下命令来重新加载 systemd daemon,并确保VNC在启动时为两个用户启动。
1sudo systemctl daemon-reload
启用第一个服务器实例:
1sudo systemctl enable vncserver@:4.service
输出:
1ln -s '/etc/systemd/system/vncserver@:4.service' '/etc/systemd/system/multi-user.target.wants/vncserver@:4.service'
启用第二个服务器实例:
1sudo systemctl enable vncserver@:5.service
输出:
1ln -s '/etc/systemd/system/vncserver@:5.service' '/etc/systemd/system/multi-user.target.wants/vncserver@:5.service'
现在您已经配置了两个 VNC 服务器实例。
步骤5:设置您的防火墙
接下来,我们需要配置防火墙以允许通过端口 5904 和 5905 的VNC流量。
防火墙服务应在系统启动时自动启动,但始终最好检查:
1sudo firewall-cmd --state
这应该显示:
1running
如果状态因任何原因不运行
,请执行以下命令,以确保运行:
1sudo systemctl start firewalld
现在添加端口 5904 和 5905 的规则:
1sudo firewall-cmd --permanent --zone=public --add-port=5904-5905/tcp
输出:
1success
重新加载防火墙:
1sudo firewall-cmd --reload
输出:
1success
步骤6:设置VNC密码
在这个步骤中,用户将需要设置他们的 VNC密码 . 这些不是用户的Linux密码,而是用于登录VNC会话的密码。
打开另一个终端连接到 CentOS 7 服务器,此时登录为 joevnc 。
1ssh joevnc@your_server_ip
执行以下命令:
1vncserver
正如下面的输出所示,服务器会要求 joevnc 设置一个VNC密码. 输入密码后,程序还会显示在用户主目录中创建的一些文件:
1You will require a password to access your desktops.
2
3Password:
4Verify:
5xauth: file /home/joevnc/.Xauthority does not exist
6
7New 'localhost.localdomain:1 (joevnc)' desktop is localhost.localdomain:1
8
9Creating default startup script /home/joevnc/.vnc/xstartup
10Starting applications specified in /home/joevnc/.vnc/xstartup
11Log file is /home/joevnc/.vnc/localhost.localdomain:1.log
让我们来看看新
localhost.localdomain:1(joevnc)的桌面是 localhost.localdomain:1`. localhost.localdomain 是我们示例中的服务器名称;在您的情况下,它可能会有所不同。 请注意服务器名称之后的号码: (1 ,由一个分开) 它不是 joevnc 的服务单元文件中的号码(这是 4 )。
接下来打开一个新的终端会话并登录为 janevnc . 在这里也启动VNC服务器并为 janevnc 设置密码:
1vncserver
您应该看到类似的输出显示 janevnc 的会话将在显示 2 上运行。
最后,从主终端会话中重新加载服务:
1sudo systemctl daemon-reload
2sudo systemctl restart vncserver@:4.service
3sudo systemctl restart vncserver@:5.service
步骤 7 — 使用 VNC 客户端连接到远程桌面
对于本教程,我们将假设用户 joevnc 和 janevnc 正在尝试从他们的Windows计算机连接到CentOS 7服务器。
他们每个人都需要一个VNC客户端Windows登录远程桌面。这个客户端就像一个终端客户端像Putty,除了它显示图形输出之外。有各种VNC客户端可用,但我们将使用的是RealVNC,可用 这里.VNC Viewer for Mac OS X可以在同一页面上下载,Mac版本与Windows相似。
当 VNC 浏览器启动时,它会显示这样的对话框:
在 VNC 服务器 字段中,添加您的 CentOS 7 服务器的 IP 地址. 指定服务器的 IP 之后的端口号码 5904,分隔一个(: ). 我们使用了 5904 因为这是 joevnc 的 VNC 服务端口。
我们还决定让VNC Viewer选择加密方法. 此选项只会加密通过网络发送的密码. 随后的与服务器的任何通信都不会加密。
事實上,一個警告訊息顯示了這一點:
现在接受警告. 显示一个密码提示:
输入您之前设置的 joevnc 的 VNC 密码。
打开一个新的窗口,显示我们的远程 CentOS 服务器的 GNOME 桌面:
接受默认的欢迎消息。
现在 joevnc 可以启动像 GNOME 计算器这样的图形工具:
您可以将此桌面连接打开。
现在 janevnc 也可以在 CentOS 服务器上启动另一个 VNC 会话,IP 地址是相同的,端口是 5905:
当 janevnc 通过VNC Viewer登录时,会显示一个带有欢迎消息的空桌面,就像在 joevnc 上显示的那样。
要关闭远程桌面会话,只需关闭窗口即可完成,但是,这不会阻止用户在服务器的背景中使用VNC服务,如果该服务没有停止或重新启动,而机器没有重新启动,则在下一个登录时会出现相同的桌面会话。
关闭VNC Viewer窗口,以便关闭 joevnc 和 janevnc 。 关闭他们的终端会话也。 从主终端窗口查看VNC服务是否仍在运行:
1sudo systemctl status vncserver@:4.service
输出显示远程桌面仍在运行:
1vncserver@:4.service - Remote desktop service (VNC)
2 Loaded: loaded (/etc/systemd/system/vncserver@:4.service; enabled)
3 Active: active (running) since Sat 2014-11-01 12:06:49 EST; 58min ago
4 Process: 2014 ExecStart=/sbin/runuser -l joevnc -c /usr/bin/vncserver %i -geometry 1280x1024 (code=exited, status=0/SUCCESS)
5
6. . .
查看第二个服务:
1sudo systemctl status vncserver@:5.service
这个也是在运行:
1vncserver@:5.service - Remote desktop service (VNC)
2 Loaded: loaded (/etc/systemd/system/vncserver@:5.service; enabled)
3 Active: active (running) since Sat 2014-11-01 12:42:56 EST; 22min ago
4 Process: 3748 ExecStart=/sbin/runuser -l janevnc -c /usr/bin/vncserver %i -geometry 1280x1024 (code=exited, status=0/SUCCESS)
5
6. . .
如果你想在此时重新登录 joevnc 的桌面,你会看到相同的计算机应用程序打开。
对于系统管理员来说,这会带来一些有趣的挑战,如果你有许多用户通过VNC连接到服务器,你可能会想出一些方法来停止他们的VNC服务,当他们不再需要时。
故障排除 - VNC 服务故障
當您使用 VNC 進行測試並玩遊戲時,有時您可能會發現該服務已崩潰並無法恢復。
1sudo systemctl status vncserver@:4.service
这个长错误消息可能会出现:
1vncserver@:4.service - Remote desktop service (VNC)
2 Loaded: loaded (/etc/systemd/system/vncserver@:4.service; enabled)
3 Active: failed (Result: exit-code) since Fri 2014-11-07 00:02:38 EST; 2min 20s ago
4 Process: 2221 ExecStart=/sbin/runuser -l joevnc -c /usr/bin/vncserver %i -geometry 1280x1024 (code=exited, status=2)
5 Process: 1257 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill %i > /dev/null 2>&1 || : (code=exited, status=0/SUCCESS)
试图启动服务不起作用:
1sudo systemctl start vncserver@:4.service
失败的启动:
1Job for vncserver@:4.service failed. See 'systemctl status vncserver@:4.service' and 'journalctl -xn' for details.
通常,原因很简单。检查 /var/log/messages
:
1sudo tail /var/log/messages
相关的错误将看起来像这样:
1Nov 7 00:08:36 localhost runuser: Warning: localhost.localdomain:4 is taken because of /tmp/.X11-unix/X4
2Nov 7 00:08:36 localhost runuser: Remove this file if there is no X server localhost.localdomain:4
3Nov 7 00:08:36 localhost runuser: A VNC server is already running as :4
4Nov 7 00:08:36 localhost systemd: vncserver@:4.service: control process exited, code=exited status=2
5Nov 7 00:08:36 localhost systemd: Failed to start Remote desktop service (VNC).
6Nov 7 00:08:36 localhost systemd: Unit vncserver@:4.service entered failed state.
7Nov 7 00:08:36 localhost systemd: Failed to mark scope session-c3.scope as abandoned : Stale file handle
解决方案是删除 /tmp 文件夹中的文件:
1sudo rm -i /tmp/.X11-unix/X4
输出:
1rm: remove socket ‘/tmp/.X11-unix/X4’? y
然后开始VNC服务:
1sudo systemctl start vncserver@:4.service
总体问题解决
例如,您的远程桌面屏幕可能会空白或悬挂,会话可能会出现加密错误消息,VNC Viewer可能无法正确连接或向GUI传输命令来启动应用程序等。
我们建议您检查/var/log/messages
文件以获得更好的理解,有时您可能需要重新启动服务器,或者在极端情况下重新启动VNC服务。
系统资源也可能是一个罪魁祸首;您可能需要为您的Droplet添加额外的RAM等。
第8步:通过SSH隧道确保VNC会话
到目前为止,joevnc和janevnc都通过未加密的渠道访问了他们的远程桌面,正如我们之前所看到的,VNC Viewer在连接时警告我们;只有密码在会话开始时被加密。
關於 SSH 隧道
这是安全壳 (SSH) 会话可以帮助的地方. 使用 SSH,VNC 可以在 SSH 加密会话的背景下运行. 这被称为 tunnelling. 事实上,VNC 流量会反弹到 SSH 协议上,导致与服务器的所有通信都被加密。 它被称为 tunnelling,因为 SSH 通过 VNC 提供包围保护,VNC 就像在 SSH 内的隧道中运行一样。
SSH隧道工作与 port forwarding,这基本上是将访问从一个特定的端口翻译到另一台机器上的另一个端口的一种方式. 通过端口转发,当客户端应用连接到运行在机器A上的端口A时,它被透明地转发到运行在机器B上的端口B。
有关 SSH 隧道的更多详细信息,请阅读 本教程。
在本教程中,我们将VNC配置为在端口5904(对于 joevnc )和5905(对于 janevnc )上运行。
通过端口转发,我们可以将本地VNC客户端设置为本地客户端计算机上的端口 5900 连接,并且可以将其地图到远程服务器上的端口 5905 。
当 VNC 客户端应用程序启动时,它可以在 localhost 上指向端口 5900 ,我们的端口转发将其透明地传输到远程服务器上的端口 5905 。
** 注意:** 您需要每次启动一个 SSH 部分,以确保连接安全。
• OS X*
在 Mac 上,打开终端
。
输入以下连接信息,确保将your_server_ip
替换为远程服务器的IP地址:
1ssh -L 5900:your_server_ip:5905 janevnc@your_server_ip -N
输入 janevnc 的UNIX密码. 连接会出现悬挂;只要您使用远程桌面,您可以继续运行。
现在跳到VNC Viewer的指示。
◎ Windows ◎
为了确保 janevnc 的 VNC 会话,我们将假设本地 Windows 计算机安装了 PuTTY. PuTTY 是免费的,可以从 这里下载。
如果 janevnc 的 VNC 和终端会话尚未关闭,请现在关闭它们。
在会话屏幕上,请确保您指定服务器 IP 地址并给连接一个描述性名称,然后点击 ** 保存** 按钮来保存连接细节。
接下来,在左导航窗格中扩展 SSH ** 菜单项,然后选择 ** X11 项. 这显示了该会话的 X11 转发属性。
最后,选择 SSH > 隧道 . 在 ** 源** 端口字段中键入 5900
. 在 ** 目的地** 字段中,指定您的服务器的名称或 IP 地址,随后为预期用户提供一个 kolon 和 VNC 端口号。
或者,您可以使用端口 5902 . 在这种情况下, 2 将是 janevnc 的显示号码(请记住当 janevnc 运行vncserver
命令时显示的消息)。
点击添加
按钮,将添加地图在转发端口
下。我们正在为SSH会话添加端口转发;当用户在端口 5900 连接到 localhost时,连接将通过SSH自动隧道到远程服务器的端口 5905 。
返回 Sessions 项目并将会话保存为 janevnc . 点击 Open 按钮,一个新的终端会话将打开为 janevnc . 以相应的 UNIX 密码登录为 janevnc :
• VNC 查看器
下一次,在 VNC Server 地址中,键入并让 VNC 服务器选择加密方法:
点击连接
按钮。
您仍然会收到对话框警告您未加密会话,但这一次您可以安全地忽略它. VNC Viewer 不知道该端口正在转发(这是在SSH会话刚刚开始时设置的),并假设您正在尝试连接到本地机器。
接受此警告会显示熟悉的密码提示. 输入 janevnc 的VNC密码以访问远程桌面。
那么你怎么知道会话是加密的呢?如果你想过,我们在SSH会话中设置了端口转发。如果没有建立SSH会话,端口转发就不会起作用。事实上,如果你关闭终端窗口并退出PuTTY会话,然后尝试单独连接到VNC Viewer,如果尝试连接到localhost:5900
,就会显示以下错误信息:
因此,如果本地主机:5900
连接工作,您可以放心连接是加密的。
请记住,您每次使用 VNC 都会先建立 SSH 连接,以确保您的连接始终是加密的。
结论
从GUI前端访问您的CentOS Linux系统可以使系统管理变得更简单,您可以从任何客户端操作系统连接,而不必依赖基于Web的托管控制面板。
虽然我们已经展示了两个普通用户如何与他们的VNC客户端连接,但这在严肃的生产环境中几乎是不切实际的。实际上,用户将有自定义的应用程序或浏览器来访问服务器。
如果您决定在生产 Linux 服务器上安装和运行 VNC,我们强烈建议仅用于管理目的。