VNC(虛擬網絡計算)
Contents
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 伺服器:
- 建立 VNC 用戶的帳號。
- 編輯伺服器的設定。
- 設定用戶的 VNC 密碼。
- 確定 vncserver 能乾淨俐落地啟動及停止。
- 建立及自訂 xstartup 腳本。
- 修改 iptables。
- 啟動 VNC 服務。
- 測試每位 VNC 用戶。
- 加入選擇性的改動。
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 系統的用戶名稱及密碼不必相等,也不會自動同步。意思就是,遠端用戶 able 及 baker 也許會以不同密碼來設立 ssh 隧道通往 VNC 伺服器,但假如大家都是採用 larry 帳戶,它們會應用同一個 VNC 密碼。
- 編輯 /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"
/sbin/service vncserver restart
- 進入另一台擁有 vncserver 的機器並測試 VNC。
vncviewer -via larry@192.168.0.10 localhost:1
vncviewer -via moe@192.168.0.10 localhost:2
vncviewer -via curly@192.168.0.10 localhost:3
按預先設定,很多 vncviewer 都會針對它認為是「本地」的連線停用壓縮的選項。請查閱 vncviewer 的使用手冊來啟用/強加壓縮。否則,表現可能會很差勁!
4. 在登出後復原(未在 CentOS 6 上實施)
如果你登出你的桌面管理員,它不會再存在!
- 我們已在 xstartup 內加入了為我們開啟 xterm 的那一行,好讓我們能重新啟動我們的視窗管理員。
gnome 的話,輸入 gnome-session。
kde 的話,輸入 startkde。
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" 這個檔案。
- 在 [security] 分段下的首行空行請加入 DisallowTCP=false
- 在 [xdmcp] 分段下的首行空行請加入 Enable=true
- 請確定你擁有權限為預設的的 Gnome 安裝執行 gdm-restart,或索性重新啟動 CentOS。
這樣做會容許你透過 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"。
註:假若你啟用 selinux 或 iptables,你須要留意可能會出現的互動問題。如果你沒有一個正在運行的顯示管理程式(譬如在 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)。簡單來說,請跟從下面的步驟:
從 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
以 root 的身份在要被連線的主機上用 yum 或 rpm 進行安裝:
yum install x11vnc-0.9.3-1.el5.rf.i386.rpm
在要被連線的主機上啟動 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
- 在你需要執行 vnc-server 的系統上,如上面所示安裝 vnc-server。
以 root 身份編輯 /etc/X11/xorg.conf,並加入/建立一個 Module 分段及加入 Load "vnc":
Section "Module" Load "vnc" EndSection
要用標準的 vnc 驗證,以 root 身份編輯 /etc/X11/xorg.conf,並在 Screen 分段內加入:
Option "SecurityTypes" "VncAuth" Option "UserPasswdVerifier" "VncAuth" Option "PasswordFile" "/root/.vnc/passwd"
- 以 root 身份執行 vncpasswd 並如上面所示建立密碼。
重新啟動 X11(如果你已經在控制台上,可用 <Ctrl>+<Alt>+<BS>)
- 你應該可以正常地用 vncviewer 客戶端來進行連線。
要排除困難,請檢查 /var/log/Xorg.0.log 內的錯誤,並確定 iptables 或 selinux 並沒有干擾遠端的連線。額外的資訊已收錄在 http://www.realvnc.com/products/free/4.1/x0.html 。
有些用戶覺得這份 Fedora 教學文檔亦有幫助。
Translation of revision 66