使用 VNC 实现多用户登陆

Virtual Network Computing (VNC) 是一种提供计算机远程访问的流行工具。常规的 VNC 配置是针对单用户工做台而进行优化的,可登陆到 VNC 端口直接访问单一用户的桌面。然而,这一配置在多用户计算机上使用不太合适。幸运的是,咱们有一个替代方案。经过将 VNC 连接到一台 Linux 计算机的普通 X Display Manager Control Protocol (XDMCP) 服务器,访问 VNC 端口就可以让用户提供其用户名和密码,进而可以使单个 VNC 服务器实例处理多个用户登陆。安全

VNC 和 X 服务器架构服务器

Linux使用 X Window System(简称 X)做为其图形用户接口 (GUI)。X 从多个方面来看是一个不寻常的 GUI,一个方面是它自己支持网络。X 服务器 其实是一个网络服务器程序。网络服务器程序提供给客户端程序对本地资源的访问,对于 X 服务器也是如此。奇异之处在于,对于 X 服务器来讲 “本地资源” 是用户使用的显示器、键盘和鼠标。在大部分常见配置中,X 客户端程序做为服务器运行在同一台计算机上。所以,LibreOffice、GNU Image Manipulation Program (GIMP) 或其余程序是使用 X 的网络协议接受用户输入并在同一台计算机上为用户显示输出的 X 客户端。网络

不过在经过网络使用 X 时,用户位于 X 服务器计算机,而 X 的客户端是用户但愿在另外一台计算机上运行的程序。这一配置须要第二个网络协议来发起链接。这第二个协议能够是 telnet、Secure Shell (SSH) 或 X Display Manager Control Protocol (XDMCP)。用于这一登陆协议的服务器在 X 客户端计算机上运行,而远程登陆客户端在 X 服务器计算机上运行。远程登陆服务器启动 X 客户端,后者转而联系 X 服务器。图 1 描述了这一关系。虚线箭头表示会话启动。(对于 XDMCP,XDMCP 客户端构建在 X 服务器程序中。)架构


图 1. X 远程访问须要在两台计算机上装有一个客户端和一个服务器
图表显示 X 客户端与 X 服务器之间的关系
socket

这种设置在不少本地网络上都颇有效,但它有缺陷。例如,该配置须要双向网络协议启动,而这是没法经过一些防火墙或网络地址转换 (NAT) 路由器实现的。(SSH 能够利用通道进行 X 会话,消除这一需求。)此外,尽管 X 服务器可用于大部分平台,但它们一般不安装在运行 Windows® 的计算机上。出于这些和其余缘由,许多站点倾向于使用另外一个协议 Remote Frame Buffer (RFB),该协议在 Virtual Network Computing (VNC) 系列程序中均有实现。tcp

VNC 是一个跨平台的工具,可从任何类型的客户端提供对 Linux、UNIX®、Mac OS X、Windows 和其余系统的远程访问。使用 VNC,用户能够从客户端计算机访问一台远程服务器计算机。在 Linux 上,VNC 服务器要么将本地 X 服务器的界面内容镜像到远程计算机,要么包含其自身的 X 服务器,该服务器可独立于管理本地界面的服务器运行。结果相似于 图 2 所示。一样,虚线箭头表示会话启动。这一配置消除了反向进行网络链接的需求,并且因为 VNC 客户端和服务器存在于如此多的操做系统中,用户能够利用单一客户端程序访问任何服务器。编辑器


图 2. 一个 VNC 服务器包括一个可与本地 X 客户端程序通讯的 X 服务器
图表显示 VNC 服务器如何发送 X 服务器内容给客户端
ide

VNC 的缺点在于,RFB 身份验证基于密码,而不须要用户名。所以,每一个用户必须启动一个独立的 VNC 服务器会话,并经过指定正确的端口号链接到 VNC 实例。这一要求在单用户系统上可能还能接受,可是在多用户计算机上则极其不合适。工具

