本教程介绍如何在 Debian 9 上安装和配置 VNC 服务器。我们还将向您展示如何创建 SSH 隧道并安全地连接到 VNC 服务器。

虚拟网络计算 (VNC) 是一种图形桌面共享系统,允许您使用键盘和鼠标远程控制另一台计算机。

先决条件

在继续本教程之前,请确保您已以具有 sudo 权限的用户身份登录。

安装桌面环境

您的 Debian 服务器可能未安装桌面环境。我们的第一步是安装一个轻量级桌面环境。

Debian 软件源中有多种桌面环境 (DE) 可供选择。我们将使用 Xfce 作为首选桌面环境。它快速、稳定且轻量,非常适合在远程服务器上运行。

使用以下命令更新包索引并在您的 Debian 服务器上安装 Xfce:

终端

sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils

根据您的系统,下载和安装 Xfce 包可能需要一些时间。

安装 VNC 服务器

Debian 软件源中也有多种不同的 VNC 服务器可用,例如 TightVNC、TigerVNC 和 x11vnc。每个 VNC 服务器在速度和安全性方面都有其优缺点。

我们将使用 TigerVNC,这是一个积极维护的高性能 VNC 服务器。要在您的 Debian 服务器上安装 TigerVNC,请执行以下命令:

终端

sudo apt install tigervnc-standalone-server tigervnc-common

VNC 服务器安装完成后,运行 vncserver 命令以创建初始配置并设置密码。运行以下命令时请勿使用 sudo:

终端

vncserver

系统将提示您输入并确认密码,以及是否将其设置为仅查看密码。如果您选择设置仅查看密码,用户将无法使用鼠标和键盘与 VNC 实例进行交互。

输出

You will require a password to access your desktops.

Password:
Verify:
Would you like to enter a view-only password (y/n)? n
/usr/bin/xauth:  file /home/linuxize/.Xauthority does not exist

New 'debian9.localdomain:1 (linuxize)' desktop at:1 on machine debian9.localdomain

Starting applications specified in /etc/X11/Xvnc-session
Log file is /home/linuxize/.vnc/debian9.localdomain:1.log

Use xtigervncviewer -SecurityTypes VncAuth -passwd /home/linuxize/.vnc/passwd:1 to connect to the VNC server.

首次运行 vncserver 命令时,它将在 ~/.vnc 目录中创建并存储密码文件。

注意输出中主机名后面的 :1。这表示 VNC 服务器运行的显示端口号。在我们的案例中,服务器运行在 TCP 端口 5901 (5900+1)。如果您使用 vncserver 创建第二个实例,它将运行在下一个空闲端口,即 :2,这意味着服务器运行在端口 5902 (5900+2)。

重要的是要注意,在使用 VNC 服务器时,:X 是一个显示端口,指的是 5900+X。

在继续下一步之前,使用带有 -kill 选项的 vncserver 命令和服务器号作为参数停止 VNC 实例。在这种情况下,服务器运行在端口 5901 (:1),因此我们将使用以下命令停止它:

终端

vncserver -kill:1

输出

Killing Xtigervnc process ID 6677... success!

配置 VNC 服务器

现在 Xfce 和 TigerVNC 都已安装在机器上,我们需要配置 TigerVNC 以使用 Xfce。为此,创建以下文件:

终端

nano ~/.vnc/xstartup

~/.vnc/xstartupsh

#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
exec startxfce4 

完成后,保存并关闭文件。每当启动或重启 TigerVNC 服务器时,上述脚本将自动执行。

~/.vnc/xstartup 文件还需要具有执行权限。运行以下 chmod 命令以确保权限正确:

终端

chmod u+x ~/.vnc/xstartup

如果需要向 VNC 服务器传递其他选项,可以创建一个名为 config 的文件,每行添加一个选项。示例如下:

~/.vnc/configconf

geometry=1920x1080
dpi=96

创建 Systemd 单元文件

systemd 单元文件将允许我们根据需要轻松启动、停止和重启 VNC 服务。

