VNC
Virtual Network Computing (VNC) 是一個圖形化桌面共享系統, 可以遠程連接計算機, 使用鍵盤和鼠標.
本文包含 在RHEL8上,安裝和配置 VNC server 的步驟 . 我們還會展示如何通過SSH通道安全的連接.
環境
- Red Hat Enterprise Linux 7
- Red Hat Enterprise Linux 8.0
- Red Hat Enterprise Linux 8.1
- Red Hat Enterprise Linux 8.2
- tigervnc-server
問題
- 如何通過 VNC 遠程使用用戶圖形界面?
- 如何在RHEL8.0到8.2中配置VNC?
- 升級到RHEL 8.3后,VNC服務器無法啟動。
- 安裝tigervnc-server-1.10.1-7.el8后,VNC服務器無法啟動。
- 使用vncserver命令無法啟動Xvnc進程。
- 如何在RHEL 8.3中配置VNC服務器?
- 如何在Red Hat Enterprise Linux 7/8 - 8.2中配置虛擬網絡計算(VNC)中提到的Xvnc配置步驟在RHEL 8.3中不起作用。
決議
對於RHEL8.3 + (tigervnc-server-1.10.1-7.el8),請查看 Are there any changes to the default vncserver configuration in RHEL8.3.0?
自動配置
Red Hat Access Labs提供了一個VNC配置器工具,用於根據您的環境和部署目標自動生成VNC配置。VNC配置器合並了本文檔中包含的信息,但使生成有效的和支持推薦的配置變得更容易。
注意:此工具不能用於RHEL8。
前提
跟隨教程, 您需要以具有 sudo權限 的用戶身份登錄到遠程RHEL8機器上。
安裝桌面環境
通常, 服務器沒有安裝桌面環境. 如果你想連接的機器沒有 GUI , 則安裝桌面環境. 否則, 跳過.
運行一下命令 安裝 Gnome 圖形界面, 默認的桌面環境
# yum group install GNOME base-x or # yum groupinstall "Server with GUI"
依賴你的系統, 下載 安裝 Gnome 包和一些依賴需要一些時間.
安裝 VNC Server
TigerVNC 是 一直被維護的高性能開源 VNC server. 在 RHEL 默認倉庫中可用. 安裝:
# yum -y install tigervnc-server
注意:
- 為使VNC有用,還需要安裝X Windows System和窗口管理器。
- 如果還沒有安裝圖形化桌面環境,請參考: How to install a graphical interface in Red Hat Enterprise Linux
配置 VNC Server
在最新版本的tigervnc-server中,vncserver配置文件的位置已經改變。現在默認的配置文件在/etc/tigervnc/目錄下。這個目錄中有三個主要文件。
- vncserver.users
- vncserver-config-defaults(默認值)
- vncserver-config-mandatory
在 /etc/tigervnc/vncserver.users 中添加一個用戶映射。
通過這個選項,管理員可以將用戶映射到一個特定的端口上,映射應該在 /etc/tigervnc/vncserver.users 配置文件中完成。這種映射應該在 /etc/tigervnc/vncserver.users 配置文件中完成。
:x=user
例如:
:1=vncuser1
:2=vncuser2
注意:
Red Hat Enterprise Linux 只支持每個系統的每個 GUI 會話有一個唯一的用戶,因此,每個用戶使用一個 vnc 會話。因此,每個用戶使用一個 vnc session。不要為單個用戶配置多個 vnc session。詳情請參考: How many GUI sessions can I log a user into?
在RHEL8中, TigerVNC 是使用 systemd 守護進程配置
這個栗子, 我們將告訴你如何配置 TigerVNC 一個或多個VNC用戶
- 創建一個 專門使用VNC使用系統的 VNC用戶賬戶(如果不存在).
# useradd <username> # passwd <username>
e.g:
# useradd testuser1 # passwd testuser1
- 之后以用戶身份登錄,使用 vncpasswd 命令 創建 密碼 . 以將要訪問VNC服務器的用戶運行該命令, 不要使用 sudo 命令:
$ vncpasswd
系統將提示您輸入並確認密碼,以及是否將其設置為只讀密碼。 如果選擇設置僅查看密碼,則用戶將無法使用鼠標和鍵盤與VNC實例進行交互。
第一次運行vncpasswd命令時,會在用戶的~/.vnc目錄下創建並存儲密碼文件。
Password:
Verify:
Would you like to enter a view-only password (y/n)? n A view-only password is not used
如果你添加第二個用戶, 切換用戶 並且 使用 vncpasswd 設置密碼.
為用戶創建VNC server 配置文件, 復制原型VNC配置文件並為用戶編輯.
e.g:
# cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
- 用文本編譯器 編輯
/etc/systemd/system/vncserver@:1.service
文件, 並將 "USER" 字符串 替換 合適的 vncuser 的用戶名.在這個例子中,用戶將是 "testuser1". - 為每一個實例修改 vncserver@:<num>.service. 你應該為每個用戶創建一個單元文件。
注意:
-
- 如果用戶是root,請將PIDFile行的路徑改為/root/.vnc/%H%i.pid。不適用於RHEL7.8(及以上)和RHEL8.2.0。
- 從RHEL7.8和RHEL8.2.0開始,單元文件的外觀與上面的不同。除了替換<USER>之外,不要替換單元文本的其他部分。
- 要添加更多的用戶,如上所述,創建一個新的 "vncserver@:#.service "文件,並將 "USER "字符串改為其他用戶。
- 要向VNC服務器傳遞選項,如分辨率、顏色深度等,請按照下面的例子將這些選項添加到ExecStart=中。
ExecStart=/sbin/runuser -l testuser1 -c "/usr/bin/vncserver %i -geometry 1024x768 -depth 24"
2. 下一步, 配置 TigerVNC 使用 Gnome 桌面. VNC 從 ~/.vnc/config 讀取用戶配置設置.
打開文件 並 添加以下內容:
vim ~/.vnc/config
session=gnome geometry=1920x1200 localhost alwaysshared
session選項指定要啟動的會話,geometry選項指定VNC桌面的大小。
保存並關閉文件. 如果您要添加多個用戶,請重復相同的步驟。
注意:
- 從RHEL7.4開始,支持的服務器選項已經被移到了~/.vnc/目錄下的一個名為'config'的新文件中。所以不需要在上面提到的行中添加這些選項。
3. TigerVNC提供了一個文件,允許你將用戶映射到一個特定的端口。該映射在 /etc/tigervnc/vncserver.users 文件中配置。
sudo vim /etc/tigervnc/vncserver.users
這個文件 使用 <display_port>=<username>
語法. 在下面的例子中,我們將顯示端口:1映射到用戶linuxize。使用同樣的格式來添加更多的用戶。
# TigerVNC User assignment # # This file assigns users to specific VNC display numbers. # The syntax is <display>=<username>. E.g.: # # :2=andrew # :3=lisa :1=linuxize
:1是VNC服務器運行的顯示端口號。在我們的例子中,服務器運行在TCP端口5901(5900+1)上。例如,如果將另一個用戶映射到顯示端口:2,服務器也將在5902端口(5900+2)上監聽。
需要理解的是,在使用VNC服務器時,:X是指5900+X的顯示端口。
配置 防火牆
- 接下來配置防火牆接受VNC的傳入連接。執行此命令,在防火牆中打開與VNC相關的端口。
# firewall-cmd --permanent --zone=public --add-port 5901/tcp
- 該命令只為傳入的連接打開TCP端口5901。當需要時,同樣的命令也可以用來打開其他端口。
- 重新加載防火牆,使防火牆規則生效。
# firewall-cmd --reload
-
重載配置文件
# systemctl daemon-reload
啟動 TigerVNC Server
啟動並開機啟動 vnc service:
- 要確保服務在系統啟動時啟動。
# systemctl enable vncserver@:1.service
- 為映射的 顯示端口:1 的用戶 啟動 和 允許開機啟動 VNC service , 輸入:
sudo systemctl enable vncserver@:1 --now
VNC Server 將 監聽 端口 5901
- 配置完成后, 最后一步 啟動 VNC Server.
# systemctl start vncserver@:1.service
你可以通過以下方式 驗證 service 是否 成功 啟動:
sudo systemctl status vncserver@:1
vncserver@:1.service - Remote desktop service (VNC) Loaded: loaded (/usr/lib/systemd/system/vncserver@.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2020-12-17 21:49:41 UTC; 8s ago
...
要為其他用戶啟用VNC,只需將1替換為映射到用戶的顯示端口。
連接 VNC Server
VNC不是加密協議,可能會受到數據包嗅探。推薦的方法是創建一個SSH隧道,將本地機器上5901端口的流量安全地轉發到同一端口的遠程服務器上。
在Linux和macOS上設置SSH隧道。
如果你的機器上運行的是 Linux、macOS 或任何其他基於 Unix 的操作系統,你可以使用下面的 ssh 命令輕松創建一個隧道。
ssh -L 5901:127.0.0.1:5901 -N -f -l username remote_server_ip
提示你輸入用戶密碼.
不要忘記 將 username 和 server_ip-address 替換為 你的 username 和 IP address.
在 Windows 上設置 SSH 通道
Windows用戶 可以用 PuTTY 設置 SSH 通道

在 Connection 菜單里, 展開 SSH, 選擇 Tunnels. 在 Source Port 字段輸入 VNC Server port (5901) . 在 Destination 字段 輸入 server_ip_address:5901, 並點擊 Add 按鈕, 如下圖所示:

回到會話頁面保存設置,這樣你就不需要每次都輸入。要登錄到遠程服務器,選擇已保存的會話並點擊打開按鈕。
使用 Vncviewer 連接
要連接到遠程服務器,打開VNC查看器,輸入localhost:5901。
你可以使用任何VNC查看器,如TigerVNC、TightVNC、RealVNC、UltraVNC、Vinagre和VNC Viewer for Google Chrome。
我們使用的是TigerVNC。

當提示輸入密碼時,你應該看到默認的Gnome桌面。它應該看起來像這樣。

就是這樣!你現在可以從本地機器使用鍵盤和鼠標在遠程桌面上工作了。現在,您可以使用鍵盤和鼠標從您的本地機器開始在遠程桌面上工作。
結論
我們已經向大家展示了如何設置VNC服務器並連接到遠程 RHEL8。
配置 桌面 環境:
-
vnc的用戶特定配置文件位於用戶主目錄下的'.vnc'目錄中,(例如:/home/username/.vnc/)。(例如:/home/username/.vnc/)。在你喜歡的編輯器中打開.vnc/xstartup,並按以下方式編輯。
-
在對配置文件進行任何修改后,重新啟動vnc服務器服務。
對於Gnome
- xstartup "文件應該是這樣的
# cat ~/.vnc/xstartup #!/bin/sh [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources vncconfig -iconic & dbus-launch --exit-with-session gnome-session &
對於 KDE
- xstartup "文件應該是這樣的
VNC 客戶端 連接:
- vncviewer 命令可以用來從遠程Linux機器連接到適當的基於VNC的X會話。如果遠程系統正在運行Windows,可以從網站http://www.tigervnc.org/ 免費下載基於Windows的VNC查看器程序。
-
要使用vncviewer客戶端連接到用戶顯示,請將N替換為所需用戶的基於VNC的X會話的編號。
- 如果使用端口號而不是顯示號進行連接,大多數vnc客戶端需要使用vncserver-ipaddress::portnumber的語法。
# vncviewer vncserver-ipaddress::59XX
e.g:
配置Xvnc選項:
要配置Xvnc參數,打開vncserver-config-defaults配置文件。這個文件是默認的Xvnc配置,將應用於每個用戶,除非有以下情況。
- 用戶在$HOME/.vnc/config中有自己的配置。
- 同樣的選項,在vncserver-config-mandatory配置文件中配置了不同的值,它取代了默認的配置,其優先級甚至高於按用戶配置。這個選項是為系統管理員想要強制執行特定的Xvnc選項時准備的。
配置文件的格式也很簡單,配置如下。
option=value
例如:
session=gnome #securitytypes=vncauth,tlsvnc #desktop=sandbox #geometry=2000x1200 #localhost #alwaysshared
注意:
這里唯一需要的參數是session=,它應該與/usr/share/xsessions目錄下的會話桌面文件名相匹配。對於支持的部署,這里的默認選項是 session=gnome。對於廠商/社區提供的任何第三方/上游GUI,請查看相關文檔。
設置vnc密碼
為了能夠啟動Tigervnc服務器,請為每個用戶設置一個密碼。為了創建密碼,請以您要啟動服務器的用戶身份運行以下命令。
$ vncpasswd
注意:-必須在以用戶身份登錄時進行設置,不能以root/其他管理員身份使用RHEL 8中的vncpasswd用戶名命令進行設置。在RHEL 8中不能以root/其他管理員身份使用vncpasswd用戶名命令進行設置。
如果系統中以前使用過vncserver,請確保vncpasswd創建的$HOME/.vnc文件夾具有正確的SELinux上下文。有兩種可能的選擇來確保這一點。
- 刪除 $HOME/.vnc 文件夾,然后通過再創建一次密碼來重新創建。
- 或者運行該命令。$ restorecon -RFv /home/<USER>/.vnc。
啟動Tigervnc服務器
最后用systemd服務啟動服務器。要做到這一點,只要運行。
As root user: # systemctl start vncserver@\:$x.service As non-root user: $ sudo systemctl start vncserver@\:$x.service
用/etc/tigervnc/vncserver.users中配置的實際數字代替$x。
$ sudo systemctl start vncserver@\:1.service
它將以 GNOME 會話為用戶 vncuser1 啟動一個 Tigervnc 服務器。
注意:- 如果你正在使用vino(屏幕共享),請注意它與VNC共享端口。不要使用任何可能導致沖突的端口。要確定某個用戶可能使用的vino端口,讓該用戶在登錄到本地圖形控制台時運行 "gsettings get org.gnome.desktop.remote-access alternative-port"。
配置防火牆以接受傳入的連接。
執行以下命令在防火牆中打開VNC端口。
# firewall-cmd --permanent --zone=public --add-port 5901/tcp
該命令只為傳入的連接打開TCP端口5901。當需要時,同樣的命令也可以用來打開其他端口。你可能需要考慮針對你的用例制定豐富的規則。以上只是一個通用規則,它將開放對端口5901的全面訪問,或指定的任何端口。
重新加載防火牆以使防火牆規則生效。
# firewall-cmd --reload
注意:-
- 如果之前使用systemd配置過vncserver,請刪除之前的systemd配置文件(例如:/etc/systemd/system/vncserver@.service),否則將使用該service文件代替最新的配置文件。
- 關於RHEL7.x和RHEL8.2.0版本的vnc服務器配置,請參考: How to access the GUI of remote RHEL system via Virtual Network Computing (VNC)?
限制:-
- 用戶將無法為已經登錄到圖形會話的用戶啟動Tigervnc服務器。
- 避免以root用戶的身份運行服務器,因為這不是一件安全的事情。雖然以root用戶的身份運行服務器在一般情況下應該是可行的,但不建議這樣做,可能會有一些事情不能正常運行。參考: Is logging in to the GUI as the root user supported in Red Hat Enterprise Linux?
根源
以前的Tigervnc版本有一個名為vncserver的包裝腳本,可以作為用戶手動運行來啟動Xvnc進程。使用方法很簡單,可以通過執行以下命令來啟動。
$ vncserver :x [vncserver options] [Xvnc options]
雖然這樣做還不錯,但當用戶想用systemd啟動Tigervnc服務器時,就會出現一些問題。由於這些原因,事情被徹底改變了,現在有了一種新的工作方式。
SELinux策略有額外的更新,要求策略也要更新,否則VNC服務器將無法在舊點版本上啟動。將SELinux策略包從較新的點版本混合到較舊的點版本上,會引起額外的問題。如果要使用上述tigervnc版本,最佳做法是完全更新。
參考:
[1] How to Install and Configure VNC on CentOS 8
[2] How to configure Virtual Network Computing (VNC) in Red Hat Enterprise Linux 7/8 - 8.2?
[3] Are there any changes to the default vncserver configuration in RHEL8.3?
[4] How to install a graphical user interface (GUI) for Red Hat Enterprise Linux?