使用 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 遠程訪問須要在兩臺計算機上裝有一個客戶端和一個服務器
圖表顯示 X 客戶端與 X 服務器之間的關係
socket

這種設置在不少本地網絡上都頗有效,但它有缺陷。例如,該配置須要雙向網絡協議啓動,而這是沒法經過一些防火牆或網絡地址轉換 (NAT) 路由器實現的。(SSH 能夠利用通道進行 X 會話,消除這一需求。)此外,儘管 X 服務器可用於大部分平臺,但它們一般不安裝在運行 Windows® 的計算機上。出於這些和其餘緣由,許多站點傾向於使用另外一個協議 Remote Frame Buffer (RFB),該協議在 Virtual Network Computing (VNC) 系列程序中均有實現。tcp

VNC 是一個跨平臺的工具,可從任何類型的客戶端提供對 Linux、UNIX®、Mac OS X、Windows 和其餘系統的遠程訪問。使用 VNC,用戶能夠從客戶端計算機訪問一臺遠程服務器計算機。在 Linux 上,VNC 服務器要麼將本地 X 服務器的界面內容鏡像到遠程計算機,要麼包含其自身的 X 服務器,該服務器可獨立於管理本地界面的服務器運行。結果相似於 圖 2 所示。一樣,虛線箭頭表示會話啓動。這一配置消除了反向進行網絡鏈接的需求,並且因爲 VNC 客戶端和服務器存在於如此多的操做系統中,用戶能夠利用單一客戶端程序訪問任何服務器。編輯器


圖 2. 一個 VNC 服務器包括一個可與本地 X 客戶端程序通訊的 X 服務器
圖表顯示 VNC 服務器如何發送 X 服務器內容給客戶端
ide

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) 啓動腳本,只需運行一次:

 

  
  
  
  
  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 支持選項


您可能會在您的配置文件中找到 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 中一個傳統 Linux 登陸提示的屏幕截圖

若是在執行該測試時您沒有看到一個 XDMCP 登陸界面,那麼就須要進行一些調試。要檢查的內容包括:

  • 若是 vncviewer 報告鏈接被拒絕,這極可能意味着超級服務器沒有在 VNC 服務器計算機上獲得適當的配置。檢查您的 xinetd配置,嘗試重啓超級服務器。也有多是防火牆阻止對 VNC 服務器計算機的訪問。 

  • 若是 VNC 客戶端啓動並鏈接到了服務器,可是您所看到的只是一個灰色屏幕以及一個可隨處移動的光標,問題可能出在 XDMCP 服務器配置上。檢查以前描述的設置,並從新啓動 XDMCP 服務器。 

  • 一個通用的故障排除方法就是檢查您的日誌文件。您可能須要搜索 /var/log 中的全部日誌文件,查看是否引用到 xinetd、您的 XDMCP 服務器和您的 VNC 服務器。 

VNC 安全隱患

RFB 不是一個安全協議;大多數 VNC 客戶端和服務器不對它們的數據進行加密。(雖然 VNC 對其本身的密碼進行加密,可是這裏描述的方法不使用這些密碼。)要對部署 VMC 的地點和方式十分謹慎。若是您但願在一個不安全的網絡上使用 VNC,您有三個選擇:

  • 使用一個虛擬專用網絡 (×××)。 

  • 經過 SSH 通道傳輸協議。 

  • 使用一個支持加密的 VNC 變體,好比 TigerVNC,它啓用傳輸層安全加密。 

實現本文所描述的 VNC 登陸會至少開啓兩個通向外界的端口(VNC 端口和 XDMCP 端口)。您可能但願使用防火牆規則同時限制這兩個端口,以最大限度地下降濫用的風險。注意,XDMCP 端口(UDP 端口 177)僅須要向 localhost 開放,所以其防火牆規則會至關嚴格。

結束語

總的來說,連接 VNC 和 XDMCP 是支持經過遠程 GUI 登陸到多用戶 Linux 計算機的一個很是有用的技術。該方法比在跨平臺環境中直接使用 XDMCP 或者在防火牆或 NAT 問題難以解決時使用 XDMCP 更有優點。它比多用戶計算機上更加常見的直接 VNC 方法更有益。若是您使用該方法,必定要考慮安全性問題。請準備好設置防火牆規則來限制不須要的外部訪問,而且若是您的傳輸經由不可信賴的網絡,請務必使用加密功能。

出自:http://os.51cto.com/art/201206/342189.htm

相關文章
相關標籤/搜索