VNC(虛擬網絡計算)

VNC 是用來顯示在另一台電腦上運行的 X 視窗工作階段。有異於一個遠端的 X 連線,xserver 是在遠端的電腦上運行,而不是在本地的工作台上。你的工作台(Linux 或 Windows)只是顯示遠端機器所顯示(真實或虛擬)的東西。

設定一個 vnc 伺服器有數個不同方法。這份教學文檔示範如何利用 CentOS 所提供的 vncserver 服務來設定 VNC。

1. 安裝所需的套件

伺服器的套件名叫 vnc-server。請執行 rpm -q vnc-server 這個指令。

它的輸出應該是 package vnc-server is not installed 或類似 vnc-server-4.0-11.el4

假如伺服器未被安裝,請用這個指令來安裝它:yum install vnc-server

客戶端的程式是 vnc。假若 rpm -q vnc 表示它未被安裝,你可以用 yum install vnc 這個指令來安裝它。

請安裝一個視窗管理員來取得一個功能齊全的圖像式桌面。舉個例說,你可以用 yum groupinstall "GNOME Desktop Environment" 這個指令來安裝 Gnome 桌面及所需的套件。其它受歡迎的桌面環境包括 KDE 及 XFCE-4.4。XFCE 比 Gnome 及 KDE 更為輕型,而且已收錄在 extras 軟件庫內。

不過,如果你一切從簡,又或者只在測試,你只須令命 yum 安裝一個簡單的 XTERM 客戶端:yum install xterm

<!> 如果你採用 CentOS 6,該指令是 yum groupinstall Desktop

<!> 如果你採用 CentOS 5,yum groupinstall "GNOME Desktop Environment" 可能會投訴 libgaim.so.0 被遺漏了。這是一個已知的錯誤。詳情請參閱 CentOS-5 常見問題集

<!> 如果你採用 CentOS 6,伺服器的名稱是 tigervnc-server 而不是 vnc-server

2. 設定未加密的 VNC

我們會設置 VNC 給 3 位用戶。他們分別是 larry、moe 及 curly。

你須要執行下列步驟來設定你的 VNC 伺服器:

  1. 建立 VNC 用戶的帳號。
  2. 編輯伺服器的設定。
  3. 設定用戶的 VNC 密碼。
  4. 確定 vncserver 能乾淨俐落地啟動及停止。
  5. 建立及自訂 xstartup 腳本。
  6. 修改 iptables。
  7. 啟動 VNC 服務。
  8. 測試每位 VNC 用戶。
  9. 加入選擇性的改動。

2.1. 建立 VNC 用戶的帳號

root 的身份:

$ su -
# useradd larry
# useradd moe
# useradd curly
# passwd larry
# passwd moe
# passwd curly

2.2. 編輯伺服器的設定

編輯 /etc/sysconfig/vncservers,並在檔案底部加入以下內容。

VNCSERVERS="1:larry 2:moe 3:curly"
VNCSERVERARGS[1]="-geometry 640x480"
VNCSERVERARGS[2]="-geometry 640x480"
VNCSERVERARGS[3]="-geometry 800x600"

Larry 及 Moe 將會有 640 乘 480 的畫面。Curly 將會有 800 乘 600 的畫面。

註:此步驟沒有放錯次序,而是刻意安排在此處,目的是要讓你能立刻偵測到下一個步驟有否出錯。

2.3. 設定用戶的 VNC 密碼

逐一切換身份為上述用戶,然後按照以下方法執行 vncpasswd。這樣做會為每位用戶建立 ~/.vnc 目錄。

[~]# su - larry
[~]$ vncpasswd
[~]$ cd .vnc
[.vnc]$ ls
passwd
[.vnc]$ exit
[~]#

2.4. 確定 vncserver 能乾淨俐落地啟動及停止

我們會透過以 root 的身份啟動及停止 vncserver 來建立 xstartup 腳本。我們亦會設定 vncserver 為自動開啟的服務。

# /sbin/service vncserver start
# /sbin/service vncserver stop
# /sbin/chkconfig vncserver on