要解决这一问题,您能够将两种方法衔接起来。您能够从新配置您的本地 XDMCP 服务器以帮助集成在 VNC 中的 X 服务器提供缺乏的多用户身份验证(最终的配置相似于 图 3 所示)。虚线箭头表示会话启动。如今,当远程 VNC 用户联系 VNC 服务器计算机时,他们可以输入其用户名和密码来访问其本身唯一的 VNC 会话,所以计算机能够处理尽量多的用户。测试


图 3. 将 XDMCP 添加到 VNC 配置可以提升灵活性
图表显示将 XDMCP 添加到 VNC 配置如何可以提升灵活性

配置 VNC 服务器

有多种启动 VNC 的方法存在,包括使用脚本、使用桌面工具将 VNC 连接到您的桌面环境,以及使用 xinetd 监听 VNC 链接。最后这一种方法就是这里要介绍,由于它可以让您启动 VNC,以便它可使用您的 XDMCP 服务器。在详细介绍如何配置 VNC 以经过xinetd 来启动以前,您必须选择一个 VNC 服务器。

选择 VNC 服务器

有若干 VNC 服务器程序可用。(参考资料 提供了其中一些服务器程序的连接。)一些更加流行的服务器程序包括 TightVNC、TigerVNC 和 RealVNC。本文以 TightVNC 为例。遗憾的是,配置细节随服务器以及发行版的不一样而不一样,所以您可能须要针对您的软件来调整这里所提供的使用说明。

安装 xinetd

许多发行版默认安装 xinetd 超级服务器,但一些发行版没有安装此服务器。因为这里所描述的方法使用的是 xinetd,因此若是没有安装的话,您应当安装 xinetd。在大部分发行版上,您可使用软件包系统安装 xinetd,好比在基于 Debian 的发行版上使用 apt-get install xinetd,或者在 openSUSE 上使用 zypper install xinetd。

您可能还须要配置 xinetd 来进行运行。您一般可使用其 System V (SysV) 启动脚本,只需运行一次:

 

  
  
  
  
  1. # /etc/init.d/xinetd start 

 

配置 xinetd 以使它在计算机启动时自动运行,这须要对您的发行版启动脚本方法有必定了解。一般,您可使用一个实用工具,好比 chkconfig(在 Fedora、openSUSE 和相关发行版中使用),update-rc.d(在 Debian 和相关发行版中使用)或者 rc-update(在 Gentoo 中使用),来执行这项工做,以下所示:

 

  
  
  
  
  1. # chkconfig xinetd on  

  2. # update-rc.d xinetd enable  

  3. # 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 配置示例

  
  
  
  
  1. service vnc  

  2. {   

  3. disable     = no

  4. socket_type = stream

  5. protocol    = tcp

  6. wait        = no

  7. user        = nobody

  8. server      = /usr/bin/Xvnc  

  9. server_args = -inetd -once -query localhost -geometry 1024x768 -depth 16  

  10. type        = UNLISTED

  11. port        = 5900

  12.     } 

该条目设置多个 xinetd 选项,其中大多数选项应当保持原样。您须要调整的那些选项包括:

  • service。您能够在多个端口上运行 VNC,其中每一个端口都有不一样的选项,可是若是您这么作,您应当针对每个端口在清单 1 中的第一行为 VNC 提供一个不一样的服务名称。 

  • server。您应当更改该条目以指向您 VNC 服务器的主要二进制文件,一般名为 Xvnc。 

  • server_args。几乎能够确定您会更改其中的一些选项,如前所述。 

  • port。VNC 使用编号为 5900 及以上的端口。您能够在具备不一样选项的不一样端口上运行服务器。若是这么作,您应当分配给每一个实例其本身的端口号。 

