CentOS 上 TigerVNC 连不上的排查与修复
一、快速自检清单
- 确认服务已安装并运行:执行 rpm -qa | grep vnc 检查是否安装;用 systemctl status vncserver@:1.service 查看状态,必要时用 systemctl restart vncserver@:1.service 重启。首次使用先为该用户执行 vncpasswd 设置密码。
- 核对端口与监听:显示号 :1 对应端口 5901(规则为 5900 + 显示号);用 ss -lntp | grep 590 或 netstat -lunpt | grep vnc 检查是否监听;若服务仅绑定 127.0.0.1,需改为监听所有地址(见下文“常见原因与修复”)。
- 放行防火墙:firewalld 执行 firewall-cmd --permanent --add-port=5901/tcp 与 firewall-cmd --reload;如使用 firewalld 的 vnc-server 服务,也可 firewall-cmd --permanent --add-service=vnc-server 后重载。
- 客户端连接串是否正确:使用 IP:显示号(如 192.168.1.100:1),不要写成 IP:5901(除非客户端明确要求端口号);若走本机端口转发,则连 localhost:1。
- 查看日志定位:服务端日志通常在 ~/.vnc/主机名:显示号.log,配合 journalctl -xe 获取启动期报错。
二、常见原因与修复
- 端口未放行或被占用
- 现象:连接超时/被拒绝。
- 处理:放行对应端口(如 5901/tcp),或排查占用并释放端口(ss/ netstat 定位 PID 后 kill),再重启 vncserver@:1。
- 服务仅监听本机
- 现象:服务器本机能连,外部连不通。
- 处理:在 systemd 服务或启动参数中确保监听所有地址。示例(在 [Service] 的 ExecStart 中)使用 /usr/bin/vncserver %i -localhost no;若用旧模板,确保未把 -localhost 写死为仅本地。
- xstartup 配置错误导致黑屏或进不去桌面
- 现象:黑屏、灰屏、只有墙纸或命令行。
- 处理:编辑 ~/.vnc/xstartup,给执行权限 chmod +x,内容可简化为:
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
exec $HOME/.xsession 2>/dev/null || exec /etc/X11/xinit/xinitrc
修改后重启 vncserver@:1。
- 使用了 GNOME 自带“屏幕共享”(Vino)而非 TigerVNC
- 现象:报错如 “No matching security types / Server did not offer supported security type”。
- 处理:在图形会话中执行 gsettings set org.gnome.Vino require-encryption false,或改用 TigerVNC 的 xstartup 启动 GNOME/KDE/Xfce。
- 防火墙/云安全组未放行
- 现象:ping 通但端口不通。
- 处理:firewalld 放行 5901/tcp 或 vnc-server 服务;云服务器还需在控制台安全组放行对应端口。
三、最小可用配置示例
- 安装与设密(以普通用户为例):
sudo yum install -y tigervnc-server
su - youruser
vncpasswd
- 创建 systemd 实例(/etc/systemd/system/vncserver@:1.service):
[Unit]
Description=TigerVNC Server
After=syslog.target network.target
[Service]
Type=forking
User=youruser
Group=youruser
WorkingDirectory=/home/youruser
PIDFile=/home/youruser/.vnc/%H:1.pid
ExecStartPre=-/usr/bin/vncserver -kill :1 >/dev/null 2>&1
ExecStart=/usr/bin/vncserver :1 -geometry 1280x800 -depth 24 -localhost no
ExecStop=/usr/bin/vncserver -kill :1
[Install]
WantedBy=multi-user.target
- 启动与放行:
sudo systemctl daemon-reload
sudo systemctl enable --now vncserver@:1.service
sudo firewall-cmd --permanent --add-port=5901/tcp
sudo firewall-cmd --reload
- 客户端连接:your_server_ip:1(对应端口 5901)
四、安全与多用户建议
- 优先通过 SSH 隧道 访问:ssh -L 5901:localhost:5901 user@server,然后客户端连 localhost:1,可避免明文 VNC 暴露公网。
- 多用户多会话:分别启用 vncserver@:2、:3…,并放行 5902、5903 等端口;每个会话互不干扰。
- 运行身份:建议用非 root用户启动 VNC 服务,降低风险。