介紹
虛擬網路遠端控制,簡稱VNC,是一種連接系統,允許您使用鍵盤和滑鼠與遠端伺服器上的圖形桌面環境進行互動。對於尚未熟悉命令列的使用者來說,它使得在遠端伺服器上管理檔案、軟體和設定更加容易。
在本指南中,您將使用TightVNC在Ubuntu 22.04伺服器上設置VNC伺服器,並通過SSH隧道安全連接到它。然後,您將在本機機器上使用VNC客戶端程式透過圖形桌面環境與伺服器進行互動。
先決條件
完成本教程,您需要:
- 一個已配置有非root管理使用者和已設定了UFW防火牆的Ubuntu 22.04伺服器。要設置這個,請參考我們的Ubuntu 22.04的初始伺服器設置指南。
- A local computer with a VNC client installed. The VNC client you use must support connections over SSH tunnels:
步驟 1 — 安裝桌面環境和 VNC 伺服器
在預設情況下,Ubuntu 22.04 伺服器沒有安裝圖形桌面環境或 VNC 伺服器,因此您需要開始安裝這些。
在選擇 VNC 伺服器和桌面環境時,您有很多選擇。在本教程中,您將安裝最新的 Xfce 桌面環境和來自官方 Ubuntu 存儲庫的 TightVNC 套件。Xfce 和 TightVNC 都以輕量和快速著稱,這將有助於確保即使在較慢的網絡連接下,VNC 連接也會平穩和穩定。
使用 SSH 連接到您的伺服器後,請更新您的套件清單:
現在安裝 Xfce,以及包含一些桌面環境增強功能的 xfce4-goodies
套件:
安裝期間,您可能會被提示選擇 Xfce 的默認顯示管理器。顯示管理器是一個允許您通過圖形界面選擇並登錄到桌面環境的程序。當您使用 VNC 客戶端連接時,您將只使用 Xfce,在這些 Xfce 會話中,您已經作為非 root Ubuntu 用戶登錄。因此,在本教程中,您的顯示管理器的選擇並不重要。請隨意選擇一個,然後按 ENTER
。
安裝完成後,安裝 TightVNC 服務器:
接下來,運行 vncserver
命令設置 VNC 訪問密碼,創建初始配置文件並啟動 VNC 服務器實例:
系統將提示您輸入並驗證用於遠程訪問您的機器的密碼:
OutputYou will require a password to access your desktops.
Password:
Verify:
密碼必須是 6 到 8 個字符長。超過 8 個字符的密碼將自動截斷。
驗證密碼後,您將有選擇創建僅查看密碼的選項。使用僅查看密碼登錄的用戶將無法使用鼠標或鍵盤控制 VNC 實例。如果您想要向使用您的 VNC 服務器的其他人演示某些內容,這是一個有用的選項,但這不是必需的。
然後,該流程會創建必要的默認配置文件和服務器的連接信息。此外,它會在端口 5901
上啟動一個默認的服務器實例。這個端口被稱為顯示端口,在 VNC 中被稱為:1
。VNC 可以在其他顯示端口上啟動多個實例,:2
對應端口 5902
,:3
對應 5903
,以此類推:
OutputWould you like to enter a view-only password (y/n)? n
xauth: file /home/sammy/.Xauthority does not exist
New 'X' desktop is your_hostname:1
Creating default startup script /home/sammy/.vnc/xstartup
Starting applications specified in /home/sammy/.vnc/xstartup
Log file is /home/sammy/.vnc/your_hostname:1.log
請注意,如果您想要更改密碼或添加僅查看密碼,可以使用 vncpasswd
命令:
此時,VNC 服務器已安裝並運行。現在,您將配置它以啟動 Xfce 並通過圖形界面訪問服務器。
步驟 2 — 配置 VNC 服務器
VNC 服務器需要知道在啟動時運行哪些命令。具體來說,VNC 需要知道應該連接到哪個圖形桌面環境。
VNC 服務器在啟動時運行的命令位於名為 xstartup
的配置文件中,該文件位於您的家目錄下的 .vnc
文件夾中。在上一步中運行 vncserver
命令時,已創建了啟動腳本,但您將創建自己的腳本來啟動 Xfce 桌面。
因為你將要修改 VNC 伺服器的配置,首先停止正在執行在端口 5901
上的 VNC 伺服器實例,使用以下命令:
輸出會類似於這樣,但你會看到不同的 PID:
OutputKilling Xtightvnc process ID 17648
在修改 xstartup
文件之前,備份原始文件:
現在創建一個新的 xstartup
文件並在文本編輯器中打開它,比如 nano
:
然後將以下行添加到文件中:
#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &
文件中的第一行是一個 shebang。在 *nix 平台上,可執行的純文本文件使用 shebang 告訴系統將該文件傳遞給哪個解釋器進行執行。在這種情況下,你將文件傳遞給 Bash 解釋器。這將使每個後續行按順序作為命令執行。
文件中的第一個命令,xrdb $HOME/.Xresources
,告訴 VNC 的 GUI 框架讀取服務器用戶的 .Xresources
文件。.Xresources
是用戶可以更改圖形桌面的某些設置,如終端顏色、游標主題和字體渲染的地方。第二個命令告訴服務器啟動 Xfce。每次啟動或重新啟動 VNC 伺服器時,這些命令將自動執行。
在添加這些行後保存並關閉文件。如果你使用的是 nano
,按下 CTRL + X
,然後按 Y
,最後按 ENTER
來執行此操作。
為確保 VNC 伺服器能夠正確使用這個新的啟動文件,你需要將其設置為可執行:
然後重新啟動 VNC 伺服器:
請注意,此次命令包含 -localhost
選項,該選項將 VNC 伺服器綁定到您伺服器的回環介面。這將導致 VNC 僅允許來自安裝了它的伺服器的連接。
在下一步中,您將在本機和您的伺服器之間建立一個 SSH 隧道,從而使 VNC 認為來自本機的連接起源於您的伺服器。這種策略將為 VNC 添加一層額外的安全性,因為唯一能夠訪問它的用戶是那些已經具有 SSH 訪問權限的用戶。
您將看到類似以下的輸出:
OutputNew 'X' desktop is your_hostname:1
Starting applications specified in /home/sammy/.vnc/xstartup
Log file is /home/sammy/.vnc/your_hostname:1.log
配置完成後,您就可以從本機連接到 VNC 伺服器了。
步驟 3 — 安全連接到 VNC 桌面
VNC 本身在連接時不使用安全協議。要安全連接到您的伺服器,您將建立一個 SSH 隧道,然後告訴您的 VNC 客戶端使用該隧道進行連接,而不是直接連接。
在您的本機電腦上創建一個 SSH 連接,安全地轉發到 VNC 的 localhost
連接。您可以通過 Linux 或 macOS 上的終端使用以下 ssh
命令來執行此操作:
以下是這個 ssh
命令選項的含義:
-L 59000:localhost:5901
:-L
開關指定本地電腦上給定的端口(59000
)要轉發到目標服務器上給定的主機和端口(localhost:5901
,意思是目標服務器上的端口5901
,定義為your_server_ip
)。請注意,您指定的本地端口有些是任意的;只要該端口尚未綁定到其他服務,您就可以將其用作隧道的轉發端口。-C
:此標誌啟用壓縮,有助於減少資源消耗並加速速度。-N
:此選項告訴ssh
您不想執行任何遠程命令。當您只想轉發端口時,此設置很有用。-l sammy your_server_ip
:-l
開關讓您指定要登錄的用戶,一旦連接到服務器,請確保用您非根用戶的名稱和您服務器的 IP 地址替換sammy
和your_server_ip
。
注意:此命令建立一個 SSH 隧道,將來自您的 VNC 服務器端口 5901
的信息通過每台機器上的端口 22
(SSH 的默認端口)轉發到本地機器上的端口 59000
。假設您已按照先決條件 Ubuntu 22.04 的初始服務器設置指南進行操作,您將添加了一條 UFW 規則,以允許通過 OpenSSH 連接到您的服務器。
這比單純開放伺服器防火牆以允許連接到端口5901
更安全,因為那樣會允許任何人通過 VNC 訪問您的伺服器。通過 SSH 隧道連接,您將 VNC 訪問限制為已經具有對伺服器的 SSH 訪問權限的機器。
如果您使用 PuTTY 連接到您的伺服器,您可以通過右鍵單擊終端窗口的頂部欄,然後單擊更改設置…選項來創建一個 SSH 隧道:
在 PuTTY 重新配置窗口的左側樹狀菜單中查找連接分支。展開SSH分支,並單擊隧道。在控制 SSH 端口轉發的選項屏幕上,將59000
輸入為源端口,將localhost:5901
輸入為目標,如下所示:
然後單擊添加按鈕,然後單擊應用按鈕以實現隧道。
隧道運行後,使用 VNC 客戶端連接到localhost:59000
。您將被提示使用您在第一步中設置的密碼進行身份驗證。
連接後,您將看到默認的 Xfce 桌面。它應該看起來像這樣:
您可以使用文件管理器或命令行訪問您的主目錄中的文件,如此所示:
在本地終端中按CTRL+C
停止 SSH 隧道並返回提示符。這也將斷開您的 VNC 會話。
現在,您可以配置您的 VNC 伺服器運行為 systemd 服務。
步驟 4 — 將 VNC 設置為系統服務運行
通過設置 VNC 服務器運行為 systemd 服務,您可以根據需要啟動、停止和重新啟動它,就像管理任何其他服務一樣。您還可以使用 systemd 的管理命令來確保 VNC 在伺服器啟動時啟動。
首先,創建一個名為 /etc/systemd/system/[email protected]
的新單元文件:
名稱結尾的 @
符號將允許我們傳遞一個參數,您可以在服務配置中使用這個參數。您將使用這個參數來指定管理服務時要使用的 VNC 顯示端口。
將以下行添加到文件中。請務必更改 User、Group、WorkingDirectory 的值,以及 PIDFILE 的值中的用戶名,以匹配您的用戶名:
[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target
[Service]
Type=forking
User=sammy
Group=sammy
WorkingDirectory=/home/sammy
PIDFile=/home/sammy/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 -localhost :%i
ExecStop=/usr/bin/vncserver -kill :%i
[Install]
WantedBy=multi-user.target
ExecStartPre
命令在運行時停止 VNC(如果它已經運行)。ExecStart
命令啟動 VNC 並將顏色深度設置為 24 位彩色,分辨率為 1280×800。您也可以修改這些啟動選項以滿足您的需求。還請注意,ExecStart
命令再次包含 -localhost
選項。
保存並關閉文件。
接下來,讓系統知道新的單元文件:
啟用該單元文件:
在 @ 符號之後的 1
表示服務應該出現在哪個顯示器上,在這種情況下,默認的 :1
就像在第 2 步中討論的那樣。
如果 VNC 服務仍在運行,請停止當前實例:
然後像啟動任何其他 systemd 服務一樣啟動它:
您可以使用此命令驗證它是否已啟動:
如果啟動正確,輸出應該如下所示:
Output● [email protected] - Start TightVNC server at startup
Loaded: loaded (/etc/systemd/system/[email protected]; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-04-18 16:57:26 UTC; 20s ago
Process: 97088 ExecStartPre=/usr/bin/vncserver -kill :1 > /dev/null 2>&1 (code=exited, status=2)
Process: 97092 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 -localhost :1 (code=exited, status=0/SUCCESS)
Main PID: 97103 (Xtightvnc)
Tasks: 77 (limit: 4665)
Memory: 146.7M
CPU: 4.459s
CGroup: /system.slice/system-vncserver.slice/[email protected]
. . .
您的 VNC 服務現在已經準備好在服務器啟動時使用,您可以像管理其他 systemd 服務一樣使用 systemctl
命令 來管理它。
但在客戶端不會有任何不同。要重新連接,請重新啟動 SSH 隧道:
然後使用您的 VNC 客戶端軟件建立一個新連接到 localhost:59000
以連接到您的服務器。
結論
您現在在您的 Ubuntu 22.04 服務器上運行了一個安全的 VNC 服務。現在,您將能夠使用用戶友好的圖形界面來管理您的文件、軟件和設置,並且您將能夠遠程運行像網頁瀏覽器之類的圖形軟件。
Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-vnc-on-ubuntu-22-04