xinetd 配置最棘手的部分是设置服务器参数。您可使用 清单 1 中的参数做为模型,不过您可能想要更改其中一些参数:

  • -query localhost。该选项告诉 VNC X 服务器查询 localhost 系统以便进行 XDMCP 身份验证。若是您想使用一台计算机做为中继来访问另外一台计算机上的程序,您能够更改它。 

  • -geometry 1024x768。您可使用该选项设置 VNC 会话的虚拟分辨率。注意,该分辨率不须要类同于在服务器计算机上运行的常规 X 服务器的分辨率。您可能想要建立以不一样分辨率运行的多个条目,以便让用户使用其本地系统便于应用的任何分辨率登陆到 VNC 服务器。 

  • -depth 16。该选项设置颜色深度。较低的值可以产生较快的显示更新,可是高色彩桌面环境会因颜色工件而受到折损。有效的值介于 2 到 32 之间。 

还有许多其余选项,一些随 VNC 服务器的不一样而不一样。查询您的 VNC 服务器的文档,了解更多内容。 

配置 XDMCP 服务器

大部分 Linux 发行版配置其 XDMCP 服务,主要是为了管理本地显示。为了提供远程访问,您必须从新配置您的 XDMCP 服务器,以接受在同一台计算机上运行的 VNC 服务器的请求。具体细节因 XDMCP 服务器而异。Linux 上最经常使用的三个 XDMCP 服务器是 GNOME Display Manager (GDM)、Light Display Manager (LightDM) 和 KDE Display Manager (KDM)。其余 XDMCP 服务器,好比 XDM,须要接受不一样于此处所描述的调整。无论怎么,在从新配置您的 XDMCP 服务器以后,您须要重启它。

编辑 XDMCP 配置文件

若是您不肯定您的系统使用哪一个 XDMCP 服务器,那么您能够经过搜索字符串 dm 的进程清单来确认它,以下所示:

  
  
  
  
  1. $ ps ax | grep dm  

  2.   929 ?        Ss     0:00 /usr/bin/kdm  

  3.   962 tty7     Ss+    0:19 /usr/bin/Xorg -br :0 vt7 -nolisten tcp -auth \  

  4.                            /var/lib/xdm/authdir/authfiles/A:0-pp4shb  

  5.    30157 pts/3    S+     0:00 grep --color=auto dm 

该输出的第一行代表 KDM 正在运行,所以您须要该服务器的配置文件,以便让 VNC 可以使用 XDMCP。大部分 XDMCP 程序均有遵循相似格式的配置文件。它们在方括号中包含根据分段名称确认的分段,好比 [xdmcp]。分段名称后面的行使用等号设置选项,好比enable=true。表 1 总结了在几个常见的 Linux XDMCP 服务器上启用 XDMCP 所必须设置的配置文件名称、分段名称和选项。

表 1. 为各个 XDMCP 服务器的 VNC 启用 XDMCP 支持选项


您可能会在您的配置文件中找到 XDMCP 分段,或者它也可能彻底不存在。若是存在,它可能显式地禁用 XMDCP 支持,包含注释掉的选项,或者为空。无论文件的原始状态是什么,您会想要确保存在 XDMCP 分段,而且该支持是启用的。例如,看一下用于启用 XDMCP 的一个 KDM 配置:

  
  
  
  
  1. [Xdmcp]  

  2. Enable=true

 

一些发行版启用额外的安全措施,对此您可能须要放宽限制。其中一个安全措施就是防火墙。防火墙脚本每每是特定于发行版的,所以请查询您的系统文档,了解如何修改您的防火墙。您应当确保 localhost 可以访问端口 177,并且您的 VNC 客户端可以访问端口 5900(或者您为 VNC 使用的任何其余端口)。

OpenSUSE 使用一个额外的配置文件来控制某些类型的访问,包括 XDMCP 访问:/etc/sysconfig/displaymanager。在文本编辑器中打开该文件,并搜索下面一行:

  
  
  
  
  1. DISPLAYMANAGER_REMOTE_ACCESS="no"


 将该选项改成 "yes"。若是将其保留为 "no",那么在您链接到 VNC 服务器时,则不会显示 XDMCP 服务器的登陆提示。该更改在大部分发行版上都不是 必需启用的:只有 openSUSE 使用该文件。

重启 XDMCP 服务器

