Ubuntu 安裝 x11vnc VNC Server

本篇 ShengYu 紀錄在 Ubuntu 16.04 / Ubuntu 18.04 下安裝 x11vnc VNC Server,x11vnc 是一個遠端桌面伺服器,它允許使用者通過 VNC 協議來遠端訪問和控制正在運行的 X Window System(通常稱為 X11)桌面環境,也就是 x11vnc 會傳輸整個 X Window 的畫面,跟其他 vnc server 不太一樣,所以在使用時建議要設定密碼已達到最低程度的保護,
以下為 Ubuntu 安裝 VNC server 的內容,大概分為這幾部份,

  • Ubuntu 安裝 x11vnc VNC Server
  • 設定 VNC 密碼
  • 手動啟動 x11vnc server
  • x11vnc 參數說明
  • 自動啟動 x11vnc server (開機自動啟動)
  • 確認 x11vnc server 狀態
  • Ubuntu VNC 客戶端程式
  • Windows VNC 客戶端程式
  • macOS VNC 客戶端程式
  • SSH 通訊埠轉發

Ubuntu 安裝 x11vnc VNC Server

使用 apt 指令來安裝 x11vnc server

1
sudo apt-get install x11vnc

設定 VNC 密碼

設定 x11vnc 的連線密碼,使用 x11vnc -storepasswd 指令來設定之後未來 vnc 的連線密碼,並指定要將密碼存放在 /etc/x11vnc.pass 路徑下,

1
2
3
4
5
$ sudo x11vnc -storepasswd /etc/x11vnc.pass
Enter VNC password:
Verify password:
Write password to /etc/x11vnc.pass? [y]/n y
Password written to: /etc/x11vnc.pass

手動啟動 x11vnc server

手動啟動 x11vnc server,Ubuntu 16.04 可以使用下列指令,

1
2
3
4
5
6
7
8
sudo x11vnc \
-display :0 \
-auth /var/run/lightdm/root/:0 \
-forever -bg \
-noxdamage -noxrecord -noxfixes \
-rfbauth /etc/x11vnc.pass \
-rfbport 5900 \
-o /var/log/x11vnc.log

Ubuntu 18.04 可以使用下列指令,跟上面 Ubuntu 16.04 的差別在 -auth 參數,

1
2
3
4
5
6
7
8
sudo x11vnc \
-display :0 \
-auth /run/user/1000/gdm/Xauthority \
-forever -bg \
-noxdamage -noxrecord -noxfixes \
-rfbauth /etc/x11vnc.pass \
-rfbport 5900 \
-o /var/log/x11vnc.log

因為使用 -bg 參數會放到背景執行,所以要關閉 x11vnc server 可以使用 kill / killall 指令,

1
sudo killall x11vnc

或者 x11vnc 來關閉 x11vnc server

1
x11vnc -R stop

x11vnc 參數說明

以下為常用的一些 x11vnc 參數與說明,
-display :0:顯示和本地端的 DISPLAY :0, 即客戶端看到的畫面和本地端看的畫面一樣
-usepw:使用密碼
-nopw:不使用密碼
-rfbauth:指定之前設定好的 vnc 連線密碼檔
-bg:背景執行
-forever:繼續監聽更多 vnc 連線,沒有這個參數的話會在第一個客戶端離線後,就退出程式
-rfbport:指定 vnc 的連接埠
-o:輸出日誌
-auth guess 讓 vnc 自行猜測進行連線
-auth /var/lib/gdm/:0.Xauth 使用 GDM 的 X-Session 進行連線
-auth /var/run/lightdm/root/:0 使用 lightdm 的 X-Session 進行連線
-viewonly:所有客戶端只能看,沒有控制權,即不能控制滑鼠與鍵盤(預設關閉)
-shared:VNC display is shared, i.e. more than one viewer can
connect at the same time (default off).
-geometry WxH:顯示的大小,例如:-geometry 1024x768

自動啟動 x11vnc server (開機自動啟動)