註:要是你省略了上述以每位用戶登入及建立 ~/.vnc/ 子目錄的步驟,此測試將會失敗。

2.5. 建立 xstartup 腳本(CentOS 6 下可選擇略過此步驟)

登入每個戶口並編輯 xstartup 腳本。就以 Larry 為例,首先登入成為 larry

[~]$ cd .vnc
[.vnc] ls
mymachine.localnet:1.log  passwd  xstartup

編輯每位用戶的 ~/.vnc/xstartup。原有的內容是:

# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
twm &

這加入下面這行來確定 xterm 會經常存在。假若你希望在 VNC 內執行用戶的正常視窗管理員,請按指示除去兩行的註釋符號。請注意,在一個解像度及色彩深度都可能被降低的 VNC 視窗內,整個桌面將會頗狹窄,及看起來怪怪的。如果你不除去那兩行的註釋,你的 VNC 視窗將會有班點底色。

# 加入下面這行來確定 xterm 會經常存在。
( while true ; do xterm ; done ) &
# Uncomment the following two lines for normal desktop:
unset SESSION_MANAGER
exec /etc/X11/xinit/xinitrc
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
twm &

2.6. 修改 iptables

你必須修改 /etc/sysconfig/ 內的 iptables 規則來開放 VNC 連接埠。要是你擁有 ipv6 的設定,它們也同樣須要被修改:

[root@xen-221 sysconfig]# cat iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth1 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp -m multiport --dports 5901:5903,6001:6003 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
[root@xen-221 sysconfig]#

…… 接著請重新啟動 iptables:

# /sbin/service iptables restart

2.7. 啟動 VNC 伺服器

以 root 身份啟動 vncserver。

# service vncserver start

2.8. 測試每位 VNC 用戶

2.8.1. 以支援 java 的瀏覽器進行測試

讓我們假設我們機器擁有 192.168.0.10 這個 IP 位址。連線到每個戶口的 URL 將會是:

Larry 是 http://192.168.0.10:5801
Moe   是 http://192.168.0.10:5802
Curly 是 http://192.168.0.10:5803

連線到 http://192.168.0.10:5801 。一個 java 程式的視窗將會彈出,表示你要連線到機器的 1 號埠。擊按 [ok] 按鈕。輸入 larry 的 VNC 密碼,然後一個 640x480 視窗將會透過 larry 預設的視窗管理員被開啟出來。iptables 防火牆必須開放以上這些連接埠 5801、5802 及 5803 給客戶端的 IP 位址或子網絡。

2.8.2. 以 vnc 用戶端進行測試

Larry 用: vncviewer 192.168.0.10:1
  Moe 用: vncviewer 192.168.0.10:2
Curly 用: vncviewer 192.168.0.10:3

要以 vncviewer 測試 larry,執行 vncviewer 192.168.0.10:1。一個驗證的對話方塊將會跳出來,你可輸入 larry 的 VNC 密碼。通過驗證後,一個採用 larry 的預設視窗管理員的 640x480 視窗將會打開。vncviewer 這個客戶端會連線到 590X 這個埠,當中 X 值等於 1、2、3 分別對應 larry、moe 及 curly,因此防火牆必須開放這些連接埠給客戶端的 IP 位址或子網絡。

假如你的用戶名稱不是 larry,你可用以下方法「切換」 vncviewer 的用戶: {{{ export USER=larry ; vncviewer 192.168.0.10:1 }}} 這樣做等同把 larry 這個用戶名稱傳給 vncviewer 應用程式。

2.8.3. 開機時啟動 vncserver

要在開機時啟動 vncserver,請輸入這個指令: {{{/sbin/chkconfig vncserver on }}}

VNC 的基本設定現在已經完成。以下部份是選擇性的改善方法來增強安全性及功能。

3. 透過 ssh 隧道將 VNC 加密