将 XDMCP 服务器配置为接受远程登陆以后,您必须重启它。在经过 SysV init 文件启动 X 的发行版上,好比 Debian 和 Gentoo,您能够传递给它 restart 选项:

  
  
  
  
  1. # /etc/init.d/gdm restart 

 

若是您的系统(好比 Fedora 和 openSUSE)使用运行级别编号启动 X,您就须要切换到一个文本模式运行级别(一般为 3),而后切换回 GUI 运行级别(一般为 5):

  
  
  
  
  1. # telinit 3  

  2. # telinit 5  


 要注意,无论是哪种方法都会关闭 X,所以在继续以前确保保存了 X 会话中全部打开的做业。

测试和调试配置

此时,您应当可以使用 VNC 客户端从一台远程计算机登陆了。例如,大部分 Linux 发行版都提供一个名为 vncviewer 的命令;您能够输入:

  
  
  
  
  1. vncviewer remotename  

. . . 经过 VNC 登陆到 remotename。当 VNC 通过配置且正常工做时,结果相似于 图 4 所示。若是您在不一样端口上配置了多个 VNC 会话,您能够指定 VNC 会话编号,方法就是将其做为主机名的一部分传递,以下所示:

 

 

      
      
      
      
  1. vncviewer remotename:3 

 

. . . 登陆到会话 3(在端口 5903 上)。

图 4. 当配置为使用 XDMCP 时,VNC 提供一个传统的 Linux 登陆提示
VNC 中一个传统 Linux 登陆提示的屏幕截图

若是在执行该测试时您没有看到一个 XDMCP 登陆界面,那么就须要进行一些调试。要检查的内容包括:

  • 若是 vncviewer 报告链接被拒绝,这极可能意味着超级服务器没有在 VNC 服务器计算机上获得适当的配置。检查您的 xinetd配置,尝试重启超级服务器。也有多是防火墙阻止对 VNC 服务器计算机的访问。 

  • 若是 VNC 客户端启动并链接到了服务器,可是您所看到的只是一个灰色屏幕以及一个可随处移动的光标,问题可能出在 XDMCP 服务器配置上。检查以前描述的设置,并从新启动 XDMCP 服务器。 

  • 一个通用的故障排除方法就是检查您的日志文件。您可能须要搜索 /var/log 中的全部日志文件,查看是否引用到 xinetd、您的 XDMCP 服务器和您的 VNC 服务器。 

VNC 安全隐患

RFB 不是一个安全协议;大多数 VNC 客户端和服务器不对它们的数据进行加密。(虽然 VNC 对其本身的密码进行加密,可是这里描述的方法不使用这些密码。)要对部署 VMC 的地点和方式十分谨慎。若是您但愿在一个不安全的网络上使用 VNC,您有三个选择:

  • 使用一个虚拟专用网络 (×××)。 

  • 经过 SSH 通道传输协议。 

  • 使用一个支持加密的 VNC 变体,好比 TigerVNC,它启用传输层安全加密。 

实现本文所描述的 VNC 登陆会至少开启两个通向外界的端口(VNC 端口和 XDMCP 端口)。您可能但愿使用防火墙规则同时限制这两个端口,以最大限度地下降滥用的风险。注意,XDMCP 端口(UDP 端口 177)仅须要向 localhost 开放,所以其防火墙规则会至关严格。

结束语

总的来说,连接 VNC 和 XDMCP 是支持经过远程 GUI 登陆到多用户 Linux 计算机的一个很是有用的技术。该方法比在跨平台环境中直接使用 XDMCP 或者在防火墙或 NAT 问题难以解决时使用 XDMCP 更有优点。它比多用户计算机上更加常见的直接 VNC 方法更有益。若是您使用该方法,必定要考虑安全性问题。请准备好设置防火墙规则来限制不须要的外部访问,而且若是您的传输经由不可信赖的网络,请务必使用加密功能。

出自:http://os.51cto.com/art/201206/342189.htm

相关文章
相关标签/搜索