如何在Ubuntu 16.04或18.04上安裝與設定VNC server

前言

通常我們把主機設定好之後,都會習慣的使用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