你將會透過一條 ssh 隧道來連線。你必須能夠用 ssh 登入該機器上的一個戶口。在這個範例中,vncserver 機器上的戶口是:larry。該用戶名稱必須存在於目標電腦上,並且可透過密碼或金鑰驗證來存取 ssh。vncserver 也會查問 vncpassword。Linux 及 VNC 系統的用戶名稱及密碼不必相等,也不會自動同步。意思就是,遠端用戶 ablebaker 也許會以不同密碼來設立 ssh 隧道通往 VNC 伺服器,但假如大家都是採用 larry 帳戶,它們會應用同一個 VNC 密碼。

  1. 編輯 /etc/sysconfig/vncservers,並加入 -localhost 這個選項。
    VNCSERVERS="1:larry 2:moe 3:curly"
    VNCSERVERARGS[1]="-geometry 640x480 -localhost"
    VNCSERVERARGS[2]="-geometry 640x480 -localhost"
    VNCSERVERARGS[1]="-geometry 800x600 -localhost"
  2. /sbin/service vncserver restart

  3. 進入另一台擁有 vncserver 的機器並測試 VNC。
    1. vncviewer -via larry@192.168.0.10 localhost:1

    2. vncviewer -via moe@192.168.0.10 localhost:2

    3. vncviewer -via curly@192.168.0.10 localhost:3

按預先設定,很多 vncviewer 都會針對它認為是「本地」的連線停用壓縮的選項。請查閱 vncviewer 的使用手冊來啟用/強加壓縮。否則,表現可能會很差勁!

4. 在登出後復原(未在 CentOS 6 上實施)

如果你登出你的桌面管理員,它不會再存在!

5. 用 vnc-ltsp-config 進行遠端登入

要容許用戶利用 vnc 客戶端遠端登入 CentOS 系統,你可以安裝名為 vnc-ltsp-config 及 xinetd 的套件。當 vnc 客戶端連線到其中一個設定了的連接埠,用戶將會穫得一個標準的登入畫面。這個工作階段並不會持久。當用戶登出,這個工作階段便會消失。

vnc-ltsp-config 這個 rpm 套件可以輕易地透過現有軟件庫頁內的 EPEL 軟件庫來安裝。

註:vnc-ltsp-config*.rpm 這個套件並沒有甚麼依賴性,因此你可以簡單地下載並安裝它,而不必啟用 EPEL 軟件庫。

以 root 身份安裝:

# yum install xinetd vnc-ltsp-config
# /sbin/chkconfig xinetd on
# /sbin/chkconfig vncts on
# /sbin/service xinetd restart

接著,請以 root 的身份編輯 "/etc/gdm/custom.conf" 這個檔案。

這樣做會容許你透過 vnc 客戶端連線來取得下面預設的工作階段:

解像度

色彩深度

連接埠

1024x768

16

5900/tcp

800x600

16

5901/tcp

640x480

16

5902/tcp

1024x768

8

5903/tcp

800x600

8

5904/tcp

640x480

8

5905/tcp

要是你不喜歡以上的預設值,你只須按需要更改 /etc/xinetd.d/vncts。

使用 vnc-ltsp-config 的一大優點,就是相比起標準的「一人一設定」,它可以減低系統資源使用量。除非一個用戶登入系統,否則用戶進程不會啟動,記憶體亦不會被佔用。此外,你不必煩惱用戶的設定(也就是省略了為個別用戶手動設置 vnc-server)。vnc-ltsp-config 的弊處就是任何擁有登入權限的用戶都可以透過一個 vnc 客戶端來登入圖像介面,除非你採取措施來限制這類型接線。還有就是工作階段無法持久!一旦 vnc 客戶端被關閉,vnc-ltsp-config 工作階段便會(預設)被中止,而所有執行中的進程都會被刪丟。

這個選項可以利用一個改良版的 vncviewer -via 指命與 ssh 隧道合併:

vncviewer -via remoteUser@remoteHost localhost:vncSinglePortNumber

對於 vnc-ltsp-config 的預設安裝,vncSinglePortNumber 是埠號的最後一個數目字。舉個例來說,埠號 5900(1024x768 16 位元)就只是 "0"。

