1. 为什么 VNC 到今天依然是远程桌面里的“老黄牛”
1.1 一个被低估的经典工具
聊远程桌面,很多人第一反应是各种商业远控软件,但真正在运维圈、机房圈、工控圈里活得最久的,反而是 VNC 这套老家伙。VNC 全称 Virtual Network Computing,直译过来就是“虚拟网络计算”,它的核心思路特别朴素:把一台机器的屏幕画面切成一块块小矩形,只把发生变化的那部分编码后传出去,同时把远端的键盘鼠标事件回传回来。这套机制从九十年代一直用到现在,协议本身没怎么大改,却依然能跑在从 Windows 7 到麒麟操作系统、从 CentOS 7 到各种嵌入式设备上。
我这些年接触过的场景里,VNC 出现的频率高得离谱:机房里的物理服务器要临时接个图形界面、工控机上跑着老旧的组态软件、开发同学要在远程 Linux 桌面上调 GUI 程序、甚至有人拿它来远程操作家里的老电脑。这些场景有个共同点——不需要花哨的功能,只要能稳定看到画面、能操作鼠标键盘就行。VNC 恰好就是干这个的,而且它跨平台、协议开放、客户端选择多,RealVNC、TightVNC、VNC Viewer 这些名字你可能都听过,它们本质上都是同一套协议的不同实现。
这篇文章我打算把 VNC 从下载到装好、从服务端到客户端、从 Windows 到 Linux 的完整流程捋一遍。不管你是第一次接触 VNC 的新手,还是装过但总踩坑的老手,都能从里面找到能直接抄作业的步骤。我会把 RealVNC 和 TightVNC 这两个最常用的分支都讲清楚,也会顺带说说麒麟操作系统和 CentOS 7 上装 VNC Server 的那些门道。
1.2 VNC 到底解决了什么问题
要理解 VNC 的价值,得先想清楚一个事:远程桌面这东西,不同人的需求差别巨大。有人要的是“我在家能连公司电脑改个文档”,有人要的是“我在办公室能连机房那台没有显示器的服务器看一眼界面”,还有人要的是“我要批量管理几十台设备的图形界面”。这三种需求对应的工具其实不一样。
VNC 的定位在第二和第三种之间。它不像某些商业远控那样强调穿透、强调多设备管理、强调文件传输,它就是一个纯粹的“画面搬运工”。你在一台机器上跑 VNC Server,它监听一个端口,把当前桌面的画面编码后等着人来连;你在另一台机器上跑 VNC Viewer,填上地址和密码,就能看到那台机器的桌面。就这么简单。
这种简单带来两个好处。第一是兼容性极强,只要设备能跑图形界面,基本都能装 VNC Server,哪怕是十几年前的老系统。第二是协议开放,客户端和服务端可以来自不同厂商,RealVNC 的 Viewer 连 TightVNC 的 Server 通常也没问题,反过来也一样。当然实际用的时候还是建议同厂配套,兼容性更稳,这个后面会细说。
1.3 这篇文章适合谁看
如果你属于下面这几类人,这篇内容应该能帮上忙:
- 第一次装 VNC,面对 RealVNC、TightVNC、VNC Viewer 这些名字不知道选哪个;
- 装完了连不上,卡在“Connection refused”或者黑屏;
- 在 Windows 7 这种老系统上装 VNC Server,遇到各种兼容性提示;
- 在麒麟操作系统或者 CentOS 7 上装 VNC,被依赖和配置搞得头大;
- 想知道 RealVNC 是不是只能装在 C 盘,能不能改路径。
我会尽量把每一步都写清楚,包括为什么这么做、不这么做会出什么问题。有些地方我会给出具体的命令和配置,你可以直接复制粘贴;有些地方我会说明原理,方便你遇到变体情况时自己判断。
2. VNC 家族成员盘点与选型思路
2.1 RealVNC、TightVNC、VNC Viewer 到底是什么关系
很多人第一次搜 VNC 的时候会被一堆名字搞晕:VNC、RealVNC、TightVNC、VNC Viewer、VNC Server、UltraVNC……这些名字之间到底是什么关系?我用一个类比来解释:VNC 是“普通话”这个语言标准,RealVNC 和 TightVNC 是两家说普通话的公司,VNC Viewer 和 VNC Server 则是“听”和“说”两个角色。
具体来说:
- VNC是协议标准,定义了画面怎么编码、事件怎么传输;
- RealVNC是一家公司,也是 VNC 协议的原始开发者,它提供的产品叫 RealVNC Connect,里面包含 VNC Server 和 VNC Viewer;
- TightVNC是另一个实现,主打压缩效率,在带宽紧张的环境下表现更好,而且完全免费;
- VNC Viewer是客户端,用来连别人的 VNC Server;
- VNC Server是服务端,装在被控制的机器上。
所以你在下载的时候,要先想清楚自己是要装“被控端”还是“主控端”。如果是要让别人连你,就装 Server;如果是要连别人,就装 Viewer。RealVNC 和 TightVNC 都同时提供 Server 和 Viewer,但它们的授权模式不一样。
2.2 RealVNC 和 TightVNC 怎么选
这是问得最多的问题之一。我直接给结论,然后说理由。
| 对比项 | RealVNC | TightVNC |
|---|---|---|
| 授权模式 | 个人免费,商业用途需付费 | 完全免费,开源 |
| 压缩效率 | 一般 | 较高,低带宽下更流畅 |
| 跨平台 | Windows、macOS、Linux、部分嵌入式 | Windows、Linux |
| 安装包大小 | 较大 | 较小 |
| 配置复杂度 | 图形化配置,较友好 | 配置文件为主,稍复杂 |
| 老系统兼容 | Windows 7 支持较好 | Windows 7 支持好 |
| 麒麟/CentOS | 有对应版本 | 主要通过包管理器安装 |
如果你是自己用、连家里电脑或者个人服务器,RealVNC 的个人版够用,界面友好,装完基本不用怎么配。如果你是在公司环境、需要连很多台机器、或者带宽比较紧张,TightVNC 更合适,免费且压缩好。如果你是在 Linux 服务器上装,尤其是 CentOS 7 这种,TightVNC 或者系统自带的 TigerVNC 往往是更顺手的选择。
提示:RealVNC 的个人免费版仅限非商业用途,公司环境使用需要购买授权。这一点在安装时会让你选择,别选错了。
2.3 安装包从哪里获取
安装包获取这件事,我建议只从官方渠道拿。RealVNC 的官网是 realvnc.com,TightVNC 的官网是 tightvnc.com。这两个站点都能直接下载到对应平台的安装包。国内一些软件站也有搬运,但版本可能偏旧,而且有捆绑风险,不太建议。
如果你在麒麟操作系统或者 CentOS 7 上装,通常不需要去官网下 exe,而是用系统自带的包管理器。CentOS 7 上一般是yum install tigervnc-server,麒麟系统基于 Linux,也有对应的软件源。这个后面会详细说。
关于“附安装包”这个事,我的态度是:能自己下就自己下,官网的包最干净。如果实在访问不了官网,再考虑其他途径,但一定要校验文件哈希,别装到来路不明的包。
3. Windows 平台 VNC Server 安装全流程
3.1 下载与安装前的准备
在 Windows 上装 VNC Server,第一步是确认你的系统版本和位数。右键“此电脑”或者“计算机”,选“属性”,就能看到是 Windows 7 还是 Windows 10、是 32 位还是 64 位。这个信息决定了你下哪个安装包。
RealVNC 的下载页面会列出不同版本,一般选“VNC Connect”下面的“VNC Server”。下载下来是个 exe 文件,双击就能装。TightVNC 类似,下载页有“TightVNC for Windows”的安装包。
安装前有几件事建议先做:
- 关闭杀毒软件的实时防护,有些杀软会拦截 VNC Server 的安装,尤其是 TightVNC 这种会注册系统服务的;
- 确认你有管理员权限,VNC Server 要装成系统服务,没管理员权限装不完整;
- 记下你打算用的端口,默认是 5900,如果这台机器上已经有别的服务占了,需要改。
注意:Windows 7 上装 RealVNC 时,可能会提示缺少某个系统更新或者 .NET 版本。遇到这种情况,先去 Windows Update 把能打的补丁打上,再装 VNC。
3.2 RealVNC Server 安装步骤详解
RealVNC 的安装流程算是比较标准的 Windows 安装向导。双击 exe 后,依次是欢迎界面、许可协议、安装路径选择、组件选择、开始安装、完成。
几个关键点:
安装路径。默认是C:\Program Files\RealVNC\VNC Server。很多人问“RealVNC 只能装在 C 盘吗”,答案是可以改。在安装向导里有一个“Destination Folder”或者“更改”按钮,点进去就能选别的盘。但我要提醒一句,改路径本身没问题,但如果你后面要配置服务、要写注册表,路径变了之后有些脚本可能需要跟着改。如果你没有特殊需求,默认 C 盘其实最省事。
组件选择。RealVNC 安装时会问你要不要装 Viewer、要不要装 Server、要不要装打印驱动之类的。如果你这台机器只是被控端,只装 Server 就行;如果你还想连别人,把 Viewer 也勾上。打印驱动是给远程打印用的,一般用不上,可以不装。
许可类型。安装过程中会让你选“个人使用”还是“商业使用”。个人使用免费,但功能有限制,比如不能用于商业环境。选错了后面改起来麻烦,所以一开始就想清楚。
服务模式。RealVNC Server 默认装成系统服务,这样开机就能启动,不用登录也能连。这个模式适合服务器场景。如果你只是临时用,也可以选“用户模式”,但那样必须有人登录着才能连。
装完之后,RealVNC 会在系统托盘放一个图标,右键能看到“Options”“Licensing”“Status”这些菜单。第一次用需要设置一个连接密码,这个密码是别人连你时输入的,不是你的 Windows 登录密码,别搞混了。
3.3 TightVNC Server 安装与配置要点
TightVNC 的安装包比 RealVNC 小很多,安装过程也更快。双击后基本一路“Next”,但有几个地方要停一下。
选择安装类型。TightVNC 会问你是“Typical”还是“Custom”。Typical 会装 Server 和 Viewer,Custom 可以只装其中一个。如果你只要被控,选 Custom 然后只勾 Server。
设置密码。安装过程中会让你设两个密码:一个“Primary Password”用于完全控制,一个“View-Only Password”用于只看不操作。这两个密码可以设成一样,也可以不一样。View-Only 这个功能在演示场景下挺有用,比如你给别人看你的屏幕但不让他动鼠标。
端口配置。TightVNC 默认用 5900 端口,对应第一个显示号。如果你要开多个桌面,端口会依次是 5901、5902 这样。安装时一般不用改,装完在配置界面里改也行。
服务注册。TightVNC 会问你要不要注册成系统服务。选“是”的话,开机自动启动,不用登录也能连。选“否”的话,只有你手动运行 TightVNC Server 才能连。
装完之后,TightVNC 的配置界面在开始菜单里能找到,叫“TightVNC Service Configuration”。里面可以改密码、改端口、设置访问控制。TightVNC 的访问控制比 RealVNC 细一些,可以按 IP 段限制谁能连。
3.4 Windows 防火墙与端口放行
这一步是新手最容易漏的。VNC Server 装好了,服务也起来了,但别人就是连不上,十有八九是防火墙没放行。
Windows 防火墙默认会拦截入站的 5900 端口。你需要手动加一条规则。操作路径是:控制面板 → 系统和安全 → Windows Defender 防火墙 → 高级设置 → 入站规则 → 新建规则。选“端口”,下一步,选“TCP”,特定本地端口填 5900,下一步,选“允许连接”,下一步,三个配置文件都勾上,下一步,起个名字比如“VNC Server”,完成。
如果你用的是 TightVNC 并且开了多个显示号,那 5900 到 5905 都要放行。RealVNC 除了 5900,还可能用到 5800(HTTP 方式)和 5500(某些管理功能),但一般只放 5900 就够。
提示:有些安全软件会自己接管防火墙,比如某些国产安全卫士。这种情况下 Windows 防火墙的规则可能不生效,需要在安全软件里单独放行。
3.5 验证服务是否正常运行
装完、配完、放行完,怎么确认 VNC Server 真的在跑?有几个办法。
第一,看系统托盘图标。RealVNC 和 TightVNC 装好后都会在托盘显示图标,图标正常就说明服务在跑。如果图标是灰的或者带个红叉,说明服务没起来。
第二,看服务列表。按 Win+R,输入services.msc,回车,在列表里找“RealVNC Server”或者“TightVNC Server”。状态显示“正在运行”就对了。如果没运行,右键启动一下,看看有没有报错。
第三,用netstat看端口。打开命令提示符,输入netstat -an | findstr 5900,如果看到0.0.0.0:5900或者[::]:5900处于 LISTENING 状态,说明端口在监听。
第四,本机自连测试。在同一台机器上装个 VNC Viewer,连127.0.0.1:5900,能连上就说明服务端没问题。这一步能排除掉服务端配置错误,把问题范围缩小到网络层面。
4. Linux 平台 VNC Server 安装实战
4.1 CentOS 7 上安装 VNC Server 的完整流程
CentOS 7 上装 VNC,最省事的方案是用 TigerVNC,它在 EPEL 源或者基础源里就有。流程大致是:装包、配服务、设密码、开防火墙、启动。
先装包:
yum install -y tigervnc-server装完之后,需要为每个要用的用户配置一个服务实例。CentOS 7 用的是 systemd,所以配置方式和老版本不一样。复制一份模板:
cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service然后编辑这个文件,把里面的<USER>替换成你的实际用户名。比如用户叫ops,就把所有<USER>改成ops。改完之后重新加载 systemd:
systemctl daemon-reload接着切换到那个用户,设置 VNC 密码:
su - ops vncpasswdvncpasswd会问你输入密码和确认密码,还会问要不要设一个 view-only 密码,一般选 n 就行。
然后启动服务:
systemctl start vncserver@:1.service systemctl enable vncserver@:1.service防火墙放行:
firewall-cmd --permanent --add-port=5901/tcp firewall-cmd --reload这样 5901 端口就对应第一个 VNC 桌面。注意 CentOS 7 上第一个桌面是:1,端口是 5901,不是 5900。5900 对应的是:0,但:0通常被物理显示占用,所以远程桌面从:1开始。
4.2 麒麟操作系统安装 VNC 的注意事项
麒麟操作系统基于 Linux,装 VNC 的思路和 CentOS 类似,但软件源和包名可能不一样。麒麟一般有自己的软件源,里面通常有tigervnc或者vncserver包。你可以先用apt或者yum搜一下:
apt search vnc # 或者 yum search vnc找到对应的包名后安装。麒麟的桌面环境可能是 UKUI 或者 MATE,VNC 连上后看到的桌面取决于你启动 VNC Server 时用的会话配置。如果连上后是黑屏或者只有终端,说明~/.vnc/xstartup文件没配好。
xstartup是 VNC 启动桌面时执行的脚本,它决定了你连上后看到什么。默认的xstartup可能只启动了一个很简陋的窗口管理器。你需要根据你的桌面环境改这个文件。比如 UKUI 的话,里面应该有ukui-session或者类似的启动命令;MATE 的话是mate-session。
改完xstartup后要给它执行权限:
chmod +x ~/.vnc/xstartup然后重启 VNC 服务。这一步在麒麟上尤其重要,因为麒麟的桌面环境和标准 GNOME 有差异,默认配置经常不适用。
4.3 xstartup 配置与桌面环境选择
xstartup这个文件是 Linux 上 VNC 配置的核心,也是最容易出问题的地方。它的作用是在 VNC 会话启动时,告诉系统要运行哪个桌面环境。
一个典型的xstartup长这样:
#!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS exec /etc/X11/xinit/xinitrc但xinitrc启动的桌面可能不是你想要的。如果你想指定 GNOME,可以改成:
#!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS gnome-session &如果是 KDE:
startkde &如果是 XFCE:
xfce4-session &改完之后记得重启 VNC 服务,然后重新连。如果连上后还是黑屏,检查一下~/.vnc/目录下的日志文件,里面通常会有错误信息,比如某个命令找不到、某个库缺失。
注意:有些桌面环境在 VNC 下需要额外的环境变量,比如
XDG_CURRENT_DESKTOP。如果桌面启动不正常,可以在xstartup里加上export XDG_CURRENT_DESKTOP=GNOME之类的设置。
4.4 多用户与多桌面配置
一台 Linux 机器上可以同时跑多个 VNC 桌面,每个桌面属于不同用户,或者同一个用户开多个。实现方式是用不同的显示号。
比如用户ops要开两个桌面,可以启动vncserver@:1和vncserver@:2,分别对应 5901 和 5902 端口。每个显示号有自己的xstartup和日志,互不干扰。
多用户的话,每个用户都要单独配置服务实例。比如ops用:1,dev用:2。配置方式和单用户一样,只是把模板里的用户名换成对应的。
这里有个细节:vncserver@.service模板里的%i是显示号,<USER>是用户名。如果你要支持多用户,可以复制多份模板,每份改一个用户名。也可以用 systemd 的实例化机制,但那样配置起来更复杂,一般手动复制就够了。
端口和显示号的对应关系是:显示号 N 对应端口 5900+N。所以:1是 5901,:2是 5902,以此类推。防火墙要把这些端口都放行。
5. VNC Viewer 客户端使用与连接技巧
5.1 VNC Viewer 下载与安装
VNC Viewer 是客户端,装在你用来控制的机器上。RealVNC 的 Viewer 和 TightVNC 的 Viewer 都能用,但建议和服务端配套。
RealVNC Viewer 的安装很简单,下载 exe,双击,一路 Next。装完后打开,界面是一个地址栏加一个连接列表。你可以在地址栏输入IP:端口,比如192.168.1.100:5900,回车就能连。
TightVNC Viewer 更轻量,甚至有个免安装版,解压就能用。它的界面更朴素,但功能该有的都有。
VNC Viewer 一般不需要管理员权限,普通用户就能装。如果你只是偶尔连一下,用免安装版最方便。
5.2 连接参数详解
在 VNC Viewer 里连一台机器,地址格式是IP:显示号或者IP:端口。这两种写法有区别。
IP:1表示显示号 1,对应端口 5901。IP:5901表示直接指定端口 5901。大多数情况下两种写法等价,但有些 Viewer 对显示号的支持更好,有些对端口更直接。我一般用IP:端口的写法,不容易搞混。
连接时会让你输入密码,这个密码是 VNC Server 那边设的,不是系统登录密码。如果服务端设了 view-only 密码,你输入那个密码就只能看不能操作。
RealVNC Viewer 还会问你要不要保存密码,保存了下次就不用再输。如果是公共机器,建议不保存。
连接成功后,Viewer 窗口上方有个工具栏,里面有发送 Ctrl+Alt+Del、切换全屏、调整画质这些功能。画质调整在带宽不好的时候很有用,可以调成“Low”或者“Medium”,牺牲一点清晰度换流畅度。
5.3 画质与性能调优
VNC 的画质和性能是一对矛盾。画质越高,传输的数据越多,带宽不够就会卡。VNC Viewer 一般提供几档画质选项:
- High:画质最好,适合局域网;
- Medium:平衡,适合一般宽带;
- Low:画质差但流畅,适合慢速网络;
- Auto:根据网络情况自动调整。
除了画质,还有几个参数影响性能:
颜色深度。VNC 支持 8 位、16 位、24 位色。颜色深度越低,数据量越小。如果只是看文字界面,8 位色就够;如果要看图片或者视频,得用 24 位。
编码方式。TightVNC 支持 Tight 编码,压缩率比标准 VNC 编码高。RealVNC 有自己的编码优化。这些一般在 Viewer 里自动协商,不用手动设。
JPEG 压缩。有些 Viewer 支持对画面做 JPEG 压缩,进一步减小数据量,但会有压缩痕迹。在带宽极差的时候可以开。
我实测下来,局域网内用 High 画质基本无感,跨城宽带用 Medium 比较稳,手机热点这种用 Low 才不卡。
5.4 常见连接失败原因速查
连不上是 VNC 使用中最常见的问题。我把可能的原因和排查方法整理成表:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| Connection refused | 服务端没启动或端口没监听 | 服务端netstat看端口 |
| Connection timed out | 防火墙拦截或网络不通 | ping 测试,检查防火墙规则 |
| 能连上但黑屏 | xstartup 配置错误 | 看~/.vnc/日志 |
| 能连上但只有终端 | 桌面环境没启动 | 改 xstartup 启动桌面 |
| 密码错误 | 密码记错或大小写问题 | 重新设密码 |
| 连上就断 | 网络不稳或编码不兼容 | 换画质,换 Viewer |
| 鼠标键盘无响应 | view-only 模式或权限问题 | 检查密码类型 |
排查顺序建议从下往上:先确认服务端在跑,再确认端口在监听,再确认防火墙放行,再确认网络可达,最后才怀疑 Viewer 配置。这样能最快定位问题。
6. 实操避坑与经验总结
6.1 安装过程中的典型坑
坑一:RealVNC 装完提示“服务未启动”。这种情况多半是安装时没选“系统服务”模式,或者杀软拦截了服务注册。解决办法是重新运行安装程序,选“修改”,把服务模式改成系统服务,同时临时关掉杀软。
坑二:Windows 7 上装 TightVNC 后连不上。Windows 7 的防火墙规则和 Windows 10 略有不同,有时候入站规则加了也不生效。可以试试把网络位置从“公用网络”改成“家庭网络”或“工作网络”,防火墙策略会宽松一些。
坑三:CentOS 7 上 vncserver 启动失败。最常见的原因是xstartup没有执行权限,或者里面引用的桌面环境没装。先chmod +x,再确认桌面环境包装了没有。
坑四:麒麟系统连上后桌面是黑的。麒麟的桌面环境启动方式和标准 Linux 有差异,xstartup里要写麒麟自己的会话启动命令。可以查一下麒麟的文档,或者看看/usr/share/xsessions/目录下有哪些会话文件,照着写。
坑五:端口改了但连不上。改了 VNC 端口后,防火墙规则也要跟着改。而且有些 Viewer 对非标准端口的支持不好,可能需要用IP:端口的写法而不是IP:显示号。
6.2 安全加固建议
VNC 的默认配置安全性一般,尤其是老版本,密码传输可能不加密。如果要在公网或者不可信网络里用,建议做几件事:
- 改默认端口。5900 是扫描器的重点目标,改成别的端口能减少被扫到的概率;
- 设强密码。VNC 密码一般限制在 8 位以内,这是协议限制,所以更要选复杂点的;
- 限制访问 IP。TightVNC 和 RealVNC 都支持按 IP 段限制,只允许特定网段连;
- 走 SSH 隧道。如果服务端有 SSH,可以把 VNC 端口通过 SSH 隧道转发,这样 VNC 流量就在加密通道里了。具体做法是本地
ssh -L 5901:localhost:5901 user@server,然后 Viewer 连localhost:5901; - 及时更新。老版本 VNC 可能有已知问题,尽量用新版本。
提示:SSH 隧道这种方式在跨网络访问时特别有用,既加密又不用把 VNC 端口直接暴露出去。配置起来也不复杂,一条命令的事。
6.3 我个人的使用体会
用了这么多年 VNC,我最大的感受是:它不完美,但足够可靠。商业远控软件功能多、体验好,但要么收费、要么有设备数限制、要么依赖厂商服务器。VNC 没这些约束,装完就能用,协议开放,客户端随便换。
另一个体会是,配置比安装重要。VNC 装起来都不难,难的是装完之后的各种配置:防火墙、xstartup、端口、密码。这些地方任何一个出问题都会导致连不上,而且报错信息往往不明确。所以我的习惯是,装完先本机自连测试,确认服务端没问题,再去搞网络和防火墙。
最后分享一个小技巧:如果你经常要在多台机器之间切换,可以给每台机器在 Viewer 里起个有意义的名字,比如“机房-01”“测试机-02”,比记 IP 方便多了。RealVNC Viewer 和 TightVNC Viewer 都支持地址簿功能,把常用的连接存进去,下次直接点就行。