VNC(Virtual Network Computing)採用 Client-Server 模式:
5900 + Display號 埠(如 :1 → 5901)。5800 + Display號 埠,支援 Java Applet(現代瀏覽器已棄用,建議改用 noVNC/WebSocket 方案)。# 1. 確認桌面環境已安裝(GNOME/KDE/XFCE 任一)
dnf groupinstall "Server with GUI" -y # CentOS/RHEL 8
yum groupinstall "GNOME Desktop" -y # CentOS/RHEL 7
# 2. 安裝 VNC 套件
dnf install tigervnc-server -y # CentOS/RHEL 8
yum install tigervnc-server -y # CentOS/RHEL 7
# 3. 關閉預設圖形化啟動(可選,純遠端桌面場景)
systemctl set-default multi-user.target
/etc/tigervnc/vncserver.users現代 TigerVNC(CentOS 7+)採用 systemd 實例化服務,拋棄舊版 /etc/sysconfig/vncservers。每個用戶對應一個獨立服務實例 vncserver@:<display>.service。
# 建立業務用戶(非 root)
useradd -m -s /bin/bash vncuser
passwd vncuser
# 編輯映射檔:Display 編號 : 用戶名
vi /etc/tigervnc/vncserver.users
# 內容範例:
:1=vncuser
:2=developer
:3=admin
# 切換到目標用戶
su - vncuser
vncpasswd
# 輸入兩次密碼(僅存儲加密雜湊),會建立 ~/.vnc/passwd
# 可選:設定唯讀密碼(僅觀看,不可操作)
vncpasswd -r
# 輸入唯讀密碼
~/.vnc/config(現代方式,取代 xstartup)
# 以 vncuser 身份編輯
vi ~/.vnc/config
# 內容範例:
session=gnome
geometry=1920x1080
depth=24
dpi=96
localhost=false # 允許非本地連接(配合 SSH 隧道建議保持 true)
alwaysshared=true # 允許多客戶端同時連接同一桌面
註:若需相容舊版,可保留 ~/.vnc/xstartup 並設定執行權限,內容為 exec /etc/X11/xinit/xinitrc 或 gnome-session &。
# 啟動 display :1 對應的服務
systemctl start vncserver@:1.service
systemctl enable vncserver@:1.service
# 檢查狀態
systemctl status vncserver@:1.service
# 查看監聽埠
ss -tlnp | grep 5901
| 層面 | 指令 | 說明 |
|---|---|---|
| firewalld | firewall-cmd --permanent --add-port=5901-5903/tcpfirewall-cmd --reload | 開放 5901~5903 埠(對應 :1~:3) |
| iptables/nftables | iptables -A INPUT -p tcp --dport 5901:5903 -j ACCEPT | 傳統防火牆規則 |
| SELinux | setsebool -P allow_vnc_server on | 允許 VNC Server 讀取家目錄、連接網路 |
| SELinux 家目錄標籤 | restorecon -R -v /home/vncuser/.vnc | 修正 ~/.vnc 目錄安全上下文 |
VNC 協議明文傳輸(密碼雖加密,但畫面數據裸奔),生產環境必須配合 SSH 隧道:
# 客戶端建立隧道(本地 5901 轉發到遠端 5901)
ssh -L 5901:localhost:5901 vncuser@server_ip -N -f
# VNC Viewer 連接
vncviewer localhost:5901
# 或
vncviewer localhost:1
此時防火牆無需開放 5901,僅開放 SSH 埠(22)即可,極大降低攻擊面。
| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| 連接後灰屏/只有 X 終端機 | 桌面環境未啟動、xstartup/config 錯誤 | 確認 session=gnome、安裝 gnome-session、檢查 ~/.vnc/config 語法 |
| Authentication failed | 密碼錯誤、passwd 檔權限錯誤 | 重新 vncpasswd、確認 chmod 600 ~/.vnc/passwd |
| Connection refused | 服務未啟動、防火牆阻擋、localhost 綁定 | systemctl status vncserver@:1、檢查防火牆、設定 localhost=false |
| 藍屏/花屏/效能差 | 色深不匹配、網路延遲高 | 調整 depth=24、啟用壓縮編碼、使用 SSH 隧道+壓縮 ssh -C |
| Root 用戶無法啟動 | systemd 限制、安全策略 | 強烈建議勿用 root 運行 VNC,改用普通用戶 + sudo 權限 |
# 建立覆蓋目錄
mkdir -p /etc/systemd/system/vncserver@:1.service.d/
# 編輯覆蓋檔
vi /etc/systemd/system/vncserver@:1.service.d/override.conf
[Service]
# 限制記憶體/CPU(防止單用戶佔盡資源)
MemoryLimit=2G
CPUQuota=200%
# 環境變數
Environment="LANG=zh_TW.UTF-8"
Environment="XDG_RUNTIME_DIR=/run/user/1000"
# 重啟策略
Restart=on-failure
RestartSec=5
重新載入生效:systemctl daemon-reload && systemctl restart vncserver@:1
現代 VNC 部署核心在於:systemd 實例化管理多用戶、SSH 隧道加密傳輸、SELinux/防火牆最小權限開放。拋棄舊版 /etc/sysconfig/vncservers 手動配置模式,擁抱聲明式配置,才能構建安全、可維運、資源可控的遠端桌面服務。