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