前言
通常我們把主機設定好之後,都會習慣的使用SSH進行連線,以遠端的操作方式來執行指令並操作主機,而有些使用者會覺得光只有操作指令是不夠的,尤其是對剛從Windows使用者到入門的Linux初學者來說,有桌面環境操作是有必要的。
本文章中,帶讀者們了解如何在Ubuntu 16.04與18.04上安裝與設定VNC server。並如何在Windows上透過VNC viewer遠端桌面連線到遠端的主機。
前置環境
- 一台遠端的主機,可以是Ubuntu 16.04或是Ubuntu 18.04並可以正常的ssh遠端連線存取。
安裝步驟
- 以ssh方式遠端連線到主機,相關指令如下:
ssh user-name@user-ip-address -p port-number
user-name就是遠端主機的使用者名稱,user-ip-address就是遠端主機的IP位址或是IP對應到的網域名稱。
port-number就是遠端主機的埠號。
- 連上主機之後,利用下面指令更新遠端主機的鏡像來源相關的快取:
sudo apt-get update
- 更新好鏡像來源快取之後,接著尋找一下是否有名叫「vnc4server」的套件:
sudo apt-cache search vnc4server
將會看到下面的截圖:
- 利用下面指令確認這個「vnc4server」套件的相關資訊:
sudo apt-cache policy vnc4server
接著就會看到如下的資訊:
- 接著安裝「vnc4server」,使用下面的指令:
sudo apt-get install -y vnc4server
安裝好之後,接著要設定一組密碼才可以透過VNC client進行連線:
接著輸入「vnc4server」,代表我們要設定一組密碼可以登入進到當前的使用者。
設定好之後,就會出現如下的截圖:
從上面截圖看出,需要有打兩次密碼以利密碼是對的。接著會在家目錄底下多出一個名字叫做「.vnc」目錄,裡面會有下列幾個檔案:
其中目錄裡面有個叫做「.xstartup」是重點,它是一個在VNC client連上去之後會執行的腳本,攸關於VNC連線之後會啟動的事情與動作,這個預設的腳本不符合我們的需要。
因此等等會做一些修改,接著因為一般的主機預設是沒有安裝任何一個桌面環境,因此在VNC連線適合的桌面環境我推薦有兩個,如下:
- Xfce
- LXDE
上述這兩款桌面環境都是屬於輕量型的桌面環境,記憶體在主機上所佔比例相對較少,並很適合VNC連線所使用。這篇文章,兩者都會教,首先先教如何設定Xfce的桌面環境。
首先,先更新鏡像快取來源,並安裝下列的套件:
sudo apt-get update sudo apt-get install -y xfce4 xfce4-goodies autocutsel
安裝autocutsel套件是因為需要可以在VNC連線下做複製貼上的動作。
安裝xfonts-base是因為讓Xfce4桌面環境有文字檔可以使用。
安裝好之後,假設已經有vim文字編輯器了,使用vim把.xstartup打開:
vim .vnc/.xstartup
把上述這個檔案替換成下面的內容:
#!/bin/bash [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources autocutsel -fork vncconfig -iconic & vncconfig -nowin & startxfce4 &
把設定檔換好了之後,接著執行下面的檔案,讓VNC server可以跑起來:
# 先將既有建立的VNC server連線砍掉 (如果存在的話) vnc4server -kill :1 vnc4server -geometry 1200x800 :1
這意思是,啟動一個VNC server並監聽5901的port number(埠號)解析度為1200×800的畫面。
上述指令啟動之後,下面會印出相關的訊息:
New 'vultr.guest:1 (peter)' desktop is vultr.guest:1 Starting applications specified in /home/peter/.vnc/xstartup Log file is /home/peter/.vnc/vultr.guest:1.log
如果要將原本的VNC server設定移除,則可以使用下列指令:
vnc4server -kill :1
這意思是說,執行桌面環境相關程式由/home/peter/.vnc/xstartup的腳本做執行
相關啟動期間的log會在/home/peter/.vnc/vultr.guest:1.log紀錄
如果要驗證是否已經啟動了VNC server,可以使用下列的指令來驗證:
ps aux | grep vnc
如果有出現上述從上面數下來的三個processes,就代表VNC server已經啟動成功了,如果沒有的話,則要去看上述所提到的log檔案去找看看裡面有沒有錯誤的紀錄內容。
如果有在主機上打開UFW防火牆的話,則需要將5901的埠號開啟才可以,可以用下列的方式加入:
ufw allow 5901
接著可以使用RealVNC viewer進行連線看是否已經可以連線了。相關的連線方面如下:
從上圖截圖可以得知,VNC server裡面可以填寫IP位址,Name名稱可以填一個這個連線的自定義識別名稱。
連上去之後,則會得到下面的截圖:
上述的截圖是提到說,是否答應未加密的連線這邊可以點選「continue」因為這邊是測試。接著就會得到下面進入桌面環境截圖了。
若要使用LXDE桌面環境則是需要安裝下面的套件:
sudo apt-get update sudo apt-get install -y xorg lxde-core lxterminal
如果是Ubuntu 18.04的話,則需要加裝lubuntu-desktop的套件
接著把當前使用者的家目錄中的「.vnc/xstartup」檔案改成下面的內容:
#!/bin/bash [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources autocutsel -fork vncconfig -iconic & vncconfig -nowin & /usr/bin/lxsession -s LXDE &
設定好之後,記得使用下面指令把之前原本的VNC server給刪掉,並重新啟動一個:
# 刪掉原本監聽在5901上面的VNC server vnc4server -kill :1 # 重新啟動一個VNC server vnc4server -geometry 1200x800 :1
接著就會有如下的截圖,代表LXDE桌面環境與VNC server設定成功了。
安全議題
從上面的行為這樣是不安全的,原因是因為VNC監聽之間的連線傳輸不是加密的,為了讓VNC連線之間是加密的傳輸,我們可以利用SSH tunnel的方式讓VNC傳輸在SSH的加密通道裡面。
ssh -L 5900:127.0.0.1:5901 -N -f -l user_name user_ip_address
上述的指令意思是:
- 利用SSH建立一個連線,-L是位址的意思,讓本地端的5900埠號接收來自遠端的5901連線封包與資料。(port forwarding)
- -N指的是這個連線不要執行遠端的指令
- -f指的是讓這個連線成功以後,在背景執行。這個連線通道程序直到執行建立SSH通道這個連線指令的Shell關閉為止
- 若不想要讓SSH通道連線在背景執行,則把這個選項去掉即可
- 若要砍掉背景的加密連線通道,則可以使用ps找到建立連線的process id並使用kill把這個連線通道給砍掉
- -l指的是設定登入的使用者名稱與IP位址(或是IP位址對應的網域名稱)。
這樣設定好之後,就可以把5901的埠號從遠端主機上的防火牆給關閉了。接著在RealVNC viewer上將連線主機位址與埠號改成「127.0.0.1:5900」。
到這裡,就讓VNC server可以在SSH通道底下進行加密傳輸了。雖然在RealVNC client仍會跳出未加密的警告,原因是因為client不知道這個傳輸是走在加密的通道上,而只有server端才會知道這個連線是加密的。
上述這個概念示意圖如下:
參考資料
- https://askubuntu.com/questions/648819/couldnt-start-xtightvnc-trying-default-font-path-vncserver
- https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-vnc-on-ubuntu-16-04
- https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-18-04
- https://vitux.com/ubuntu-vnc-server/
- https://www.vandorp.biz/2012/01/installing-a-lightweight-lxdevnc-desktop-environment-on-your-ubuntudebian-vps/#.XpQfdPIzZFR
- https://www.itzgeek.com/how-tos/linux/ubuntu-how-tos/how-to-install-vnc-on-ubuntu-16-04.html
- https://serverfault.com/questions/592658/realvnc-ssh-tunnel-still-warns-of-unencrypted-connection