2. 程序

本节详细介绍了使用 XDMCP 设置 X 终端的程序。先决条件是已安装(任何)Linux 发行版并正在运行 X。

2.1. 开始之前,一些背景知识

在开始之前,最好对它的工作原理有一个基本的了解。X 服务器通常从 X 显示管理器 (DM) 启动。在此X DM Wiki 页面中,它为您提供了对其工作原理的基本了解!(更多详细信息请参见下面的参考资料LDP HOWTO 页面

几乎所有的 Linux 发行版都为您提供了 xdm、kdm 和 gdm 作为您的选择。(本文档将使用 gdm 和 kdm 作为示例)。显示管理器为普通用户提供了一个良好且一致的界面(基于 X 的登录、启动窗口管理器、时钟等)。X 显示管理器管理 X 显示器的集合,这些显示器可能位于本地主机或远程服务器上。值得注意的是,Xsession 文件是运行您的环境的文件。

当 xdm 运行时,它以两种不同的方式提供显示管理。它可以管理在本地机器上运行并在 "Xservers" 中指定的 X 服务器,和/或它可以管理远程 X 服务器(通常是 X 终端),使用 "Xaccess" 文件中指定的 XDMCP。(请参阅 xdm 手册页)。

对于 kdm(KDE 桌面附带),它是 xdm 的替代品,并且以相同的方式配置,只是它的文件位于/etc/X11/kdm在 Caldera/SCO 中,/etc/kde/kdm在 Red Hat(和 Fedora Core)中,以及/usr/share/config/kdm,这是一个指向/etc/kde/kdm,在 Mandrake 中的符号链接。

gdm(Gnome 显示管理器)是众所周知的 xdm 的重新实现。gdm 具有与 xdm 和 kdm 类似的功能,gdm 是 Gnome 显示管理器,其配置文件位于/etc/X11/gdm/gdm.confgdm.conf文件包含变量集和 gdm 的许多选项,“Sessions”目录包含每个会话选项的脚本;每个脚本都调用/etc/X11/xdm/Xsession并带有适当的选项。gdm 具有与 xdm 和 kdm 类似的功能,但它是从头开始编写的,不包含任何原始的 XDM / X Consortium 代码。

RH 8.0 引入了名为 "Bluecurve" 的新图形界面。新界面的目标是 XP 的感觉和风格。在这种情况下,设置没有任何区别!

有关类似设置的其他良好参考资料可以在以下文档中找到

2.2. 安全提醒

不要相信 Linux(或 UNIX)比 MS Windows 更安全的操作系统的神话!如果用户配置工作做得不好或未维护安全更新,所有操作系统都容易受到黑客攻击!

您需要记住,X 和 XDMCP 本质上都是不安全的,这就是为什么许多发行版默认情况下都关闭了 XDMCP。如果您必须使用 XDMCP,请确保仅在受信任的网络中使用它,例如防火墙内的公司网络。切勿在没有防火墙保护的开放网络(或 Internet)环境中使用它!如果您在家中使用,请记住添加配备防火墙的路由器以进行保护。

测试网络安全性的一个好方法是使用 Gibson Research 的 ShieldsUp 进行测试。它是免费且易于使用的!

XDMCP 连接打开 UDP 端口;因此,它本身无法与 SSH 一起使用。目前,SSH1 和 SSH2 尚未实现安全地转发 UDP 通信。为了使用 SSH 保护连接,该技术称为 X11 TCP/IP 端口转发。查看 为什么进行端口转发? 站点和参考资料区域,以获取更多 HOW-TO 信息。如果您想尝试一下,我在下面添加了一个小节来向您展示它的工作原理。我将只给您介绍它的基本原理,更高级的运行方式将留给其他专家和/或 HOWTO。

2.3. 我使用的系统

我已经在以下发行版上测试了运行 GNOME (gdm) 以及 KDE (kdm) 的设置

SuSE 7.2(SuSE 现在是新的 Novell Linux)和 Slackware 8.0 的设置已由用户测试,感谢 Peter Van Eerten 和其他帮助测试本 HOW-TO 的用户。(我要感谢所有帮助我完成此项目的用户)。我尝试过的另一个是 Caldera eDesktop 2.4(现在归 SCO 所有),它与 RH 的设置类似,只是它使用 KDE。我还没有机会在其他 Linux 版本(如 Debian、Turbolinux、Gentoo 等)上进行测试。但是,设置应该类似,并且应该可以正常工作。如果您成功设置了除上面列出的发行版以外的其他发行版,请与我分享。我会将它们添加到本文档中。

我正在使用的 PC 硬件是一台 IBM PC 克隆机,运行 Intel Celeron 2.9 GHz,配备 1 GB 内存和 160 GB ATA-133 硬盘驱动器。我目前(2007 年)用于测试的最旧系统是使用 Intel Pentium II 450 MHz PC,配备 128 MB 内存,并且运行性能良好。(我在 2003 年在一台旧的 Pentium 100 MHz PC 上进行了测试,运行良好)。我在我的 Intel 克隆 M/B 中使用内置的快速以太网 NIC。在我的旧机器中,我使用 3Com 10/100 (3C509B) NIC,配备 ATAPI DVD-ROM 和 IOMEGA ZIP 驱动器。我还使用我的 Agere 无线 LAN 卡在我的 IBM T21 笔记本电脑上测试了连接。我还测试了我在家中的一个系统上的设置,该系统使用运行 Fedora Core 6 的 AMD 64 位 CPU。

2.4. 远程客户端部分

我在我的 PC 上使用 Hummingbird Exceed 10.0(Exceed 6.x 和 7.0 也工作正常),并在 Windows NT 4.0、Windows 2000 Pro、Windows XP 上进行了测试。我发现其他流行的选择是 X-Win32 和 X-ThinPro,但我没有机会进行测试。如果您碰巧有的话,还有许多开源应用程序以及商业应用程序可用。

2.5. 服务器准备

在 RH 7.x 和其他更新的发行版中,您需要设置 DNS 查找,以便某些网络功能正常工作(例如我们将用于测试设置的 telnet)。您可以使用 "netstat -r" 和/或 "arp -a" 命令来验证您的 DNS 设置或响应时间。如果您处于一个小型环境(如家庭或小型办公室),没有自己的 DNS,并且依赖于您的 ISP 的 DNS 服务器,则将您的 Linux 工作站或服务器名称的条目添加到 "/etc/resolv.conf" 文件中。如果您仅在实验室或家中使用它,则可以将所有工作站的主机名添加到 "/etc/host" 中的本地静态主机表中。您需要 root 权限才能更新命名信息。

要为 XDMCP 会话准备您的 X 服务器,您需要确保正确安装了以下内容

  1. 安装您的 Linux 操作系统。在我的情况下,我主要在我的实验室中使用 Fedora Core 6,在家里使用 Ubuntu 7.04。如果您计划使用 SSH 端口转发,则需要安装 OpenSSH 包或使用内核编译 SSH。此外,大多数发行版现在默认都安装了防火墙(除非您选择不安装)。如果您在设置 XDMCP 时未添加防火墙规则或暂时禁用防火墙,则可能会遇到问题。我将不在此处详细介绍防火墙规则,因为这不是本文档的重点。我将仅与您分享如何使其首先工作,您可以自己进行微调。

    要显示您的防火墙规则,在内核 2.2x 中,使用命令 ipchains -L 列出您的默认规则集。要临时禁用它,请使用命令 ipchains -F 刷新规则(不用担心,它将通过重新加载或重新启动来恢复)。对于内核 2.4x 及更高版本,请将命令 ipchains 替换为 iptables。要开始使用它,您可以尝试编辑 /etc/sysconfig/ipchains 文件,并注释掉此规则(这是来自用户的反馈。您可以自行测试)

    -A input -p upd -s 0/0 -d 0/0 0:1023 -j REJECT

    并插入以下两个规则以允许数据包通过端口 177

    -A input -p udp -s 0/0 -d 0/0 0:176 -j REJECT
    -A input -p udp -s 0/0 -d 0/0 178:1023 -j REJECT

    (注意:XDMCP 使用 TCP、UDP 端口 177 和 TCP 端口 6000 到 6005。在我们的设置中,xfs 服务器使用端口 7100)。

    您应该能够以类似的方式使用 iptables。(在参考资料区域或此设置示例中查看 iptables 参考资料)。

    有关更多防火墙详细信息,请查看 IP Masquerade HOWTO 页面。

    另一种简单的方法是添加仅接受来自您信任的工作站的特定 IP 地址的规则。请随意使用 iptables 命令进行实验。同样,我不会在此处介绍详细信息。我很幸运,因为我有公司的防火墙来保护我免受外界的侵害。

    如果您想使用 GUI 工具来配置使用 iptables 的防火墙,请尝试这个好工具:Firestarter

  2. 设置您的网络。要进行测试,您可以使用 pingftptelnet 命令来确定您是否正在联网。RH 7.x 及更高版本默认情况下未打开 telnet 守护程序(出于安全原因)。如果您希望使用它进行测试,请记住启用它。完成后您可以随时将其关闭(在 RH 中使用 ntsysv,或在 Ubuntu 和 Debian 中使用 rcconfsysvconfig,需要 root 权限)。另一件事是记住防火墙规则在那里。添加您自己的规则或暂时禁用它(如上所述)以使这些命令工作。

  3. 设置 X。不要设置高于远程用户显示器能够使用的分辨率。较新版本现在能够探测视频芯片组并为您确定这一点。一些较旧的 (X) 版本可能无法做到!通过键入 startxtelinit 5 来测试 X 服务器。确保 X 运行正常。

  4. 为将通过 X 终端访问的用户创建必要的用户帐户(和关联的组)。

2.6. 完成程序的步骤

虽然 X 可以使用本地字体,但在网络环境中最好使用 xfs 字体服务器。如果这是您在 Linux X 环境中想要的,您需要使用 X 字体服务器 (xfs) 或 XF86Config 和 XF86Config-4 配置文件中的硬编码字体路径来提供字体。如果您计划使用 xfs 字体服务器(在此处查看 xfs 优点)。xfs 服务器还可以减轻本地工作站的负担。如果您计划使用本地字体,则可以跳过步骤 1。

以下是我用于设置 X 服务器以接受 XDMCP 请求的步骤

  1. 在早期版本的 RH 和 Mandrake 中,修改/etc/rc.d/init.d/xfs并进行以下更改。更改所有行(这是字体服务器端口),如果端口未设置为 7100。

    daemon xfs -droppriv -daemon -port -1

    daemon xfs -droppriv -daemon -port 7100

    在某些新的发行版中,默认情况下,为了增强安全性,不再监听 TCP 端口!如果您想设置 X 字体服务器,则需要执行以下步骤

    更改/etc/rc.d/init.d/xfs(或某些发行版的 /etc/init.d/xfs)中的此行:

    daemon xfs -droppriv -daemon

    daemon xfs -droppriv -daemon -port 7100

    在 Ubuntu 7.04 桌面版本中,您需要下载并安装 xfs 包。然后修改/etc/init.d/xfs并更改以下行

    start-stop-daemon --start --quiet $SSD_START_ARGS -- -daemon \

    start-stop-daemon --start --quiet $SSD_START_ARGS -- -droppriv -daemon -port 7100 \

    然后,在/etc/X11/fs/config中,注释掉此行

    # don't listen to TCP ports by default for security reasons 
    #no-listen = tcp
          

    如果您更改或添加端口,请使用此命令重新启动您的 X 字体服务器(需要 root 权限)

    service xfs restart

    您不必使用端口 7100。您可以设置不同的端口,只要您首先仔细计划以确保端口号的使用没有冲突并相应地进行更改即可。最好在这样做之前咨询您的 Linux 管理员,以便他/她知道该端口已被占用!不同的 Linux 发行版可能会将 xfs 放在 /etc/rc.d 下的不同文件夹中。如果是这种情况,您可以搜索它。

  2. 如果您计划使用 XDM,请修改/etc/X11/xdm/xdm-config并进行以下更改。默认情况下(在大多数 Linux 发行版中),此行已设置,因此它不监听 XDMCP 连接。这是出于安全原因。对于使用 kdm 的 Caldera 和其他发行版,此文件位于/etc/X11/kdm。找到此行

    DisplayManager.requestPort:     0

    并将其注释掉为

    ! DisplayManager.requestPort:     0

    请记住,这不会影响 gdm。对于 gdm 设置,它在以下部分中。

  3. /etc/X11/xdm/Xaccess中,进行此更改。(这允许所有主机连接)。对于使用 kdm 的 Caldera,此文件位于/etc/X11/kdm。将安全性设置为 644 (chmod 644)

    #*    # any host can get a login window

    *     # any host can get a login window

    上面的设置处于广播模式,它将列出所有正在监听并愿意管理您的 X 连接的 X 服务器。如果您只想允许某些连接,请使用同一文件中的 CHOOSER 部分。示例可以在参考资料中找到。

  4. 如果您计划使用 GDM 作为默认设置,则 gdm 登录窗口的一个好处是它允许您在 KDE 和 GNOME 之间切换。对于 gdm,编辑/etc/X11/gdm/gdm.conf。这会激活 XDMCP,使其监听请求。对于 kdm(如果您在安装时选择 KDE 作为 DM),请编辑/usr/share/config/kdm/kdmrc对于 Mandrake 和/etc/kde/kdm/kdmrc对于 Red Hat 或/opt/kde2/share/config/kdm/kdmrc对于 Slackware 版本 (KDE2)。更改此行

    [xdmcp] 
    Enable=false (may shown as 0 in some distributions)

    Enable=true (or 1 in some distributions)

    确保 "Port=177" 在此块的末尾,即通过注释掉行 "#Port=177"。

    (作为 Ubuntu 用户的旁注,他们只关心易用性,这是您可以做的(只需打开 XDMCP 而无需 xfs)。从“系统”菜单中,转到“管理”,然后转到“登录窗口”。或者,您可以使用 “sudo gdmsetup” 命令)。单击“远程”选项卡,然后在“样式”中选择“与本地相同”。然后单击底部的“配置 XDMCP”按钮以验证设置。如果您在样式中选择“禁用远程登录”,它将禁用 XDMCP。其他设置在“安全”选项卡和底部的“配置 X 服务器...”按钮中,并在服务器中选择“选择器”。您必须重新启动 gdm 才能启用它!这样做既快速又简单,但是您会失去对正在触摸和更改哪些文件的感觉!易用性或可控性是您在此处的选择!)

  5. (对于 Ubuntu 和新的 Debian,请参见下面的注释)现在编辑/etc/inittab并更改以下行。此处的数字表示默认运行级别。对于 X,运行级别应为“5”。

    id:3:initdefault:

    id:5:initdefault:

    在 Slackware 中,X11 模式编号为“4”,而不是“5”。有关不同发行版的定义,请参阅此运行级别 wiki 页面

    这是从文本模式登录切换到使用显示管理器的图形模式。在更改此行之前,您可以使用 telinit 命令在修改该行之前进行测试。使用 telinit 3 设置为级别 3,或使用 telinit 5 设置为级别 5,图形模式(您可以在 telnet 到此服务器的第二台机器上发出此命令)。

    运行级别 2-5 在 Debian 和 Ubuntu 中是相同的。自 Ubuntu 6.10(以及未来的 Debian)以来,启动运行级别的方式已从 init 守护程序更改为 Upstart,任务和服务由此事件管理。每个运行级别都由系统中格式为/etc/rcx.d的文件定义,其中“x”表示。每个事件都由发出 telinit 3 命令触发(或更改)。

  6. 确保文件/etc/X11/xdm/Xservers的正确安全性设置为 444 (chmod 444)。

  7. 找到/etc/X11/xdm/Xsetup_0并将此文件 chmod 755

  8. 编辑xorg.conf文件,在/etc/X11文件夹中,并更改该行(对于旧版本,它是XF86ConfigXF86Config-4文件,用于 XFree86 4.x)

    FontPath    "unix/:-1"

    FontPath    "unix/:7100"

    如果您决定使用端口号而不是常用的 7100,请务必在 "/etc/rc.d/init.d/xfs"(或 "/etc/init.d/xfs")文件和此处都进行更改!

    为了节省您的时间和精力,我建议您在 xorg.conf(或 XF86Config 和/或 XF86Config-4)配置文件中添加 FontPath。如果您不确定有哪些字体可用,可以使用此命令进行检查(需要 root 权限)

    chkfontpath --list

    以下是一些示例字体供您参考。在编辑这些路径之前,请确保您拥有这些字体。

             FontPath  "/usr/X11R6/lib/X11/fonts/75dpi/"
             FontPath  "/usr/X11R6/lib/X11/fonts/misc/"
             FontPath  "/usr/X11R6/lib/X11/fonts/CID/"
             FontPath  "/usr/X11R6/lib/X11/fonts/Speedo/"
             FontPath  "/usr/X11R6/lib/X11/fonts/100dpi/"
    	 FontPath  "/usr/X11R6/lib/X11/fonts/Type1/"
         

    如果您没有 chkfontpath 命令并且您正在使用本地字体,则可以简单地编辑文件 "/etc/X11/fs/config"。找到以 "catalog=" 开头的行,并在列表末尾添加您的目录,以逗号分隔。一个例子是这样的

         catalogue = /usr/X11R6/lib/X11/fonts/misc:unscaled,
                     /usr/X11R6/lib/X11/fonts/100dpi:unscaled,
                     /usr/X11R6/lib/X11/fonts/100dpi,
                     /usr/X11R6/lib/X11/fonts/75dpi
         
  9. (您不必进行此更改。您可以保留默认设置,但这是我更喜欢的。如果您不确定,请保持原样。)将此行更改为结尾/etc/inittab:

    x:5:respawn:/usr/bin/gdm

    如果您决定不更改此行,那也没关系!这不是必需的步骤,而是一种个人偏好!在 Ubuntu 和较新的 Debian 发行版中,无需执行此操作。

