How to Install and Configure VNC on Debian

介绍

VNC (Virtual Network Computer)是 虚拟网络 计算机的缩写。VNC 是一款优秀的 远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的。VNC 是在基于 UNIX 和 Linux 操作系统的免费的 开源软件, 远程控制能力强大,高效实用,其性能可以和 Windows 和 MAC 中的任何远程控制软件媲美。 在 Linux 中,VNC 包括以下四个命令:vncserver,vncviewer,vncpasswd,和 vncconnect。大多数情况下用户只需要其中的两个命令:vncserver 和 vncviewer。

命令描述

VNC工作流程 (1) 在服务器端启动 VNC Server。 (2) VNC客户端通过浏览器或 VNC Viewer 连接至VNC Server。 (3) VNC Server传送一对话窗口至客户端,要求输入连接密码, 以及存取的VNC Server显示装置。 (4) 在客户端输入联机密码后,VNC Server验证客户端是否具有存取权限。 (5) 若是客户端通过 VNC Server 的验证,客户端即要求VNC Server显示桌面环境。 (6) VNC Server通过X Protocol 要求X Server将画面显示控制权交由VNC Server负责。 (7) VNC Server将来由 X Server 的桌面环境利用VNC通信协议送至客户端, 并且允许客户端控制VNC Server的桌面环境及输入装置。

本文将使用TightVNC在Debian系上创建VNCServer以及如何使用VNCViewer通过SSH隧道连接VNCServer。

安装桌面环境和VNCServer

Xfce 是一个基于 GTK+2 的轻量级模块化的 桌面环境。如果需要的话,还可以安装 xfce4-goodies 包组。此包组提供了一些额外的插件和一些有用的工具,如 mousepad 编辑器。

sudo apt install xfce4 xfce4-goodies

安装 TightVNC server:

sudo apt install tightvncserver

运行 vncserver 命令,并设置VNC访问密码,创建一个配置文件,并启动一个服务实例。

vncserver
OutputYou will require a password to access your desktops.

Password:
Verify:

密码强度6-8位,超过8位会被自动截断。 设置访问密码后,会询问只读密码,可以选择否。

重要的是,默认服务端口 5901,对应的显示端口为 :1:2 对应5902, :3 对应 5903, 以此类推。

OutputWould you like to enter a view-only password (y/n)? n
xauth:  file /home/sandy/.Xauthority does not exist

New 'X' desktop is your_hostname:1

Creating default startup script /home/sandy/.vnc/xstartup
Starting applications specified in /home/sandy/.vnc/xstartup
Log file is /home/sandy/.vnc/your_hostname:1.log

你也可以再次运行 vncpasswd 修改密码。

vncpasswd

配置 VNC Server

配置VNC Server前,先停止运行在默认端口5901的实例:

vncserver -kill :1
OutputKilling Xtightvnc process ID 17648

修改配置 xstartup文件前,先备份一下:

mv ~/.vnc/xstartup ~/.vnc/xstartup.bak

现在创建新的配置文件:

vim ~/.vnc/xstartup

写入以下内容到配置文件:~/.vnc/xstartup

#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &

第一行是 shebang.在*nix系统, shebang告诉系统使用什么解释器来执行此文件。

第一条命令: xrdb $HOME/.Xresources,加载个性化的桌面环境,比如终端颜色、主题、字体等。

第二条命令:启动 Xfce桌面环境。

保存退出后,给予执行权限:

chmod +x ~/.vnc/xstartup

再次启动 VNC server:

vncserver -localhost :99

注意,这次命令包含了-localhost选项,它将VNC服务器绑定到服务器的loopback接口。这将导致VNC只允许来自它所安装的服务器的连接。

参数:99将使用5999的服务端口,显示端口对应为99

如果服务器安装了虚拟机,大概率默认端口5901是被占用的了,此时建议使用大一点的端口号,比如50~99.

输出大概是这样:

OutputNew 'X' desktop is your_hostname:99

Starting applications specified in /home/sandy/.vnc/xstartup
Log file is /home/sandy/.vnc/your_hostname:99.log

通过SSH隧道连接VNC

vnc默认监听5901端口,连接时不加密,所以认为是一个不安全的连接。 ssh连接是相对安全的,vnc可以设置监听地址为本地,通过ssh隧道去连接vnc可以认为是较安全可靠的。

创建一个本地端口转发(隧道):

ssh -L 6901:localhost:5901 -C -N -l sandy your_server_ip

这个命令建立一个SSH隧道,通过端口22 (SSH的默认端口)将信息从VNC服务器上的5901端口转发到本地机器上的6901端口。

这里的localhost指的是your_server_ip,因为目标主机是相对your_server_ip而言的,也可以替换为127.0.0.1。

其他参数的含义:

至于ssh的访问许可,需要输入口令,或者提前使用ssh-copy-id建立可信通道。

也可以借助sshpass在命令中传入密码:

sshpass -p vncserver_host_user_passwd ssh -L 6901:localhost:5901 -C -N -l sandy your_server_ip

VNC客户端

使用VNC 客户端连接 localhost:6901,可能需要你输入前面设置的VNCServer访问密码。

这里我们使用xtightvncviewer

sudo apt install -y sshpass tigervnc-common xtightvncviewer

可以指定密码文件:

xtightvncviewer -passwd ~/your_server_ip.pass localhost:6901

创建VNCServer系统服务

创建一个服务文件: /etc/systemd/system/[email protected]:

sudo vim /etc/systemd/system/[email protected]

名字后面的@符号可以让我们传入一个参数,使用它来指定管理服务时希望使用的VNC显示端口。

[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target

[Service]
Type=forking
User=sandy
Group=sandy
WorkingDirectory=/home/sandy

PIDFile=/home/sandy/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1920x1080 -localhost :%i
ExecStop=/usr/bin/vncserver -kill :%i

[Install]
WantedBy=multi-user.target

让systemd unit重新加载:

sudo systemctl daemon-reload

加入自启服务:

sudo systemctl enable [email protected]

如果实例在运行,停止它:

vncserver -kill :99

启动服务:

sudo systemctl start [email protected]

查看服务状态:

sudo systemctl status [email protected]

启动正常,输出大概为:

Output● [email protected] - Start TightVNC server at startup
     Loaded: loaded (/etc/systemd/system/[email protected]; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2020-05-07 17:23:50 UTC; 6s ago
    Process: 39768 ExecStartPre=/usr/bin/vncserver -kill :1 > /dev/null 2>&1 (code=exited, status=2)
    Process: 39772 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :1 (code=exited, status=0/SUCCESS)
   Main PID: 39795 (Xtightvnc)

VNCServer脚本

项目地址: https://github.com/sandylaw/shellcripts/tree/main/vnc

用法:

Reference: