VirtualNetworkComputing(VNC)是一种提供计算机远程访问的流行工具。常规的VNC配置是针对单用户工作台而进行优化的,可登入到VNC端口直接访问单一用户的桌面。但是,这一配置在多用户计算机上使用不太合适。辛运的是,我们有一个代替方案。通过将VNC链接到一台Linux计算机的普通XDisplayManagerControlProtocol(XDMCP)服务器,访问VNC端口就才能让用户提供其用户名和密码,因而才能使单个VNC服务器实例处理多个用户登入。
VNC和X服务器构架
Linux使用XWindowSystem(简称X)作为其图形用户插口(GUI)。X从多个方面来看是一个不寻常的GUI,一个方面是它本身支持网路。X服务器实际上是一个网路服务器程序。网路服务器程序提供给顾客端程序对本地资源的访问,对于X服务器也是这么。奇特之处在于,对于X服务器来说“本地资源”是用户使用的显示器、键盘和滑鼠。在大部份常见配置中,X顾客端程序作为服务器运行在同一台计算机上。为此,LibreOffice、GNUImageManipulationProgram(GIMP)或其他程序是使用X的网路合同接受用户输入并在同一台计算机上为用户显示输出的X顾客端。
不过在通过网路使用X时,用户坐落X服务器计算机,而X的顾客端是用户希望在另一台计算机上运行的程序。这一配置须要第二个网路合同来发起联接。这第二个合同可以是telnet、SecureShell(SSH)或XDisplayManagerControlProtocol(XDMCP)。用于这一登陆合同的服务器在X顾客端计算机上运行,而远程登陆顾客端在X服务器计算机上运行。远程登陆服务器启动X顾客端,前者转而联系X服务器。图1描述了这一关系。实线箭头表示会话启动。(对于XDMCP,XDMCP顾客端建立在X服务器程序中。)
图1.X远程访问须要在两台计算机上装有一个顾客端和一个服务器
这些设置在好多本地网路上都很有效,但它有缺陷。比如,该配置须要单向网路合同启动,而这是难以通过一些防火墙或网路地址转换(NAT)路由器实现的。(SSH可以借助通道进行X会话,去除这一需求。)据悉,虽然X服务器可用于大部份平台,但它们一般不安装在运行Windows®的计算机上。出于这种和其他缘由,许多站点倾向于使用另一个合同RemoteFrameBuffer(RFB),该合同在VirtualNetworkComputing(VNC)系列程序中均有实现。
VNC是一个跨平台的工具,可从任何类型的顾客端提供对Linux、UNIX®、MacOSX、Windows和其他系统的远程访问。使用VNC,用户可以从顾客端计算机访问一台远程服务器计算机。在Linux上,VNC服务器要么将本地X服务器的界面内容镜像到远程计算机,要么包含其自身的X服务器,该服务器可独立于管理本地界面的服务器运行。结果类似于图2所示。同样,实线箭头表示会话启动。这一配置清除了反向进行网路联接的需求,但是因为VNC顾客端和服务器存在于这么多的操作系统中,用户可以借助单一顾客端程序访问任何服务器。
图2.一个VNC服务器包括一个可与本地X顾客端程序通讯的X服务器
VNC的缺点在于,RFB身分验证基于密码,而不须要用户名。为此,每位用户必须启动一个独立的VNC服务器会话,并通过指定正确的端标语联接到VNC实例。这一要求在单用户系统上可能能够接受,并且在多用户计算机上则非常不合适。
要解决这一问题,您可以将两种方式衔接上去。您可以重新配置您的本地XDMCP服务器以帮助集成在VNC中的X服务器提供缺乏的多用户身分验证(最终的配置类似于图3所示)。实线箭头表示会话启动。如今,当远程VNC用户联系VNC服务器计算机时,她们才能输入其用户名和密码来访问其自己唯一的VNC会话,因而计算机可以处理尽可能多的用户。
图3.将XDMCP添加到VNC配置就能提升灵活性
配置VNC服务器
有多种启动VNC的方式存在,包括使用脚本、使用桌面工具将VNC链接到您的桌面环境,以及使用xinetd窃听VNC联接。最后这一种方式就是这儿要介绍,由于它还能让您启动VNC,便于它可以使用您的XDMCP服务器。在详尽介绍怎样配置VNC以通过xinetd来启动之前,您必须选择一个VNC服务器。
选择VNC服务器
有若干VNC服务器程序可用。(参考资料提供了其中一些服务器程序的链接。)一些愈发流行的服务器程序包括TightVNC、TigerVNC和RealVNC。本文以TightVNC为例。遗憾的是,配置细节随服务器以及发行版的不同而不同,因而您可能须要针对您的软件来调整这儿所提供的使用说明。
安装xinetd
许多发行版默认安装xinetd超级服务器,但一些发行版没有安装此服务器。因为这儿所描述的方式使用的是xinetdlinux压缩命令,所以假如没有安装的话,您应该安装xinetd。在大部份发行版上,您可以使用软件包系统安装xinetd,例如在基于Debian的发行版上使用apt-getinstallxinetd,或则在openSUSE上使用zypperinstallxinetd。
您可能还须要配置xinetd来进行运行。您一般可以使用其SystemV(SysV)启动脚本,只需运行一次:
- # /etc/init.d/xinetd start
配置xinetd以使它在计算机启动时手动运行,这须要对您的发行版启动脚本方式有一定了解。一般,您可以使用一个实用工具,例如chkconfig(在Fedora、openSUSE和相关发行版中使用)arch linux,update-rc.d(在Debian和相关发行版中使用)或则rc-update(在Gentoo中使用),来执行这项工作,如下所示:
- # chkconfig xinetd on
- # update-rc.d xinetd enable
- # rc-update add xinetd default
仅输入那些命令中的其中一个,或则找到您发行版相对应的命令。
注意,假若没有配置任何服务的话,xinetd可能拒绝启动。为此,在您还未配置xinetd来管理您的VNC服务器之前,您可能要延后启动。
配置xinetd
应该由xinetd管理的服务器会将配置文件置于/etc/xinetd.d目录中。因而,要配置xinetd来处理VNC,您应该创建或编辑一个名称类似/etc/xinetd.d/vnc的文件。(在个别发行版上,例如openSUSE,VNC服务器包会安装这样的一个文件。)清单1提供了一个示例。
清单1.xinetd的一个VNC配置示例
- service vnc
- {
- disable = no
- socket_type = stream
- protocol = tcp
- wait = no
- user = nobody
- server = /usr/bin/Xvnc
- server_args = -inetd -once -query localhost -geometry 1024x768 -depth 16
- type = UNLISTED
- port = 5900
- }
该条目设置多个xinetd选项linux系统vnc配置,其中大多数选项应该保持原貌。您须要调整的这些选项包括:
xinetd配置最棘手的部份是设置服务器参数。您可以使用清单1中的参数作为模型,不过您可能想要修改其中一些参数:
还有许多其他选项,一些随VNC服务器的不同而不同。查询您的VNC服务器的文档,了解更多内容。
配置XDMCP服务器
大部份Linux发行版配置其XDMCP服务,主要是为了管理本地显示。为了提供远程访问,您必须重新配置您的XDMCP服务器,以接受在同一台计算机上运行的VNC服务器的恳求。具体细节因XDMCP服务器而异。Linux上最常用的三个XDMCP服务器是GNOMEDisplayManager(GDM)、LightDisplayManager(LightDM)和KDEDisplayManager(KDM)。其他XDMCP服务器,例如XDM,须要接受不同于此处所描述的调整。不管怎样,在重新配置您的XDMCP服务器以后,您须要重启它。
编辑XDMCP配置文件
假如您不确定您的系统使用那个XDMCP服务器,这么您可以通过搜索字符串dm的进程清单来确认它,如下所示:
- $ ps ax | grep dm
- 929 ? Ss 0:00 /usr/bin/kdm
- 962 tty7 Ss+ 0:19 /usr/bin/Xorg -br :0 vt7 -nolisten tcp -auth
- /var/lib/xdm/authdir/authfiles/A:0-pp4shb
- 30157 pts/3 S+ 0:00 grep --color=auto dm
该输出的第一行表明KDM正在运行,因而您须要该服务器的配置文件,便于让VNC才能使用XDMCP。大部份XDMCP程序均有遵守类似格式的配置文件。它们在方括弧中包含依据分段名称确认的分段,例如[xdmcp]。分段名称前面的行使用等号设置选项,例如enable=true。表1总结了在几个常见的LinuxXDMCP服务器上启用XDMCP所必须设置的配置文件名称、分段名称和选项。
表1.为各个XDMCP服务器的VNC启用XDMCP支持选项
您可能会在您的配置文件中找到XDMCP分段,或则它也可能完全不存在。假如存在,它可能显式地禁用XMDCP支持,包含注释掉的选项,或则为空。不管文件的原始状态是哪些,您会想要确保存在XDMCP分段,但是该支持是启用的。诸如linux系统vnc配置,看一下用于启用XDMCP的一个KDM配置:
- [Xdmcp]
- Enable=true
一些发行版启用额外的安全举措,对此您可能须要放宽限制。其中一个安全举措就是防火墙。防火墙脚本常常是特定于发行版的,因而请查询您的系统文档,了解怎样更改您的防火墙。您应该确保localhost才能访问端口177,但是您的VNC顾客端才能访问端口5900(或则您为VNC使用的任何其他端口)。
OpenSUSE使用一个额外的配置文件来控制个别类型的访问,包括XDMCP访问:/etc/sysconfig/displaymanager。在文本编辑器中打开该文件,并搜索下边一行:
- DISPLAYMANAGER_REMOTE_ACCESS="no"
将该选项改为"yes"。假如将其保留为"no",这么在您联接到VNC服务器时,则不会显示XDMCP服务器的登陆提示。该修改在大部份发行版上都不是必需启用的:只有openSUSE使用该文件。
重启XDMCP服务器
将XDMCP服务器配置为接受远程登陆以后,您必须重启它。在通过SysVinit文件启动X的发行版上,例如Debian和Gentoo,您可以传递给它restart选项:
- # /etc/init.d/gdm restart
倘若您的系统(例如Fedora和openSUSE)使用运行级别编号启动X,您就须要切换到一个文本模式运行级别(一般为3),之后切换回GUI运行级别(一般为5):
- # telinit 3
- # telinit 5
要注意,不管是哪一种方式就会关掉X,因而在继续之前确保保存了X会话中所有打开的作业。
测试和调试配置
此时,您应该还能使用VNC顾客端从一台远程计算机登陆了。诸如,大部份Linux发行版都提供一个名为vncviewer的命令;您可以输入:
- vncviewer remotename
...通过VNC登陆到remotename。当VNC经过配置且正常工作时,结果类似于图4所示。倘若您在不同端口上配置了多个VNC会话,您可以指定VNC会话编号,技巧就是将其作为主机名的一部份传递,如下所示:
- vncviewer remotename:3
...登陆到会话3(在端口5903上)。
图4.当配置为使用XDMCP时,VNC提供一个传统的Linux登陆提示
若果在执行该测试时您没有看见一个XDMCP登陆界面,这么就须要进行一些调试。要检测的内容包括:
VNC安全隐患
RFB不是一个安全合同;大多数VNC顾客端和服务器不对它们的数据进行加密。(尽管VNC对其自己的密码进行加密,然而这儿描述的方式不使用这种密码。)要对布署VMC的地点和方法非常慎重。倘若您希望在一个不安全的网路上使用VNC,您有三个选择:
实现本文所描述的VNC登陆会起码开启两个通向外界的端口(VNC端口和XDMCP端口)。您可能希望使用防火墙规则同时限制这两个端口,以最大限度地减少滥用的风险。注意,XDMCP端口(UDP端口177)仅须要向localhost开放,因而其防火墙规则会相当严格。
结束语
总的来讲,链接VNC和XDMCP是支持通过远程GUI登入到多用户Linux计算机的一个特别有用的技术。该方式比在跨平台环境中直接使用XDMCP或则在防火墙或NAT问题无法解决时使用XDMCP更有优势。它比多用户计算机上愈发常见的直接VNC方式更有益。倘若您使用该技巧,一定要考虑安全性问题。请打算好设置防火墙规则来限制不须要的外部访问,但是假如您的传输经由不可信赖的网路,请勿必使用加密功能。