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 ViewerTightVNC是另一个实现主打压缩效率在带宽紧张的环境下表现更好而且完全免费VNC Viewer是客户端用来连别人的 VNC ServerVNC Server是服务端装在被控制的机器上。所以你在下载的时候要先想清楚自己是要装“被控端”还是“主控端”。如果是要让别人连你就装 Server如果是要连别人就装 Viewer。RealVNC 和 TightVNC 都同时提供 Server 和 Viewer但它们的授权模式不一样。2.2 RealVNC 和 TightVNC 怎么选这是问得最多的问题之一。我直接给结论然后说理由。对比项RealVNCTightVNC授权模式个人免费商业用途需付费完全免费开源压缩效率一般较高低带宽下更流畅跨平台Windows、macOS、Linux、部分嵌入式Windows、Linux安装包大小较大较小配置复杂度图形化配置较友好配置文件为主稍复杂老系统兼容Windows 7 支持较好Windows 7 支持好麒麟/CentOS有对应版本主要通过包管理器安装如果你是自己用、连家里电脑或者个人服务器RealVNC 的个人版够用界面友好装完基本不用怎么配。如果你是在公司环境、需要连很多台机器、或者带宽比较紧张TightVNC 更合适免费且压缩好。如果你是在 Linux 服务器上装尤其是 CentOS 7 这种TightVNC 或者系统自带的 TigerVNC 往往是更顺手的选择。提示RealVNC 的个人免费版仅限非商业用途公司环境使用需要购买授权。这一点在安装时会让你选择别选错了。2.3 安装包从哪里获取安装包获取这件事我建议只从官方渠道拿。RealVNC 的官网是 realvnc.comTightVNC 的官网是 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 和 ViewerCustom 可以只装其中一个。如果你只要被控选 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还可能用到 5800HTTP 方式和 5500某些管理功能但一般只放 5900 就够。提示有些安全软件会自己接管防火墙比如某些国产安全卫士。这种情况下 Windows 防火墙的规则可能不生效需要在安全软件里单独放行。3.5 验证服务是否正常运行装完、配完、放行完怎么确认 VNC Server 真的在跑有几个办法。第一看系统托盘图标。RealVNC 和 TightVNC 装好后都会在托盘显示图标图标正常就说明服务在跑。如果图标是灰的或者带个红叉说明服务没起来。第二看服务列表。按 WinR输入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。改完之后重新加载 systemdsystemctl daemon-reload接着切换到那个用户设置 VNC 密码su - ops vncpasswdvncpasswd会问你输入密码和确认密码还会问要不要设一个 view-only 密码一般选 n 就行。然后启动服务systemctl start vncserver:1.service systemctl enable vncserver:1.service防火墙放行firewall-cmd --permanent --add-port5901/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 或者 MATEVNC 连上后看到的桌面取决于你启动 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 如果是 KDEstartkde 如果是 XFCExfce4-session 改完之后记得重启 VNC 服务然后重新连。如果连上后还是黑屏检查一下~/.vnc/目录下的日志文件里面通常会有错误信息比如某个命令找不到、某个库缺失。注意有些桌面环境在 VNC 下需要额外的环境变量比如XDG_CURRENT_DESKTOP。如果桌面启动不正常可以在xstartup里加上export XDG_CURRENT_DESKTOPGNOME之类的设置。4.4 多用户与多桌面配置一台 Linux 机器上可以同时跑多个 VNC 桌面每个桌面属于不同用户或者同一个用户开多个。实现方式是用不同的显示号。比如用户ops要开两个桌面可以启动vncserver:1和vncserver:2分别对应 5901 和 5902 端口。每个显示号有自己的xstartup和日志互不干扰。多用户的话每个用户都要单独配置服务实例。比如ops用:1dev用:2。配置方式和单用户一样只是把模板里的用户名换成对应的。这里有个细节vncserver.service模板里的%i是显示号USER是用户名。如果你要支持多用户可以复制多份模板每份改一个用户名。也可以用 systemd 的实例化机制但那样配置起来更复杂一般手动复制就够了。端口和显示号的对应关系是显示号 N 对应端口 5900N。所以: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 窗口上方有个工具栏里面有发送 CtrlAltDel、切换全屏、调整画质这些功能。画质调整在带宽不好的时候很有用可以调成“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 userserver然后 Viewer 连localhost:5901及时更新。老版本 VNC 可能有已知问题尽量用新版本。提示SSH 隧道这种方式在跨网络访问时特别有用既加密又不用把 VNC 端口直接暴露出去。配置起来也不复杂一条命令的事。6.3 我个人的使用体会用了这么多年 VNC我最大的感受是它不完美但足够可靠。商业远控软件功能多、体验好但要么收费、要么有设备数限制、要么依赖厂商服务器。VNC 没这些约束装完就能用协议开放客户端随便换。另一个体会是配置比安装重要。VNC 装起来都不难难的是装完之后的各种配置防火墙、xstartup、端口、密码。这些地方任何一个出问题都会导致连不上而且报错信息往往不明确。所以我的习惯是装完先本机自连测试确认服务端没问题再去搞网络和防火墙。最后分享一个小技巧如果你经常要在多台机器之间切换可以给每台机器在 Viewer 里起个有意义的名字比如“机房-01”“测试机-02”比记 IP 方便多了。RealVNC Viewer 和 TightVNC Viewer 都支持地址簿功能把常用的连接存进去下次直接点就行。