运行远程应用程序
使用 GNU/Linux 系统的一个优势是将显示系统与底层操作系统分离。Linux 桌面以 X Window 系统为核心,这是一种软件架构,可提供显示组件的分层。每个组件都提供自己的一组显示功能。这些功能包括更换窗口管理器、直接驱动硬件、提供替代桌面环境,甚至远程显示部分或全部桌面的能力。
大多数 Linux 用户都熟悉窗口管理器和视频显示硬件工具,因为桌面范例长期以来都假定用户坐在运行桌面应用程序的系统前面。远程显示虽然对于 X Window 系统来说并不新鲜,但讨论得较少,因为最终用户被认为只有一个正在使用的系统。但是,最终用户的需求变得更加复杂,例如,媒体和 Web 服务器等应用程序提供了充分的理由来远程管理多台 PC,即使在单个家庭中也是如此。
在本文中,我讨论了 Linux 用户可用于在远程系统上运行 Linux 应用程序并在本地显示的各种方法。我涵盖了基本配置问题,讨论了局限性和优势,考虑了安全影响,并对比了使用每种方法的原因。本文中讨论的所有工具都应可从任何流行的 Linux 发行版获得,尽管软件包名称可能有所不同。示例和讨论侧重于在 Fedora 上运行的基于 GNOME 的解决方案,尽管 KDE 用户也存在类似的功能和应用程序。本文未专门讨论在 Linux 系统上显示 Mac 或 Windows 应用程序;但是,关于 VNC 的部分非常适用。
从非常高的层面来看,GNU/Linux 显示系统可以看作是三个不同的组件(图 1)。在最低层是 Linux 内核和 X.org 显示服务器及其关联库(通常统称为 X11)。显示服务器和内核协同工作以提供显示硬件的管理,库为更高级别的软件提供了使用它们的便捷方式。
桌面环境位于此堆栈的中间。这包括 GNOME、KDE 和 Xfce,这三个最流行的桌面环境。为了支持这些环境,使用了应用程序库,例如 GTK+ 和 Qt,以及桌面应用程序使用的各种其他通用库。
应用程序位于桌面环境之上。这些是用户运行以观看电影、听音乐、与朋友和同事交流以及从互联网购买产品的实际工具。
应用程序的远程显示由基础架构和桌面层中发现的功能处理。可以在桌面和 X11 环境中运行的应用程序被告知远程显示,但将如何完成的细节留给堆栈的底层。
用户可以通过三种方法在远程系统上运行应用程序并在本地显示它——即在他们所坐的屏幕上显示。第一种方法涉及使用 X 显示管理器控制协议 (XDMCP)。此协议是 X11 规范的一部分,并在 Linux 系统上使用 GNOME 桌面管理器 (GDM) 或在使用 KDE 时使用 KDE 显示管理器 (KDM) 实现,这两者都是 X 显示管理器 (XDM) 的替代品。此方法侧重于运行单个应用程序,尽管有些应用程序可以提供完整的远程桌面。
第二种方法依赖于 OpenSSH 对 X11 协议的支持。它也侧重于运行单个应用程序,并且通常更容易配置和使用。
最后一种方法基于虚拟网络计算 (VNC) 机制,该机制与操作系统无关,更适合完整的桌面共享。
在 X11 术语中,服务器是管理显示硬件的东西,而客户端是需要服务器来显示窗口的应用程序。这通常会使人们感到困惑,因为它与人们对术语客户端和服务器的通常理解是相反的,因为现在服务器是您面前的计算机,而客户端是远程计算机。
Linux 桌面上的大多数应用程序都提供 -display 命令行选项。此选项等效于设置 DISPLAY 环境变量,它告诉 X11 客户端(应用程序)要显示在哪个 X 服务器上。默认设置是在本地服务器上显示,引用为 :0.0。远程服务器可以通过在此值前加上主机名(或 IP 地址)来指定,例如 galileo:0.0。对 galileo:0.0 的引用仅在主机 galileo 至少运行一个 X 服务器实例时才有效。
-display 选项的使用与 X 服务器上 XDMCP 的配置相关联。XDMCP 是在本地显示器上显示远程应用程序的旧式方法。大多数老式 UNIX 和 X11 用户都熟悉它的使用,尽管配置问题已随着 Linux 桌面的发展而演变。
在 GNOME 系统上,XDMCP 由 GDM 控制。GNOME 用户从图形登录屏幕熟悉 GDM。该屏幕实际上只是 GDM 的一部分,与我们的讨论无关。GDM 还控制 XDMCP 用于 X 会话的用法,也称为图形登录。图形登录启动一个新的 X 服务器,并带有各种选项。默认情况下,GDM 不允许来自远程客户端应用程序的 XDMCP 连接到 X 服务器。要启用它,请编辑文件 /etc/gdm/custom.conf,使其如下所示
# GDM configuration storage [xdmcp] Enable=true [chooser] [security] DisallowTCP=false [debug]
[xdmcp] 部分有一个选项 Enable,设置为 true 时,允许 XDMCP 连接。但是,还需要告知 GDM 允许 TCP 连接,以便远程应用程序在与 X 服务器通信时实际使用 XDMCP。[security] 部分选项 DisallowTCP 必须设置为 false 才能禁用拒绝 TCP 连接的功能。
请注意,XDMCP 是更高级别的协议(客户端应用程序和 X 服务器将通信的方式),而 TCP 是更低级别的协议,为了我们的目的,可以将其定义为通信流经的网络端口。
配置完成后,重新启动 GDM。您可以通过将运行状态更改为 3,然后再更改回 5 来执行此操作,建议在它们之间短暂暂停。请注意,如果您在终端/shell 窗口中执行第一个命令,窗口将消失,因为此命令会杀死 X 服务器。您将被放入虚拟控制台/终端,此时,您可能必须登录才能执行第二个命令
sudo init 3 sudo init 5
现在本地 X 服务器已配置为允许远程应用程序连接到它。还需要一个额外的步骤来指定哪些主机可以访问本地 X 服务器。有两种方法可以做到这一点。一种是编辑 /etc/hosts.allow 和/或 /etc/hosts.deny 文件。一种更简单的方法是在登录到本地系统后运行 xhosts 命令
xhost +<hostname-or-ip> xhost -<hostname-or-ip> xhost +
第一个命令允许特定主机在本地显示,第二个命令拒绝主机。第三种方法允许任何主机在本地显示。此选项应仅在受信任的网络上使用,例如您家防火墙后面的网络。xhost 设置仅适用于当前的登录会话。
现在,打开一个终端窗口,登录到远程系统(最好使用 SSH,但如果必须使用 Telnet),然后启动另一个终端,并将显示选项设置为本地 X 服务器
xterm -display galileo:0.0
此处启动的 xterm 在远程系统上运行,但在本地 X 服务器(您面前的计算机上)上显示。您可以以相同的方式启动其他应用程序,每个应用程序都作为本地桌面上的普通窗口出现。这样,远程应用程序与本地桌面无缝混合。如果由于某种原因您的 shell 提示符不包含提示符中的主机名,您可能应该设置它,以便您知道每个 xterm 都在哪个系统上运行。
GDM 随 GNOME 一起提供,因此只要您安装了 GNOME,您就可以使用此远程应用程序显示方法。对于 KDE,您通常会使用 KDM,但此处未涵盖其配置。
-display 选项允许单个应用程序远程显示,但整个桌面呢?可以使用 Xnest 或 Xephyr X 服务器通过 XDMCP 远程启动图形登录。这些服务器就像本地显示器上的应用程序窗口一样,但连接到远程显示管理器 (GDM) 以提供图形登录。GNOME 不包含这些服务器,并且在大多数 Linux 发行版上,它们可能默认未安装。但是,如果您快速搜索发行版的软件存储库,您应该会找到类似于以下 Fedora 特定软件包的软件包:xorg-x11-server-Xephyr 和 xorg-x11-server-Xnest。
安装后,可以手动运行服务器以连接到远程系统
Xnest :10 -query <host-with-gdm-configured> -geometry 1024x768 Xephyr -query <host-with-gdm-configured> -screen 1024x768 :1
对两者的实验表明,Xephyr(图 2)是两者中更现代且更积极开发的,更稳定。不幸的是,注销会话阻止了进一步的连接。这可能是因为 GDM 配置为仅允许来自远程系统的单个会话,并且可以通过进一步研究 GDM 配置来修复。但是,在这些测试中,唯一的解决方案是在远程主机上重新启动 GDM。
通过 GDM 的 XDMCP 充当远程应用程序在本地计算机上显示的管道。这意味着它不控制远程桌面。事实上,远程系统上根本不需要有人登录,尽管 GDM 需要正在运行。因为它不远程控制现有的 X 会话,所以可以在本地显示器上具有不同的显示尺寸。例如,如果远程系统仅提供 800x600 的显示分辨率,则仍然可以使用 Xephyr 和 GDM/XDMCP 管理的连接在本地显示器上以 1024x768 显示。这也意味着您可以为远程和本地显示的会话使用不同的桌面环境(GNOME、KDE、Xfce 或其他)。
XDMCP 优点和缺点
优点
使用原生 X11 功能。
通过 GDM 轻松配置。
方便在防火墙后使用。
单独的 X 服务器会话。
缺点
不支持视频或音频。
不安全的协议(XDMCP 下的明文密码;在商业环境中被认为是安全问题)。
原生协议意味着它与非 Linux 原生桌面不兼容。
到目前为止,三种远程应用程序显示方法中最简单的方法是使用 SSH。SSH 是安全外壳,是一种使用加密通信连接到远程系统的工具。Linux 系统使用 SSH 的开源 OpenSSH 实现。此软件包提供 X11Forwarding,这是服务器和客户端(SSH 服务器和客户端)中的可配置选项,最终用户可以使用 -X 命令行选项来使用它。
SSH 使用客户端/服务器架构。服务器端是远程系统,客户端是本地系统(我们通常认为的客户端/服务器配置,与 X 相反)。必须配置远程服务器以允许 X11 转发。这可以通过在 /etc/ssh/sshd_config 中启用 X11Forwarding 选项来完成
... AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE AcceptEnv LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE AcceptEnv LC_MEASUREMENT LC_IDENTIFICATION LC_ALL LANGUAGE #AllowAgentForwarding yes #AllowTcpForwarding yes #GatewayPorts no X11Forwarding yes ...
也可以在此文件中按用户启用 X11 转发,方法是将 X11Forwarding 选项放置在用户规范之后
... Match User bilbobaggins X11Forwarding no ...
这些更改在 SSH 服务器重新启动后才会生效。如果您的发行版提供此功能,则 service 命令是执行此操作的最简单方法
sudo service sshd restart
客户端配置位于 /etc/ssh/ssh_config 中,需要启用 Forward11Trusted 选项。默认情况下,Fedora 系统上已启用此选项,尽管其他发行版可能需要手动启用该选项
... ForwardX11Trusted yes ...
请注意,SSH 客户端和服务器配置文件的位置可能因不同的 Linux 发行版而异。请查阅您的发行版的 OpenSSH 软件包以查找配置文件。
一旦服务器端和客户端都配置了 SSH,用户可以通过将 -X 选项添加到 SSH 登录来使用 X11Forwarding。-X 选项将所需的 DISPLAY 信息传递给远程应用程序,这些应用程序会自动在本地显示器上打开。请注意,使用 SSH X11Forwarding 意味着远程应用程序不应使用 -display 选项,也不应设置 DISPLAY 环境变量。SSH 将自动处理所有这些。
SSH X11Forwarding 不需要远程计算机运行 GDM 或 X 服务器。这意味着远程系统可以在无头模式下运行,这意味着它们根本没有显示器。相反,用户使用以下方式远程登录ssh -X,在远程系统上运行图形应用程序,并在本地显示它们。与使用基于 GDM 的远程应用程序显示相比,这大大减轻了远程系统的负载。
尽管在大多数情况下,您需要在远程系统上安装 X 服务器,因为大多数 X 应用程序(位于远程系统上)都需要关联的 X 库,并且大多数软件包管理器最终会安装整个 X 服务器来提供它们
ssh -X <remote host> # login to remote host succeeds... xterm -geometry 80x50
X11Forwarding 优点和缺点
优点
非常安全——与 SSH 一样安全。
配置简单。
使用简单。
适用于端口转发。
不需要远程 GDM 或 X 服务器运行。
在防火墙的另一侧将远程应用程序显示到本地显示器的最安全方法。
单个连接的多个应用程序。
可以与视频一起使用。
缺点
与 VNC 和 GDM 相比,可能非常慢。
音频不起作用。
X11 协议是带宽杀手。
XDMCP 是旧式方法,SSH 是安全方法。但是,最好集成到桌面中的方法是虚拟网络计算 (VNC)。VNC 是一个基于 Olivetti 研究实验室的远程帧缓冲协议的系统,任何人都可以实现它。此协议不基于 X11,而是位于基础架构层中的较低级别。这意味着 VNC 软件可以与任何桌面系统一起使用,包括 Linux、Windows 和 Mac OS/X。使用 VNC,您可以在本地显示器上并排显示远程 Linux 桌面和远程 Mac 桌面。
VNC 本质上是一个协议定义——它描述了某物应该如何工作。Linux 系统有许多实现可用。客户端被称为查看器应用程序。TigerVNC 是一种开源实现,它是流行的 TightVNC 实现的分支。TigerVNC 提供服务器和客户端查看器,旨在帮助增加项目的开发活动。
GNOME 用户会发现 Vino 是默认的 VNC 服务器,而 Vinagre 是功能最全的客户端查看器,并且它们与桌面紧密集成,这意味着 GNOME 提供了菜单选项来配置和启用客户端 (Vinagre) 和服务器 (Vino)。
与 XDMCP/GDM 和 SSH 不同,VNC 不用于启动远程应用程序以在本地系统上显示。相反,它用于查看和/或获取对远程桌面的控制权。因此,远程桌面必须已经运行。此外,如果远程系统在无头模式下运行,VNC 将无用,尽管 Xvnc 也可以消除此限制。Xvnc 提供了一个远程“虚拟”X 服务器,VNC 客户端可以连接到该服务器。由于远程桌面是虚拟的,因此 Xvnc 也可用于启用备用远程桌面和/或多个远程桌面,可能具有不同的大小。
必须在远程系统上启用 VNC 服务器,客户端查看器才能连接到它。服务器是从 GNOME 使用系统→首选项→远程桌面菜单选项配置的。配置对话框需要启用桌面共享、配置安全约束和设置通知方法(图 3)。
共享是指如何访问桌面。通过允许远程用户查看桌面并在需要时允许他们控制桌面来启用共享。在后一种情况下,启用服务器的桌面用户将无法再使用桌面,而远程用户控制桌面。为了管理您家本地网络上的系统,应将服务器配置为允许其他用户控制桌面。
在“安全”下,家庭使用的唯一必需选项是指定密码。此密码未针对 Vino 或 TigerVNC 加密,因此此保护在防火墙保护的本地网络之外不是很有帮助。如果设置了确认每次连接的选项,则每次您使用 VNC 客户端查看器连接到该计算机时,您还必须走到该计算机以允许连接。对于家庭使用,不应设置此选项。
通知是个人偏好。因为 VNC 的想法(至少对于我们这里的目的而言)是服务器位于您不想在前面的计算机上,所以通知几乎没有用处。但是,当连接处于活动状态时显示图标很有帮助,以防您忘记何时一台计算机正在控制您尝试使用的计算机。
在客户端,GNOME Vinagre VNC 客户端查看器从应用程序→互联网→远程桌面查看器启动。Vinagre 客户端看起来像任何其他桌面应用程序(图 4),带有菜单栏和明显的“退出”选项(文件→退出)。这与例如 Xephyr 显示远程桌面形成对比。Vinagre 还允许打开与多个远程服务器的连接,每个远程桌面连接都通过选项卡式文件夹访问(图 5)。这使得 VNC 的使用非常方便且易于理解,因为它使用了常用的桌面应用程序小部件范例。
使用 VNC 的一种巧妙方法是将本地键盘和鼠标连接到远程桌面。这模拟了多显示器配置,其中两个显示器充当单个屏幕。使用 x2vnc,本地计算机充当第一个显示器,远程桌面充当第二个显示器。将鼠标从本地显示器的右边缘移开会将其移动到远程桌面的左边缘。这是一种使用笔记本电脑控制连接到电视的 MythTV 客户端的巧妙方法,而无需处理红外遥控器或红外键盘/鼠标组合。例如
x2vnc <remote host> -east (or -west, -north, -south)
在上面,-east 选项配置远程桌面使其表现得好像位于本地桌面的右侧,而 -west 则反转此设置。还有各种其他选项可用于改进此配置的使用。
VNC 扩展提供了各种形式的压缩和安全性。这些扩展必须在通信的两端都得到支持。如果服务器支持这些扩展但客户端不支持,则 VNC 仍将在两者之间运行,但没有这些扩展。
VNC 优点和缺点
优点
在 GNOME 下配置非常容易,尤其是在本地网络(防火墙后)中。
可以使用密码保护。
显示整个桌面——事实上,它实际上控制着远程桌面。
可以将单个键盘/鼠标链接到多台计算机。
缺点
在单个窗口中显示整个桌面,而不仅仅是单个应用程序。
不支持音频或视频播放。
使用多个端口可能需要首先设置 VPN 才能通过互联网使用。
默认情况下不安全。
远程桌面必须正在运行——登录会话必须处于活动状态。
从带宽的角度来看,如果仅在本地显示单个远程应用程序,则使用 SSH 可能提供这三种选项的最佳性能。基于 GDM 的连接的性能可能大致相似,具体取决于 SSH 连接中可用的压缩以及 GDM 中可能配置的任何压缩。
如果引入充分压缩帧缓冲区数据的扩展,VNC 有可能成为三者中最快的。由于 VNC 基于平铺架构,其中帧缓冲区内存的矩形在更新后重新发送,因此任何改进平铺传输的压缩都将对性能产生严重影响。但是,在撰写本文时,尚未使用此类扩展。
XDMCP 使用 UDP 端口 177,X 服务器使用 TCP 端口范围从 6000 + 显示编号。XDMCP 也容易受到 DoS 攻击。GDM 具有一些配置选项来解决此问题,但 XDMCP 的使用仍应被认为是不安全的。因此,GDM 和 XDMCP 应限制在防火墙后使用,而不应跨互联网使用。
SSH 连接在设计上是安全的(如果使用得当)。由于内置加密,没有理由不能跨互联网使用 SSH X11Forwarding。请注意,通过 SSH 使用 X11 协议可能会占用大量带宽,因此,应仅使用 SSH 在本地显示来自远程系统的少量应用程序。
只要远程服务器的防火墙将端口 5900 转发到该服务器,VNC 就可以跨互联网使用。VNC 默认情况下不包含安全扩展,因此本质上是不安全的。各种服务器实现都提供了安全扩展,但 Vino 没有。使用 Vino 作为服务器通过互联网使用 VNC 应仅通过 VPN 或 SSH 连接完成。
这些选项都不支持播放媒体文件,例如电影或音乐。我提到可以远程管理媒体服务器,我坚持这一点。这些系统的管理——启动和停止服务器、配置它们等等——可以使用这些方法中的任何一种轻松完成。但是,利用这些服务器提供的媒体最好留给从本地系统连接到远程服务器的流媒体播放器。
对于需要管理位于配置良好的防火墙后面的本地网络上的远程系统的家庭用户,VNC 提供了最完整且易于使用的选项。需要连接到远程系统的家庭办公室用户可能会发现 SSH 是更好的选择(正如本文作者所做的那样)。GDM/XDMCP 是最不受欢迎的解决方案,因为对于单个应用程序而言,SSH 更快且可以说更易于使用,而 VNC 为访问远程桌面提供了更易于使用的解决方案。尽管如此,如果您的需求包括在远程系统上启动新会话,则 GDM/XDMCP 是唯一选择,因为 SSH 和 VNC 都不支持这种类型的用途。
资源
TigerVNC: tigervnc.org
Vino: www.gnome.org/~markmc/remote-desktop-2.html
Vinagre: projects.gnome.org/vinagre
x2vnc: fredrik.hubbe.net/x2vnc.html
Michael J. Hammel 是科罗拉多州科罗拉多斯普林斯市 Colorado Engineering, Inc. (CEI) 的首席软件工程师,拥有 20 多年的软件开发和管理经验。他为众多在线和印刷杂志撰写了 100 多篇文章,并且是关于 The GIMP(首屈一指的开源图形编辑软件包)的三本书的作者。