註:假若你啟用 selinuxiptables,你須要留意可能會出現的互動問題。如果你沒有一個正在運行的顯示管理程式(譬如在 runlevel 3),你必須起動一個,否則當你連線時便只得一個黑畫面。

6. 為已登入的圖像工作階段提供 VNC 伺服器 —— 兩個選擇

很多時你需要遠端存取一個經由「真實」控制台登入的圖像工作階段。又或者你須要遠端協助一位用戶解決圖像介面或視覺方法的問題。你將會需要 vnc-server 或 x11vnc。vnc-server 這個選擇利用一個模塊將常備的 vnc 支援加進 X11;而 x11vnc 就容許臨時性的 vnc 支援。

安裝 vnc-server 並不需要第三方的軟件庫或建立源代碼。

x11vnc 提供了一個方法容讓任從 VNC 檢視器從遠端檢視真實的 X 視像(包括了顯示器、鍵盤、及滑鼠)並進行互動。透過這樣做,它在 Unix/X11 上扮演了 WinVNC 在 Windows 上的角色。

6.1. 臨時性採用 x11vnc

Karl Runge 慷慨地在 http://www.karlrunge.com/x11vnc/ 為 x11vnc 提供了大量的資訊。當中包括了如何提高連線的安全性,及使用 Enhanced TightVNC Viewer「增強版 TightVNC 檢視器」(ssvnc)。簡單來說,請跟從下面的步驟:

  1. http://dag.wieers.com/rpm/packages/x11vnc/ 下載最新的 rpm 到你希望用 vnc 客戶端連線到的主機上:

    wget http://dag.wieers.com/rpm/packages/x11vnc/x11vnc-0.9.3-1.el5.rf.i386.rpm
  2. 以 root 的身份在要被連線的主機上用 yum 或 rpm 進行安裝:

    yum install x11vnc-0.9.3-1.el5.rf.i386.rpm
  3. 在要被連線的主機上啟動 x11vnc 進程。請好好地檢視 x11vnc 網頁上列出的所有選項。一個非常簡單/不安全,可供被信任的網絡(本地網絡或 VPN)使用的範例,就是請擁有圖像控制台的用戶執行:

    [user@helpme_host ~$] x11vnc -nopw -display :0.0

接著通過 vnc 客戶端連線(不需密碼)到 x11vnc 指令所指示的 IP/主機名稱。x11vnc 預設會接納來自所有介面的連線。主機上的防火牆設定或許會需要被修改。

你可以連同 ssh 隧道一併使用它:

ssh -C -t -L 5900:localhost:5900 [遠端 ip] 'x11vnc -usepw -localhost -display :0'

留意 -C 選項選用壓縮,因此不是必需的

6.2. 永久性在 X11 採用 vnc-server

  1. 在你需要執行 vnc-server 的系統上,如上面所示安裝 vnc-server。
  2. 以 root 身份編輯 /etc/X11/xorg.conf,並加入/建立一個 Module 分段及加入 Load "vnc"

    Section "Module"
      Load "vnc"
    EndSection
  3. 要用標準的 vnc 驗證,以 root 身份編輯 /etc/X11/xorg.conf,並在 Screen 分段內加入:

      Option "SecurityTypes" "VncAuth"
      Option "UserPasswdVerifier" "VncAuth"
      Option "PasswordFile" "/root/.vnc/passwd"
  4. 以 root 身份執行 vncpasswd 並如上面所示建立密碼。
  5. 重新啟動 X11(如果你已經在控制台上,可用 <Ctrl>+<Alt>+<BS>)

  6. 你應該可以正常地用 vncviewer 客戶端來進行連線。
  7. 要排除困難,請檢查 /var/log/Xorg.0.log 內的錯誤,並確定 iptables 或 selinux 並沒有干擾遠端的連線。額外的資訊已收錄在 http://www.realvnc.com/products/free/4.1/x0.html


有些用戶覺得這份 Fedora 教學文檔亦有幫助。

Translation of revision 66

zh-tw/HowTos/VNC-Server (last edited 2019-12-09 09:11:42 by anonymous)