大多数 Ubuntu 管理任务应优先使用 SSH。只有确实需要完整图形会话、协助当前桌面或运行必须依赖 GUI 的应用时,才增加远程桌面。默认安全边界是:远程桌面服务只在本机回环或受控私网可达,跨网络访问由 SSH/VPN 或经过认证的 TLS gateway 承担;不要把原始 VNC 暴露到公网。
Table of Contents
1. 先按需求选择技术
| 需求 | 首选 | 关键边界 |
|---|---|---|
| 命令、文件、日志、端口转发 | OpenSSH | 不需要图形桌面 |
| 协助已登录的 GNOME 桌面 | GNOME Remote Desktop 的 Desktop Sharing(RDP) | 当前用户明确同意,核对加密指纹 |
| 在无人值守机器登录 GNOME | GNOME Remote Desktop 的 Remote Login(RDP),前提是本机版本支持 | 与 Desktop Sharing 的 session/port 不同 |
| 独立、持久的虚拟 X11 桌面 | TigerVNC/Xvnc + vendor vncsession |
非 root 专用用户、localhost、SSH/VPN |
| CGNAT 后方或不能开放入站 | 受管 VPN、回环绑定的 reverse SSH tunnel 或 relay | 由内向外建立连接,不公开 VNC |
| 只运行一个 GUI 程序 | 应用原生远程模式、SSH forwarding 或任务队列 | 不必暴露完整桌面 |
不要因为标题写着“安装 VNC Server”就默认 VNC 是正确选择。先写明用户、应用、是否共享当前 session、是否需要登录画面、访问来源、数据敏感度、可用的恢复通道和停止时间。
2. 变更前的只读清点
以下命令不改变配置。某些 unit 或程序不存在会报错;记录为版本/桌面差异,不要据此安装随机软件或复制旧教程。
. /etc/os-release
echo "$NAME $VERSION_ID"
echo "$XDG_CURRENT_DESKTOP"
echo "$XDG_SESSION_TYPE"
loginctl show-session "$XDG_SESSION_ID" -p Type -p Class -p Remote
apt-cache policy gnome-remote-desktop tigervnc-standalone-server openssh-server
command -v grdctl Xvnc Xtigervnc tigervncserver vncsession vncpasswd ssh
systemctl --user status gnome-remote-desktop.service --no-pager
systemctl cat 'tigervncserver@.service'
ss -lntp
sudo ufw status verbose
还要记录现有图形 session、显示管理器、监听地址/端口、firewall/security-group/router 规则、已有 VPN/tunnel、包来源和版本、自动启动 owner、屏幕锁定行为以及第二条管理路径。不要在证据中包含密码、private key、session cookie、剪贴板内容或完整桌面截图。
3. 先建立恢复和同意边界
- 保持一个已验证的 SSH 或物理控制台,不要让它依赖正在修改的远程桌面。
- 在普通测试用户和非生产机器上先验证;不要以 root 运行桌面或 VNC server。
- 对共享当前桌面,屏幕前用户必须知道何时开始、谁能控制、剪贴板是否共享,以及如何立即断开。
- 使用独立于 Ubuntu 登录密码、邮箱和其他服务的远程桌面 credential;SSH/VPN/gateway 还要有自己的强认证。
- 记录旧 unit/config/firewall 状态并做权限受限的备份;不要删除整个配置目录来“重装”。
- 设定维护窗口、idle/connection timeout、批准的 client 和回退负责人。
若唯一恢复路径是即将测试的同一 GUI、唯一 admin credential 不可轮换,或不能确认现有监听 owner,应停止。
4. GNOME RDP:当前桌面共享与远程登录不同
当前 GNOME 官方帮助把 Desktop Sharing 与 Remote Login 分开:前者查看/控制当前已登录桌面,后者用于远程登录用户账户。两者同时启用时端口可能不同;不要固定假设永远是 3389。以 Settings ▸ System ▸ Remote Desktop 中显示的 hostname、port、login details 和 encryption fingerprint 为准。
优先用 Settings UI 开启所需的一个模式,设置专用凭据,并通过独立可信通道比较 client 与 server 显示的加密指纹。不要把密码放进 grdctl command line、shell history、截图或聊天。CLI 只用于查看所装版本实际支持的选项:
grdctl --help
systemctl --user cat gnome-remote-desktop.service
systemctl --user status gnome-remote-desktop.service --no-pager
journalctl --user -u gnome-remote-desktop.service --since today --no-pager
把 RDP 限制在受管 VPN、可信 LAN 加精确 firewall allowlist,或经过认证的 TLS access boundary。即使 RDP 有加密,也不应把管理桌面无条件开放给互联网。
5. Wayland、X11 与 session 语义
GNOME Remote Desktop 与当前 GNOME session/Wayland 组合工作,最适合共享或登录 GNOME。TigerVNC 的 Xvnc/Xtigervnc 创建独立的虚拟 X server;它不是当前物理 Wayland 桌面的镜像。x0vncserver 面向现有 X display,也不能被假定能捕获原生 Wayland session。
因此先决定“共享当前桌面”还是“新建虚拟桌面”。不要通过猜 DISPLAY=:0、复制 .Xauthority、以 root attach 用户 session 或关闭 Wayland 来强行跨越边界。桌面环境、GPU/portal、锁屏、音频、剪贴板和应用 keyring 在不同 session 中可能行为不同,必须逐项验证。
6. 何时选择 TigerVNC
TigerVNC 适合需要独立、可持久的虚拟 X11 desktop,而不是当前 GNOME/Wayland 屏幕的场景。使用 Ubuntu 当前仓库包或上游正式 release;先检查本机 man page、vendor unit 和配置路径,因为旧 vncserver wrapper、上游 ~/.config/tigervnc/config 与 Ubuntu/Debian 的 ~/.vnc/tigervnc.conf/service 集成可能不同。
上游 TigerVNC 建议通过 vncsession/vendor systemd service 启动,并明确不建议以 root 运行。不要从 2014 教程恢复 vnc4server、自制 root unit、rc.local、cron 或后台 & 启动。
7. Ubuntu vendor service 的 owner 必须明确
先阅读当前 unit 和文档,不要覆盖 /usr/lib/systemd/system:
systemctl cat 'tigervncserver@.service'
man -P cat tigervncsession | sed -n '1,220p'
man -P cat tigervnc.conf | sed -n '1,220p'
find /usr/share/xsessions -maxdepth 1 -type f -name '*.desktop' -print
Ubuntu 当前 packaging 可能通过 /etc/tigervnc/vncserver.users 把 display 映射到用户。管理员审阅和备份后,只添加专用非 root 账户的一个映射;不要复用真实用户名占位符,也不要把多个用户映射到同一 display。
:1=REMOTE_DESKTOP_USER
REMOTE_DESKTOP_USER 必须替换为已创建、权限受限且获准运行桌面的实际账户。display :1 通常对应 RFB TCP 5901,但必须用实际 socket 证据确认,不能只靠公式。
8. TigerVNC localhost 配置范例
下面是 Ubuntu/Debian 风格 ~/.vnc/tigervnc.conf 的最小意图示例。先根据本机 tigervnc.conf(5x) 验证语法和可用 session。TLSVnc 仍使用 VNC password 认证,但用 TLS 包住 RFB;外层 SSH/VPN 仍是主要访问控制。不要添加未加 TLS 的 VncAuth fallback 或 None。
$localhost = "yes";
$SecurityTypes = "TLSVnc";
$NeverShared = "yes";
$session = "gnome";
$geometry = "1920x1080";
localhost=yes 是硬边界:监听只能是 127.0.0.1 和/或 ::1,不能是 0.0.0.0、[::] 或公网 interface。若本机格式是上游新配置格式,不要照抄 Perl;按对应版本 HOWTO 写出等价的 localhost 与安全类型。
9. 凭据不能放进 argv
以将运行 VNC session 的普通用户执行交互式 vncpasswd。不使用 vncpasswd -f 从 command line/管道传明文,也不使用 Xvnc 的 Password 参数。检查实际 password file 只能被 owner 访问:
umask 077
vncpasswd
stat -c '%a %U %G %n' "$HOME/.vnc/passwd" "$HOME/.config/tigervnc/passwd" 2>/dev/null
TigerVNC 官方 vncpasswd 文档说明传统 password file 只是 obfuscated、可被文件读取者恢复,而且只有前八个字符有效。这不是“足够长就很强”的现代 secret。使用唯一、不复用的随机值作为内层认证,并依赖独立的 SSH key/VPN/gateway 强认证和 localhost 绑定;若风险模型要求现代 MFA/identity policy,选择能提供它的外层 access system。
10. 单次启动,不先 enable
先验证 vendor unit,启动一个测试 instance,但暂不设置开机启动:
UnitPath="$(systemctl show 'tigervncserver@:1.service' -p FragmentPath --value)"
test -r "$UnitPath" || exit 1
sudo systemd-analyze verify "$UnitPath"
sudo systemctl start 'tigervncserver@:1.service'
sudo systemctl status 'tigervncserver@:1.service' --no-pager
sudo systemctl show 'tigervncserver@:1.service' -p FragmentPath -p MainPID -p ActiveState
ps -eo user,pid,ppid,cmd | grep -E '[X]tigervnc|[v]ncsession'
ss -lntp 'sport = :5901'
确认进程属于映射的非 root 用户,socket 只有 loopback,session 类型和 desktop 正确。若看到 0.0.0.0:5901、[::]:5901、root owner、未知 command line 或重复 server,立即停止 instance;不要用 firewall 作为错误 bind 的唯一补丁。
11. 从 client 建立本地 SSH tunnel
先用常规 SSH 登录验证 host key、专用 key/MFA(若组织提供)、账户 allowlist 和第二管理路径。再在 client 运行一条 foreground tunnel;15901 是 client loopback,server 端仍连接 127.0.0.1:5901:
ssh -N -T -L 127.0.0.1:15901:127.0.0.1:5901 -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -o StrictHostKeyChecking=yes REMOTE_USER@REMOTE_HOST
VNC viewer 只连接 127.0.0.1:15901。REMOTE_USER/REMOTE_HOST 是占位符,不含 password。不要使用 sshpass、URL credential、StrictHostKeyChecking=no 或把 private key 发给 viewer。结束时在 tunnel terminal 按 Ctrl+C,并确认 client 的 15901 listener 消失。
12. CGNAT 后方:VPN、reverse tunnel 或 relay
CGNAT 后方不能靠 DNS/VNC port forwarding 获得入站路径。优先使用组织批准、具有 device identity 与 ACL 的 VPN。若选择 OpenSSH reverse tunnel,server 只在 relay 的 loopback 建立 listener,不能使用 GatewayPorts 暴露公网:
ssh -N -T -R 127.0.0.1:15901:127.0.0.1:5901 -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -o StrictHostKeyChecking=yes RELAY_USER@RELAY_HOST
管理员再通过自己的 SSH session 把 relay loopback 转到本机:
ssh -N -T -L 127.0.0.1:15901:127.0.0.1:15901 -o ExitOnForwardFailure=yes -o StrictHostKeyChecking=yes RELAY_USER@RELAY_HOST
relay 必须有独立账户/key、最小 forwarding policy、日志、patch、访问审查和失效回退。不要为了让 reverse forward 工作而盲改全局 sshd_config;由 SSH 管理员按用户限制并先验证 effective config。
如果你已经有一台 relay 和最多三台自己的电脑,但不确定 reverse tunnel、监听地址与恢复路径是否收紧到位,我提供一项固定 250 美元的 LazyRemote Network Fit Review。先发不含密码、私钥或未脱敏配置的基本信息即可;这项服务不包含部署或硬件。
13. Firewall 与 authenticated TLS gateway
localhost-only VNC 不需要 ufw allow 5901,路由器也不应转发 5900 系列端口。SSH、VPN 或 RDP 的 firewall 规则必须限定到批准的管理网段/device,且同时检查 IPv4、IPv6、cloud security group 和上级 router。先用只读状态与 ss 取证,再把规则变更放入独立审批;本指南不提供“对所有来源开放”命令。
若业务必须通过浏览器或跨组织访问,使用仍受维护、具备有效证书验证、强用户认证/MFA、rate limit、session timeout、审计和 backend allowlist 的 TLS gateway。backend VNC 仍只绑定 loopback/private interface;不能因为 gateway 使用 HTTPS 就允许匿名 VNC、共享账号或跳过证书检查。
14. 验证矩阵与证据
| 检查 | 预期证据 | 失败时动作 |
|---|---|---|
| Process owner | VNC/session 属于批准的非 root 用户 | 停止 unit,修正 mapping |
| Bind address | VNC 仅 127.0.0.1/::1 |
停止,不开放 firewall |
| Tunnel | ExitOnForwardFailure 成功,client 只监听 127.0.0.1:15901 |
关闭 tunnel,检查冲突/SSH policy |
| Authentication | 外层 SSH/VPN/gateway 与内层 VNC credential 均独立 | 轮换并禁止共享 |
| Encryption | GNOME RDP 指纹匹配;VNC 跨网只走受保护 transport | 立即断开 |
| Session | 当前桌面或独立 X session 符合预期 | 不用 DISPLAY hack 修补 |
| Firewall | 无公网 5900 系列;批准来源以外拒绝 | 回退规则并调查 |
| Reboot | 只有审批后 enable 的 owner 恢复 | disable unit,检查重复启动 |
保存 package version、unit FragmentPath、非敏感 config hash、process owner、socket address、firewall rule ID、client/server fingerprint 核对结果、测试时间和回退结果。不要保存桌面内容、keystroke、clipboard、credential 或 private key。
15. 剪贴板、文件、锁屏与无障碍
远程控制能读取屏幕、输入按键并可能同步剪贴板。测试时关闭 password manager、聊天、恢复码和敏感文档;能禁用 clipboard/file transfer 时按最小需要禁用。共享当前桌面要有清晰的 on-screen indicator 和本地断开方式。
分别测试锁屏、logout、用户切换、suspend/resume、键盘布局、IME、缩放、多显示器、屏幕阅读器和紧急断开。不要假定远程桌面 password 可以解锁 full-disk encryption、display manager 或已经失效的 user session。
16. 持久化、日志与更新
单次连接、断开和回退均通过后,才考虑 systemctl enable 对应 vendor instance。不要自制重复 unit,也不要同时运行 GNOME RDP、Xvnc、x0vncserver 和第三方 agent 而不记录 owner。每次 package/desktop/Wayland 更新后复查 session 与 bind。
日志只保留连接时间、来源标识、结果和必要 error class;不要长期开 debug 级别、记录 clipboard 或认证材料。为重复失败、异常来源、service 崩溃和意外公网 listener 告警,并设 retention/access policy。
17. 回退与停止条件
先关闭 client/tunnel,然后停止远程桌面。TigerVNC 测试 instance 可这样回退:
sudo systemctl disable --now 'tigervncserver@:1.service'
sudo systemctl status 'tigervncserver@:1.service' --no-pager
ss -lntp 'sport = :5901'
sudo systemctl reset-failed 'tigervncserver@:1.service'
GNOME 模式应在 Settings 中关闭 Desktop Sharing/Remote Login,再确认 user unit 与 socket。通过原审批恢复旧 config/firewall;不要递归删除 ~/.vnc、~/.config、用户 home、systemd vendor unit 或 desktop packages。
出现以下任一情况即停止并升级处理:只能监听 0.0.0.0/[::];唯一方案是公网匿名/仅 DES 风格 VNC;password 必须进入 argv;server 只能以 root 运行;host key/TLS fingerprint 无法核对;唯一 SSH/physical recovery 不可用;session/lock-screen 行为不明;需要关闭 Wayland、firewall 或证书验证才能连接;共享用户未同意。
18. 当前官方与上游资料
- GNOME:Desktop Sharing(RDP)
- GNOME:Remote Login(RDP)
- GNOME:Secure Shell remote access
- TigerVNC:当前 `vncsession` HOWTO
- TigerVNC:Xvnc listen、localhost、SecurityTypes 与 PasswordFile
- TigerVNC:`vncpasswd` 限制与文件权限
- TigerVNC:`vncsession` 上游 man source
- OpenSSH:`ssh` local/remote forwarding 与失败选项
- systemd:service unit 生命周期
- systemd:system/user unit 搜索路径与覆盖规则
- Ubuntu Server:firewall
- Ubuntu packages:TigerVNC package 查询
资料核验于 2026-09-01。GNOME Remote Desktop、TigerVNC packaging、session 名、unit 名和客户端能力会变化;使用本机所装版本的 UI、man page、vendor unit 和对应官方文档。
19. 2014 年原文档案(仅供溯源)
以下外层围栏逐字保留 source_export 的完整可见正文;未做尾随空白规范化或私密值遮盖。档案中的 vnc4server、模糊 firewall 提示、只说密码不能太短、直接 vncserver 启动、:1 连接和已失效明文 HTTP 参考链接均为惰性历史证据,不是现行指令。
~~~~markdown
尽管我们在大部分情况下用ssh登录Ubuntu服务器就好了,但是有时候我们的程序需要在图形界面下运行,这时我们就要用到vnc server这个软件了。在Ubuntu下安装vnc server很简单的,只要下面几步就可以了:
第一步,获取安装文件
sudo apt-get install vnc4server
第二步,修改VNC Password,不能太短
# vncpasswd
Password: ******
Verify:*****
第三步,检查防火墙,这个就不详细说明了
第四步,启动VNC server
vncserver
第五步,通过客户端连接
地址后面加:1
本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2007-11/9252.htm
~~~~
