使用 VNC 實現(xiàn)多用戶登錄
Virtual Network Computing (VNC) 是一種提供計算機遠程訪問的流行工具。常規(guī)的 VNC 配置是針對單用戶工作臺而進行優(yōu)化的,可登錄到 VNC 端口直接訪問單一用戶的桌面。然而,這一配置在多用戶計算機上使用不太合適。幸運的是,我們有一個替代方案。通過將 VNC 鏈接到一臺 Linux 計算機的普通 X Display Manager Control Protocol (XDMCP) 服務器,訪問 VNC 端口就能夠讓用戶提供其用戶名和密碼,進而能夠使單個 VNC 服務器實例處理多個用戶登錄。
VNC 和 X 服務器架構
Linux使用 X Window System(簡稱 X)作為其圖形用戶接口 (GUI)。X 從多個方面來看是一個不尋常的 GUI,一個方面是它本身支持網(wǎng)絡。X 服務器 實際上是一個網(wǎng)絡服務器程序。網(wǎng)絡服務器程序提供給客戶端程序對本地資源的訪問,對于 X 服務器也是如此。奇異之處在于,對于 X 服務器來說 “本地資源” 是用戶使用的顯示器、鍵盤和鼠標。在大部分常見配置中,X 客戶端程序作為服務器運行在同一臺計算機上。因此,LibreOffice、GNU Image Manipulation Program (GIMP) 或其他程序是使用 X 的網(wǎng)絡協(xié)議接受用戶輸入并在同一臺計算機上為用戶顯示輸出的 X 客戶端。
不過在通過網(wǎng)絡使用 X 時,用戶位于 X 服務器計算機,而 X 的客戶端是用戶希望在另一臺計算機上運行的程序。這一配置需要第二個網(wǎng)絡協(xié)議來發(fā)起連接。這第二個協(xié)議可以是 telnet、Secure Shell (SSH) 或 X Display Manager Control Protocol (XDMCP)。用于這一登錄協(xié)議的服務器在 X 客戶端計算機上運行,而遠程登錄客戶端在 X 服務器計算機上運行。遠程登錄服務器啟動 X 客戶端,后者轉而聯(lián)系 X 服務器。圖 1 描述了這一關系。虛線箭頭表示會話啟動。(對于 XDMCP,XDMCP 客戶端構建在 X 服務器程序中。)
圖 1. X 遠程訪問需要在兩臺計算機上裝有一個客戶端和一個服務器
這種設置在很多本地網(wǎng)絡上都很有效,但它有缺陷。例如,該配置需要雙向網(wǎng)絡協(xié)議啟動,而這是無法通過一些防火墻或網(wǎng)絡地址轉換 (NAT) 路由器實現(xiàn)的。(SSH 可以利用通道進行 X 會話,消除這一需求。)此外,盡管 X 服務器可用于大部分平臺,但它們通常不安裝在運行 Windows® 的計算機上。出于這些和其他原因,許多站點傾向于使用另一個協(xié)議 Remote Frame Buffer (RFB),該協(xié)議在 Virtual Network Computing (VNC) 系列程序中均有實現(xiàn)。
VNC 是一個跨平臺的工具,可從任何類型的客戶端提供對 Linux、UNIX®、Mac OS X、Windows 和其他系統(tǒng)的遠程訪問。使用 VNC,用戶可以從客戶端計算機訪問一臺遠程服務器計算機。在 Linux 上,VNC 服務器要么將本地 X 服務器的界面內容鏡像到遠程計算機,要么包含其自身的 X 服務器,該服務器可獨立于管理本地界面的服務器運行。結果類似于 圖 2 所示。同樣,虛線箭頭表示會話啟動。這一配置消除了反向進行網(wǎng)絡連接的需求,而且由于 VNC 客戶端和服務器存在于如此多的操作系統(tǒng)中,用戶可以利用單一客戶端程序訪問任何服務器。
圖 2. 一個 VNC 服務器包括一個可與本地 X 客戶端程序通信的 X 服務器
VNC 的缺點在于,RFB 身份驗證基于密碼,而不需要用戶名。因此,每個用戶必須啟動一個獨立的 VNC 服務器會話,并通過指定正確的端口號連接到 VNC 實例。這一要求在單用戶系統(tǒng)上可能還能接受,但是在多用戶計算機上則極其不合適。
要解決這一問題,您可以將兩種方法銜接起來。您可以重新配置您的本地 XDMCP 服務器以幫助集成在 VNC 中的 X 服務器提供缺少的多用戶身份驗證(最終的配置類似于 圖 3 所示)。虛線箭頭表示會話啟動。現(xiàn)在,當遠程 VNC 用戶聯(lián)系 VNC 服務器計算機時,他們能夠輸入其用戶名和密碼來訪問其自己惟一的 VNC 會話,因此計算機可以處理盡可能多的用戶。
圖 3. 將 XDMCP 添加到 VNC 配置能夠提高靈活性
#p#
配置 VNC 服務器
有多種啟動 VNC 的方法存在,包括使用腳本、使用桌面工具將 VNC 鏈接到您的桌面環(huán)境,以及使用 xinetd 監(jiān)聽 VNC 連接。最后這一種方法就是這里要介紹,因為它能夠讓您啟動 VNC,以便它可以使用您的 XDMCP 服務器。在詳細介紹如何配置 VNC 以通過xinetd 來啟動之前,您必須選擇一個 VNC 服務器。
選擇 VNC 服務器
有若干 VNC 服務器程序可用。(參考資料 提供了其中一些服務器程序的鏈接。)一些更加流行的服務器程序包括 TightVNC、TigerVNC 和 RealVNC。本文以 TightVNC 為例。遺憾的是,配置細節(jié)隨服務器以及發(fā)行版的不同而不同,因此您可能需要針對您的軟件來調整這里所提供的使用說明。
安裝 xinetd
許多發(fā)行版默認安裝 xinetd 超級服務器,但一些發(fā)行版沒有安裝此服務器。由于這里所描述的方法使用的是 xinetd,所以如果沒有安裝的話,您應當安裝 xinetd。在大部分發(fā)行版上,您可以使用軟件包系統(tǒng)安裝 xinetd,比如在基于 Debian 的發(fā)行版上使用 apt-get install xinetd,或者在 openSUSE 上使用 zypper install xinetd。
您可能還需要配置 xinetd 來進行運行。您通常可以使用其 System V (SysV) 啟動腳本,只需運行一次:
- # /etc/init.d/xinetd start
配置 xinetd 以使它在計算機啟動時自動運行,這需要對您的發(fā)行版啟動腳本方法有一定了解。通常,您可以使用一個實用工具,比如 chkconfig(在 Fedora、openSUSE 和相關發(fā)行版中使用),update-rc.d(在 Debian 和相關發(fā)行版中使用)或者 rc-update(在 Gentoo 中使用),來執(zhí)行這項工作,如下所示:
- # chkconfig xinetd on
- # update-rc.d xinetd enable
- # rc-update add xinetd default
僅輸入這些命令中的其中一個,或者找到您發(fā)行版相對應的命令。
注意,如果沒有配置任何服務的話,xinetd 可能拒絕啟動。因此,在您還未配置 xinetd 來管理您的 VNC 服務器之前,您可能要推遲啟動。
配置 xinetd
應當由 xinetd 管理的服務器會將配置文件放在 /etc/xinetd.d 目錄中。因此,要配置 xinetd 來處理 VNC,您應當創(chuàng)建或編輯一個名稱類似 /etc/xinetd.d/vnc 的文件。(在某些發(fā)行版上,比如 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 選項,其中大多數(shù)選項應當保持原樣。您需要調整的那些選項包括:
- service。您可以在多個端口上運行 VNC,其中每個端口都有不同的選項,但是如果您這么做,您應當針對每一個端口在清單 1 中的第一行為 VNC 提供一個不同的服務名稱。
- server。您應當更改該條目以指向您 VNC 服務器的主要二進制文件,通常名為 Xvnc。
- server_args。幾乎可以肯定您會更改其中的一些選項,如前所述。
- port。VNC 使用編號為 5900 及以上的端口。您可以在具有不同選項的不同端口上運行服務器。如果這么做,您應當分配給每個實例其自己的端口號。
xinetd 配置最棘手的部分是設置服務器參數(shù)。您可以使用 清單 1 中的參數(shù)作為模型,不過您可能想要更改其中一些參數(shù):
- -query localhost。該選項告訴 VNC X 服務器查詢 localhost 系統(tǒng)以便進行 XDMCP 身份驗證。如果您想使用一臺計算機作為中繼來訪問另一臺計算機上的程序,您可以更改它。
- -geometry 1024x768。您可以使用該選項設置 VNC 會話的虛擬分辨率。注意,該分辨率不需要類同于在服務器計算機上運行的常規(guī) X 服務器的分辨率。您可能想要創(chuàng)建以不同分辨率運行的多個條目,以便讓用戶使用其本地系統(tǒng)便于應用的任何分辨率登錄到 VNC 服務器。
- -depth 16。該選項設置顏色深度。較低的值能夠產(chǎn)生較快的顯示更新,但是高色彩桌面環(huán)境會因顏色工件而受到折損。有效的值介于 2 到 32 之間。
還有許多其他選項,一些隨 VNC 服務器的不同而不同。查詢您的 VNC 服務器的文檔,了解更多內容。#p#
配置 XDMCP 服務器
大部分 Linux 發(fā)行版配置其 XDMCP 服務,主要是為了管理本地顯示。為了提供遠程訪問,您必須重新配置您的 XDMCP 服務器,以接受在同一臺計算機上運行的 VNC 服務器的請求。具體細節(jié)因 XDMCP 服務器而異。Linux 上最常用的三個 XDMCP 服務器是 GNOME Display Manager (GDM)、Light Display Manager (LightDM) 和 KDE Display Manager (KDM)。其他 XDMCP 服務器,比如 XDM,需要接受不同于此處所描述的調整。不管怎么,在重新配置您的 XDMCP 服務器之后,您需要重啟它。
編輯 XDMCP 配置文件
如果您不確定您的系統(tǒng)使用哪個 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 程序均有遵循類似格式的配置文件。它們在方括號中包含根據(jù)分段名稱確認的分段,比如 [xdmcp]。分段名稱后面的行使用等號設置選項,比如enable=true。表 1 總結了在幾個常見的 Linux XDMCP 服務器上啟用 XDMCP 所必須設置的配置文件名稱、分段名稱和選項。
表 1. 為各個 XDMCP 服務器的 VNC 啟用 XDMCP 支持選項
您可能會在您的配置文件中找到 XDMCP 分段,或者它也可能完全不存在。如果存在,它可能顯式地禁用 XMDCP 支持,包含注釋掉的選項,或者為空。不管文件的原始狀態(tài)是什么,您會想要確保存在 XDMCP 分段,并且該支持是啟用的。例如,看一下用于啟用 XDMCP 的一個 KDM 配置:
- [Xdmcp]
- Enable=true
一些發(fā)行版啟用額外的安全措施,對此您可能需要放寬限制。其中一個安全措施就是防火墻。防火墻腳本往往是特定于發(fā)行版的,因此請查詢您的系統(tǒng)文檔,了解如何修改您的防火墻。您應當確保 localhost 能夠訪問端口 177,而且您的 VNC 客戶端能夠訪問端口 5900(或者您為 VNC 使用的任何其他端口)。
OpenSUSE 使用一個額外的配置文件來控制某些類型的訪問,包括 XDMCP 訪問:/etc/sysconfig/displaymanager。在文本編輯器中打開該文件,并搜索下面一行:
- DISPLAYMANAGER_REMOTE_ACCESS="no"
將該選項改為 "yes"。如果將其保留為 "no",那么在您連接到 VNC 服務器時,則不會顯示 XDMCP 服務器的登錄提示。該更改在大部分發(fā)行版上都不是 必需啟用的:只有 openSUSE 使用該文件。
將 XDMCP 服務器配置為接受遠程登錄之后,您必須重啟它。在通過 SysV init 文件啟動 X 的發(fā)行版上,比如 Debian 和 Gentoo,您可以傳遞給它 restart 選項:
- # /etc/init.d/gdm restart
如果您的系統(tǒng)(比如 Fedora 和 openSUSE)使用運行級別編號啟動 X,您就需要切換到一個文本模式運行級別(通常為 3),然后切換回 GUI 運行級別(通常為 5):
- # telinit 3
- # telinit 5
要注意,不管是哪一種方法都會關閉 X,因此在繼續(xù)之前確保保存了 X 會話中所有打開的作業(yè)。
此時,您應當能夠使用 VNC 客戶端從一臺遠程計算機登錄了。例如,大部分 Linux 發(fā)行版都提供一個名為 vncviewer 的命令;您可以輸入:
- vncviewer remotename
. . . 通過 VNC 登錄到 remotename。當 VNC 經(jīng)過配置且正常工作時,結果類似于 圖 4 所示。如果您在不同端口上配置了多個 VNC 會話,您可以指定 VNC 會話編號,方法就是將其作為主機名的一部分傳遞,如下所示:
|
. . . 登錄到會話 3(在端口 5903 上)。
圖 4. 當配置為使用 XDMCP 時,VNC 提供一個傳統(tǒng)的 Linux 登錄提示
如果在執(zhí)行該測試時您沒有看到一個 XDMCP 登錄界面,那么就需要進行一些調試。要檢查的內容包括:
- 如果 vncviewer 報告連接被拒絕,這很可能意味著超級服務器沒有在 VNC 服務器計算機上得到適當?shù)呐渲谩z查您的 xinetd配置,嘗試重啟超級服務器。也有可能是防火墻阻止對 VNC 服務器計算機的訪問。
- 如果 VNC 客戶端啟動并連接到了服務器,但是您所看到的只是一個灰色屏幕以及一個可隨處移動的光標,問題可能出在 XDMCP 服務器配置上。檢查之前描述的設置,并重新啟動 XDMCP 服務器。
- 一個通用的故障排除方法就是檢查您的日志文件。您可能需要搜索 /var/log 中的所有日志文件,查看是否引用到 xinetd、您的 XDMCP 服務器和您的 VNC 服務器。#p#
VNC 安全隱患
RFB 不是一個安全協(xié)議;大多數(shù) VNC 客戶端和服務器不對它們的數(shù)據(jù)進行加密。(雖然 VNC 對其自己的密碼進行加密,但是這里描述的方法不使用這些密碼。)要對部署 VMC 的地點和方式十分謹慎。如果您希望在一個不安全的網(wǎng)絡上使用 VNC,您有三個選擇:
- 使用一個虛擬專用網(wǎng)絡 (VPN)。
- 通過 SSH 通道傳輸協(xié)議。
- 使用一個支持加密的 VNC 變體,比如 TigerVNC,它啟用傳輸層安全加密。
實現(xiàn)本文所描述的 VNC 登錄會至少開啟兩個通向外界的端口(VNC 端口和 XDMCP 端口)。您可能希望使用防火墻規(guī)則同時限制這兩個端口,以最大限度地降低濫用的風險。注意,XDMCP 端口(UDP 端口 177)僅需要向 localhost 開放,因此其防火墻規(guī)則會相當嚴格。
結束語
總的來講,鏈接 VNC 和 XDMCP 是支持通過遠程 GUI 登錄到多用戶 Linux 計算機的一個非常有用的技術。該方法比在跨平臺環(huán)境中直接使用 XDMCP 或者在防火墻或 NAT 問題難以解決時使用 XDMCP 更有優(yōu)勢。它比多用戶計算機上更加常見的直接 VNC 方法更有益。如果您使用該方法,一定要考慮安全性問題。請準備好設置防火墻規(guī)則來限制不需要的外部訪問,并且如果您的傳輸經(jīng)由不可信賴的網(wǎng)絡,請務必使用加密功能。