Ubuntu 要開機自動啟動 x11vnc server 的話,就要寫一個 service 的設定檔,方法如下,
編輯 x11vnc.service,內容如下,這份設定適用於 Ubuntu 16.04,
Ubuntu 18.04 就把 -auth 改成 /run/user/1000/gdm/Xauthority 即可,
ExecStop 這行可有可無,

x11vnc.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Unit]
Description=x11vnc
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc \
-display :0 \
-auth /var/run/lightdm/root/:0 \
-forever -loop -noxdamage -repeat \
-rfbauth /etc/x11vnc.pass \
-rfbport 5900 \
-o /var/log/x11vnc.log \
-shared
ExecStop=/usr/bin/x11vnc -R stop

[Install]
WantedBy=multi-user.target

移動 x11vnc.service 到 /etc/systemd/system/ 路徑下,並修改存取權限

1
2
3
sudo mv ~/x11vnc.service /etc/systemd/system/
sudo chmod 644 /etc/systemd/system/x11vnc.service
sudo chown root:root /etc/systemd/system/x11vnc.service

重新載入設定值與啟動 x11vnc server 服務

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable x11vnc.service # 啟用 x11vnc 服務
sudo systemctl start x11vnc.service # 啟動 x11vnc 服務

確認 x11vnc server 狀態

確認 x11vnc server 有在執行

1
$ systemctl status x11vnc

或者用 ps 指令確認 x11vnc server 有在執行

1
$ ps aux | grep x11vnc

用 netstat 指令確認 x11vnc server 的監聽埠 5900

1
2
3
$ netstat -l | grep 5900
tcp 0 0 *:5900 *:* LISTEN
tcp6 0 0 [::]:5900 [::]:* LISTEN

Ubuntu VNC 客戶端程式

Ubuntu 可以使用內建的 Remmina Remote Desktop Client 來進行 VNC 連線,一些必要的設定與選項如下,

1
2
3
4
5
6
7
Name: xxx
Protocol: VNC-Virtual Network Computing
Server: ip:
User name:
Password: your password
Color depth: High color(16bit)
Quality: Good

若是區域網路內的連線,Color depth 可以選到最高 True color(24bit)

Windows VNC 客戶端程式

在 Windows 可以選用 REAL VNC 這款免費的 VNC Viewer,

macOS VNC 客戶端程式

macOS 內建有 VNC 客戶端程式,要使用 macOS 內建的 VNC 客戶端程式的方式法是 Finder > 前往 > 連接伺服器,之後輸入 vnc://<ip>,例如 vnc://192.168.1.5 再按連線即可。

SSH 通訊埠轉發

要安全地使用 x11vnc 的話,可以搭配 ssh 來達成安全性,
概念是將 x11vnc 改成綁定本機端 loopback 網路介面,這樣外部的連線就無法連上,

x11vnc 要綁定本機端 loopback 網路介面的方法是加上 -localhost 的參數,

1
x11vnc -localhost ... -rfbport 5900 ...

客戶端要使用 VNC 前,先用 ssh 通訊埠轉發,同時要確定客戶端沒有 5900 的服務正在開啟中,例如客戶端也有一個 VNC Server 的服務剛好也是使用 5900 的話就需要先關閉或改用其他 port,以下 ssh 指令使用後會登入遠端電腦並轉發這些通訊埠,一旦 ssh 連線終止轉發通訊埠也會終止,所以 ssh 登入後就保持連線直到使用完畢再終止連線即可,

1
ssh <x11vnc-server-host> -L 5900:localhsot:5900

然後客戶端再用 VNC 連接自己本機端的 port 5900 vnc://localhost:5900 即可。
如果 VNC 嘗試連線失敗時 ssh terminal 出現 channel 3: open failed: administratively prohibited: open failed 的錯誤訊息的話,可將 localhsot 改用 127.0.0.1 試試。

1
ssh <x11vnc-server-host> -L 5900:127.0.0.1:5900

其它參考
x11vnc(1) - Linux man page
https://linux.die.net/man/1/x11vnc
Bahut: VNC server for Cinnamon with systemd
http://bahut.alma.ch/2018/10/vnc-server-for-cinnamon-with-systemd.html

其它相關文章推薦
macOS Screen Sharing 用指令開啟螢幕分享