使用 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 远程访问需要在两台计算机上装有一个客户端和一个服务器
使用 VNC 实现多用户登录_第1张图片 
 

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

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


图 2. 一个 VNC 服务器包括一个可与本地 X 客户端程序通信的 X 服务器
使用 VNC 实现多用户登录_第2张图片 
 

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

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


图 3. 将 XDMCP 添加到 VNC 配置能够提高灵活性

使用 VNC 实现多用户登录_第3张图片

配置 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 支持选项

使用 VNC 实现多用户登录_第4张图片
您可能会在您的配置文件中找到 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 实现多用户登录_第5张图片 
 

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

  • 如果 vncviewer 报告连接被拒绝,这很可能意味着超级服务器没有在 VNC 服务器计算机上得到适当的配置。检查您的 xinetd配置,尝试重启超级服务器。也有可能是防火墙阻止对 VNC 服务器计算机的访问。
  • 如果 VNC 客户端启动并连接到了服务器,但是您所看到的只是一个灰色屏幕以及一个可随处移动的光标,问题可能出在 XDMCP 服务器配置上。检查之前描述的设置,并重新启动 XDMCP 服务器。
  • 一个通用的故障排除方法就是检查您的日志文件。您可能需要搜索 /var/log 中的所有日志文件,查看是否引用到 xinetd、您的 XDMCP 服务器和您的 VNC 服务器。

VNC 安全隐患

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

  • 使用一个虚拟专用网络 (VPN)。
  • 通过 SSH 通道传输协议。
  • 使用一个支持加密的 VNC 变体,比如 TigerVNC,它启用传输层安全加密。

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

结束语

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



你可能感兴趣的:(linux)