您现在可以准备运行测试了。

另一个需要了解的事情(一些用户问过)是如何显示带有负载信息的 Willing to manage 消息。据我所知,这在 xdm 中可通过将以下内容添加到/etc/X11/xdm/xdm-config.

DisplayManager.willing:  su noboby -c /etc/X11/xdm/Xwilling
来实现,并且 XWilling 脚本必须存在。对于 gdm,将此行添加到/etc/X11/gdm/gdm.conf,在[security]部分
Willing=/etc/X11/gdm/Xwilling

Xwilling 脚本的示例在此处供您参考。添加此脚本与否是您的偏好。这不是此处所需的步骤!

2.7. 测试

要测试您的 XDMCP 和 X 服务器是否已准备好接受连接,请执行以下步骤。我发现使用 X 服务器和另一台机器进行测试更容易

  1. (重新)启动您的 X(在运行级别 5 或 Ubuntu 中的运行级别 2 中)。如果您不确定如何执行此操作,只需重新启动系统即可(但这实际上没有必要,如果您知道如何使用命令行重新启动它。这就是 Linux 的美妙之处,与 MS Windows 相比)。

  2. 如果您尚未修改防火墙规则,则需要使用 iptables -F(或 ipchains -F)临时禁用它。

  3. 确保出现图形登录页面。确保显示分辨率和鼠标工作正常。从控制台登录以查看本地访问是否正常。如果正常,请不要注销。

  4. 设置 Hummingbird Exceed(或其他 X 客户端软件)以查询此机器(使用 IP 地址或完全限定的 DNS 名称)或设置为使用 XDMCP-Broadcast 并尝试连接到 X 服务器。您应该看到 X 会话出现并且登录屏幕出现。