使用 VNC 实现多用户登录

帮助您的用户从任何地方访问一个多用户 Linux 系统

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

Roderick W. Smith, 顾问兼作家

Roderick W. Smith 是一位顾问兼作家,他撰写了十多本关于 UNIX 和 Linux 的书,包括 The Definitive Guide to Samba 3、Linux in a Windows World Linux Professional Institute Certification Study Guide。他还是 GPT fdisk 分区软件的作者。他目前定居罗得岛州的 Woonsocket 市。



2012 年 5 月 22 日

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 服务器之间的关系

这种设置在很多本地网络上都很有效,但它有缺陷。例如,该配置需要双向网络协议启动,而这是无法通过一些防火墙或网络地址转换 (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 服务器如何发送 X 服务器内容给客户端

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) 启动脚本,只需运行一次:

# /etc/init.d/xinetd start

配置 xinetd 以使它在计算机启动时自动运行,这需要对您的发行版启动脚本方法有一定了解。通常,您可以使用一个实用工具,比如 chkconfig(在 Fedora、openSUSE 和相关发行版中使用),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 选项,其中大多数选项应当保持原样。您需要调整的那些选项包括:

  • service您可以在多个端口上运行 VNC,其中每个端口都有不同的选项,但是如果您这么做,您应当针对每一个端口在清单 1 中的第一行为 VNC 提供一个不同的服务名称。
  • server您应当更改该条目以指向您 VNC 服务器的主要二进制文件,通常名为 Xvnc。
  • server_args几乎可以肯定您会更改其中的一些选项,如前所述。
  • portVNC 使用编号为 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 的进程清单来确认它,如下所示:

$ 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 总结了在几个常见的 Linux XDMCP 服务器上启用 XDMCP 所必须设置的配置文件名称、分段名称和选项。

表 1. 为各个 XDMCP 服务器的 VNC 启用 XDMCP 支持选项
XMDCP 服务器配置文件名称分段名称选项
GDM/etc/X11/gdm/custom.conf[xdmcp]enable=true
KDM/usr/share/kde4/config/kdm/kdmrc[Xdmcp]Enable=true
LightDM/etc/lightdm/lightdm.conf[XDMCPServer]enabled=true

您可能会在您的配置文件中找到 XDMCP 分段,或者它也可能完全不存在。如果存在,它可能显式地禁用 XMDCP 支持,包含注释掉的选项,或者为空。不管文件的原始状态是什么,您会想要确保存在 XDMCP 分段,并且该支持是启用的。例如,看一下用于启用 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 服务器配置为接受远程登录之后,您必须重启它。在通过 SysV init 文件启动 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 登录提示
VNC 中一个传统 Linux 登录提示的屏幕截图

如果在执行该测试时您没有看到一个 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 方法更有益。如果您使用该方法,一定要考虑安全性问题。请准备好设置防火墙规则来限制不需要的外部访问,并且如果您的传输经由不可信赖的网络,请务必使用加密功能。

参考资料

学习

获得产品和技术

  • TightVNC 在许多发行版中均有提供,您可以从 TightVNC 网站获取该产品。
  • TigerVNC 是许多发行版中均提供的 TightVNC 的一个衍生产品,您可以在 TigerVNC 网站获取该产品。它的引人注目之处在于,它包括支持加密连接的扩展。
  • RealVNC 是最初 VNC 开发人员创建的一家公司。它同时提供免费和商业版本的 VNC 实现。
  • 获取 IBM 产品评估试用版软件(可通过下载获得),并使用针对开发人员的软件改进您的下一个开放源码开发项目。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Open source, Linux
ArticleID=817162
ArticleTitle=使用 VNC 实现多用户登录
publish-date=05222012