打开文本编辑器,并将以下配置复制粘贴到其中。别忘了在第 7 行更改用户名以匹配您的用户名。

终端

sudo nano /etc/systemd/system/vncserver@.service

/etc/systemd/system/vncserver@.servicesystemd

[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=simple
User=linuxize
PAMName=login
PIDFile=/home/%u/.vnc/%H%i.pid
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill:%i > /dev/null 2>&1 ||:'
ExecStart=/usr/bin/vncserver:%i -geometry 1440x900 -alwaysshared -fg
ExecStop=/usr/bin/vncserver -kill:%i

[Install]
WantedBy=multi-user.target

保存并关闭文件。

运行以下命令通知 systemd 存在新的 vncserver@.service 文件:

终端

sudo systemctl daemon-reload

接下来,启用该服务:

终端

sudo systemctl enable vncserver@1.service

@ 符号后面的数字 1 定义了 VNC 服务将运行的显示端口。正如我们在上一节中讨论的,由于我们使用 1,VNC 服务器将监听端口 5901。

通过执行以下命令启动 VNC 服务:

终端

sudo systemctl start vncserver@1.service

使用以下命令验证服务是否成功启动:

终端

sudo systemctl status vncserver@1.service

输出

● vncserver@1.service - Remote desktop service (VNC)
   Loaded: loaded (/etc/systemd/system/vncserver@.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-10-03 05:23:33 PDT; 51s ago
  Process: 7063 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill:1 > /dev/null 2>&1 ||: (code=exited, status=0/SUCCESS)
 Main PID: 7071 (vncserver)
    Tasks: 0 (limit: 4915)
   CGroup: /system.slice/system-vncserver.slice/vncserver@1.service
           ‣ 7071 /usr/bin/perl /usr/bin/vncserver:1 -geometry 1440x900 -alwaysshared -fg

连接到 VNC 服务器

VNC 不是加密协议,可能会受到数据包嗅探的影响。建议的方法是创建 SSH 隧道,将本地机器上的端口 5901 的流量安全地转发到服务器的同一端口。

在 Linux 和 macOS 上设置 SSH 隧道

如果您的机器运行的是 Linux、macOS 或任何其他基于 Unix 的操作系统,您可以使用 ssh 命令轻松创建 SSH 隧道:

终端

ssh -L 5901:127.0.0.1:5901 -N -f -l username server_ip_address

系统将提示您输入用户密码。

别忘了将 username 和 server_ip_address 替换为您的用户名和服务器的 IP 地址。

在 Windows 上设置 SSH 隧道

如果您运行的是 Windows,可以使用 PuTTY SSH 客户端设置 SSH 隧道。

打开 Putty,并在 Host name or IP address 字段中输入您的服务器 IP 地址。

VNC Putty

在 Connection 菜单下,展开 SSH 并选择 Tunnels。在 Source Port 字段中输入 VNC 服务器端口 (5901),并在 Destination 字段中输入 server_ip_address:5901,然后单击 Add 按钮,如下图所示:

VNC SSH Tunnel Putty

返回 Session 页面以保存设置,这样您就不需要每次都输入它们。现在您需要做的就是选择保存的会话,然后单击 Open 按钮登录远程服务器。

使用 Vncviewer 连接

现在您已经设置了 SSH 隧道,是时候打开您的 Vncviewer 并连接到位于 localhost:5901 的 VNC 服务器了。

您可以使用任何 VNC 查看器,例如 TigerVNC、TightVNC、RealVNC、UltraVNC、Vinagre 和 Google Chrome 的 VNC Viewer。

在本示例中,我们将使用 TigerVNC。打开您的 VNC 查看器,输入 localhost:5901,然后单击 Connect 按钮。

VNC Viewer

当提示时输入您的密码,您应该可以看到默认的 Xfce 桌面。它应该看起来像这样:

VNC SSH XFCE Desktop

至此,您已通过 VNC 成功连接到服务器。现在您可以使用键盘和鼠标从本地机器开始与远程 XFCE 桌面进行交互。