Ubuntu 下 TigerVNC 启用加密的两种可靠方案
- 方案一(推荐):使用 SSH 隧道 加密,配置简单、通用性强,适合大多数网络环境。
- 方案二:启用 X.509 TLS 加密,服务端和客户端进行证书校验,适合对安全性要求更高的场景。
方案一 SSH 隧道加密
-
服务端安装与初始化
- 安装 TigerVNC 服务器:sudo apt update && sudo apt install tigervnc-standalone-server
- 切换到目标用户初始化密码:vncserver(设置登录密码;如提示创建只读密码,选 n)
- 如需开机自启,建议创建 systemd 服务,并在启动参数中加入 -localhost(仅本机监听,由 SSH 转发):
- 示例(/etc/systemd/system/vncserver@.service 的 ExecStart):
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 -localhost :%i
- 重新加载并启用:sudo systemctl daemon-reload && sudo systemctl enable --now vncserver@1
-
客户端连接(SSH 隧道)
- 建立本地端口转发(将本机 5901 转发到服务器的 5901):
ssh -L 5901:localhost:5901 -C -N -l 用户名 服务器IP
- 使用任意 VNC 客户端连接:localhost:1(或 localhost:5901)。
- 说明:SSH 隧道建立后,VNC 数据经 SSH 加密传输,无需在 VNC 层再启用 SSL/TLS。
方案二 X.509 TLS 加密(证书认证与加密)
-
准备证书
- 生成自签名证书(包含服务器 IP 或域名的 SAN,有效期 3650 天):
mkdir -p ~/.vnc
openssl req -x509 -newkey rsa -days 3650 -nodes
-config /usr/lib/ssl/openssl.cnf
-keyout ~/.vnc/vnc-server-private.pem
-out ~/.vnc/vnc-server.pem
-subj ‘/CN=你的服务器名称’
-addext “subjectAltName=IP:x.x.x.x,IP:y.y.y.y”
- 将生成的 vnc-server.pem 分发给客户端用于校验(放在 TigerVNC Viewer 可识别的目录)。
-
服务端启用 X509 加密
- 写入客户端配置(~/.vnc/config):
session=ubuntu
geometry=1600x900
depth=24
localhost=no
SecurityTypes=X509Vnc
X509Cert=/home/你的用户名/.vnc/vnc-server.pem
X509Key=/home/你的用户名/.vnc/vnc-server-private.pem
- 说明:TigerVNC 会自动使用 X.509 证书对会话进行加密与服务器身份认证。
-
客户端连接
- 使用 TigerVNC Viewer 直接连接:服务器IP:1(或 :5901)。
- 在 Viewer 的 Security 选项中启用 X509 证书,并指定包含 vnc-server.pem 的目录,即可完成证书校验并建立加密通道。
防火墙与端口说明
- 使用 SSH 隧道 时:仅允许 SSH 端口 22 对外开放;VNC 端口(如 5901)仅在回环接口监听,由 SSH 转发,更安全。
- 使用 X.509 TLS 时:需放行 5901/TCP(或相应显示号端口),并确保路由器/云安全组策略允许该端口入站。
常见问题与排查
- 连接被拒绝或灰屏:确认 VNC 服务已启动(vncserver -list)、端口监听正常(ss -ltnp | grep 590)、以及桌面会话配置正确(如 ~/.vnc/xstartup 或 session=ubuntu)。
- 证书不被信任:确保客户端使用的是服务器提供的 vnc-server.pem,且证书的 SAN 包含客户端连接的 IP/DNS。
- 版本差异:TigerVNC 1.10.1+ 推荐使用 systemd 管理;若直接运行 vncserver 提示已被 systemd 单元替代,请改用服务方式管理。