VNC
Virtual Network Computing (VNC) 是一个图形化桌面共享系统, 可以远程连接计算机, 使用键盘和鼠标.
本文包含 在RHEL8上,安装和配置 VNC server 的步骤 . 我们还会展示如何通过SSH通道安全的连接.
环境
- Red Hat Enterprise Linux 7
- Red Hat Enterprise Linux 8.0
- Red Hat Enterprise Linux 8.1
- Red Hat Enterprise Linux 8.2
- tigervnc-server
问题
- 如何通过 VNC 远程使用用户图形界面?
- 如何在RHEL8.0到8.2中配置VNC?
- 升级到RHEL 8.3后,VNC服务器无法启动。
- 安装tigervnc-server-1.10.1-7.el8后,VNC服务器无法启动。
- 使用vncserver命令无法启动Xvnc进程。
- 如何在RHEL 8.3中配置VNC服务器?
- 如何在Red Hat Enterprise Linux 7/8 - 8.2中配置虚拟网络计算(VNC)中提到的Xvnc配置步骤在RHEL 8.3中不起作用。
决议
对于RHEL8.3 + (tigervnc-server-1.10.1-7.el8),请查看 Are there any changes to the default vncserver configuration in RHEL8.3.0?
自动配置
Red Hat Access Labs提供了一个VNC配置器工具,用于根据您的环境和部署目标自动生成VNC配置。VNC配置器合并了本文档中包含的信息,但使生成有效的和支持推荐的配置变得更容易。
注意:此工具不能用于RHEL8。
前提
跟随教程, 您需要以具有 sudo权限 的用户身份登录到远程RHEL8机器上。
安装桌面环境
通常, 服务器没有安装桌面环境. 如果你想连接的机器没有 GUI , 则安装桌面环境. 否则, 跳过.
运行一下命令 安装 Gnome 图形界面, 默认的桌面环境
# yum group install GNOME base-x or # yum groupinstall "Server with GUI"
依赖你的系统, 下载 安装 Gnome 包和一些依赖需要一些时间.
安装 VNC Server
TigerVNC 是 一直被维护的高性能开源 VNC server. 在 RHEL 默认仓库中可用. 安装:
# yum -y install tigervnc-server
注意:
- 为使VNC有用,还需要安装X Windows System和窗口管理器。
- 如果还没有安装图形化桌面环境,请参考: How to install a graphical interface in Red Hat Enterprise Linux
配置 VNC Server
在最新版本的tigervnc-server中,vncserver配置文件的位置已经改变。现在默认的配置文件在/etc/tigervnc/目录下。这个目录中有三个主要文件。
- vncserver.users
- vncserver-config-defaults(默认值)
- vncserver-config-mandatory
在 /etc/tigervnc/vncserver.users 中添加一个用户映射。
通过这个选项,管理员可以将用户映射到一个特定的端口上,映射应该在 /etc/tigervnc/vncserver.users 配置文件中完成。这种映射应该在 /etc/tigervnc/vncserver.users 配置文件中完成。
:x=user
例如:
:1=vncuser1
:2=vncuser2
注意:
Red Hat Enterprise Linux 只支持每个系统的每个 GUI 会话有一个唯一的用户,因此,每个用户使用一个 vnc 会话。因此,每个用户使用一个 vnc session。不要为单个用户配置多个 vnc session。详情请参考: How many GUI sessions can I log a user into?
在RHEL8中, TigerVNC 是使用 systemd 守护进程配置
这个栗子, 我们将告诉你如何配置 TigerVNC 一个或多个VNC用户
- 创建一个 专门使用VNC使用系统的 VNC用户账户(如果不存在).
# useradd <username> # passwd <username>
e.g:
# useradd testuser1 # passwd testuser1
- 之后以用户身份登录,使用 vncpasswd 命令 创建 密码 . 以将要访问VNC服务器的用户运行该命令, 不要使用 sudo 命令:
$ vncpasswd
系统将提示您输入并确认密码,以及是否将其设置为只读密码。 如果选择设置仅查看密码,则用户将无法使用鼠标和键盘与VNC实例进行交互。
第一次运行vncpasswd命令时,会在用户的~/.vnc目录下创建并存储密码文件。
Password:
Verify:
Would you like to enter a view-only password (y/n)? n
A view-only password is not used
如果你添加第二个用户, 切换用户 并且 使用 vncpasswd 设置密码.
为用户创建VNC server 配置文件, 复制原型VNC配置文件并为用户编辑.
e.g:
# cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
- 用文本编译器 编辑
/etc/systemd/system/vncserver@:1.service
文件, 并将 "USER" 字符串 替换 合适的 vncuser 的用户名.在这个例子中,用户将是 "testuser1". - 为每一个实例修改 vncserver@:<num>.service. 你应该为每个用户创建一个单元文件。
注意:
-
- 如果用户是root,请将PIDFile行的路径改为/root/.vnc/%H%i.pid。不适用于RHEL7.8(及以上)和RHEL8.2.0。
- 从RHEL7.8和RHEL8.2.0开始,单元文件的外观与上面的不同。除了替换<USER>之外,不要替换单元文本的其他部分。
- 要添加更多的用户,如上所述,创建一个新的 "vncserver@:#.service "文件,并将 "USER "字符串改为其他用户。
- 要向VNC服务器传递选项,如分辨率、颜色深度等,请按照下面的例子将这些选项添加到ExecStart=中。
ExecStart=/sbin/runuser -l testuser1 -c "/usr/bin/vncserver %i -geometry 1024x768 -depth 24"
2. 下一步, 配置 TigerVNC 使用 Gnome 桌面. VNC 从 ~/.vnc/config 读取用户配置设置.
打开文件 并 添加以下内容:
vim ~/.vnc/config
session=gnome
geometry=1920x1200
localhost
alwaysshared
session选项指定要启动的会话,geometry选项指定VNC桌面的大小。
保存并关闭文件. 如果您要添加多个用户,请重复相同的步骤。
注意:
- 从RHEL7.4开始,支持的服务器选项已经被移到了~/.vnc/目录下的一个名为'config'的新文件中。所以不需要在上面提到的行中添加这些选项。
3. TigerVNC提供了一个文件,允许你将用户映射到一个特定的端口。该映射在 /etc/tigervnc/vncserver.users 文件中配置。
sudo vim /etc/tigervnc/vncserver.users
这个文件 使用 <display_port>=<username>
语法. 在下面的例子中,我们将显示端口:1映射到用户linuxize。使用同样的格式来添加更多的用户。
# TigerVNC User assignment # # This file assigns users to specific VNC display numbers. # The syntax is <display>=<username>. E.g.: # # :2=andrew # :3=lisa :1=linuxize
:1是VNC服务器运行的显示端口号。在我们的例子中,服务器运行在TCP端口5901(5900+1)上。例如,如果将另一个用户映射到显示端口:2,服务器也将在5902端口(5900+2)上监听。
需要理解的是,在使用VNC服务器时,:X是指5900+X的显示端口。
配置 防火墙
- 接下来配置防火墙接受VNC的传入连接。执行此命令,在防火墙中打开与VNC相关的端口。
# firewall-cmd --permanent --zone=public --add-port 5901/tcp
- 该命令只为传入的连接打开TCP端口5901。当需要时,同样的命令也可以用来打开其他端口。
- 重新加载防火墙,使防火墙规则生效。
# firewall-cmd --reload
-
重载配置文件
# systemctl daemon-reload
启动 TigerVNC Server
启动并开机启动 vnc service:
- 要确保服务在系统启动时启动。
# systemctl enable vncserver@:1.service
- 为映射的 显示端口:1 的用户 启动 和 允许开机启动 VNC service , 输入:
sudo systemctl enable vncserver@:1 --now
VNC Server 将 监听 端口 5901
- 配置完成后, 最后一步 启动 VNC Server.
# systemctl start vncserver@:1.service
你可以通过以下方式 验证 service 是否 成功 启动:
sudo systemctl status vncserver@:1
vncserver@:1.service - Remote desktop service (VNC) Loaded: loaded (/usr/lib/systemd/system/vncserver@.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2020-12-17 21:49:41 UTC; 8s ago
...
要为其他用户启用VNC,只需将1替换为映射到用户的显示端口。
连接 VNC Server
VNC不是加密协议,可能会受到数据包嗅探。推荐的方法是创建一个SSH隧道,将本地机器上5901端口的流量安全地转发到同一端口的远程服务器上。
在Linux和macOS上设置SSH隧道。
如果你的机器上运行的是 Linux、macOS 或任何其他基于 Unix 的操作系统,你可以使用下面的 ssh 命令轻松创建一个隧道。
ssh -L 5901:127.0.0.1:5901 -N -f -l username remote_server_ip
提示你输入用户密码.
不要忘记 将 username 和 server_ip-address 替换为 你的 username 和 IP address.
在 Windows 上设置 SSH 通道
Windows用户 可以用 PuTTY 设置 SSH 通道
在 Connection 菜单里, 展开 SSH, 选择 Tunnels. 在 Source Port 字段输入 VNC Server port (5901) . 在 Destination 字段 输入 server_ip_address:5901, 并点击 Add 按钮, 如下图所示:
回到会话页面保存设置,这样你就不需要每次都输入。要登录到远程服务器,选择已保存的会话并点击打开按钮。
使用 Vncviewer 连接
要连接到远程服务器,打开VNC查看器,输入localhost:5901。
你可以使用任何VNC查看器,如TigerVNC、TightVNC、RealVNC、UltraVNC、Vinagre和VNC Viewer for Google Chrome。
我们使用的是TigerVNC。
当提示输入密码时,你应该看到默认的Gnome桌面。它应该看起来像这样。
就是这样!你现在可以从本地机器使用键盘和鼠标在远程桌面上工作了。现在,您可以使用键盘和鼠标从您的本地机器开始在远程桌面上工作。
结论
我们已经向大家展示了如何设置VNC服务器并连接到远程 RHEL8。
配置 桌面 环境:
-
vnc的用户特定配置文件位于用户主目录下的'.vnc'目录中,(例如:/home/username/.vnc/)。(例如:/home/username/.vnc/)。在你喜欢的编辑器中打开.vnc/xstartup,并按以下方式编辑。
-
在对配置文件进行任何修改后,重新启动vnc服务器服务。
对于Gnome
- xstartup "文件应该是这样的
# cat ~/.vnc/xstartup #!/bin/sh [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources vncconfig -iconic & dbus-launch --exit-with-session gnome-session &
对于 KDE
- xstartup "文件应该是这样的
VNC 客户端 连接:
- vncviewer 命令可以用来从远程Linux机器连接到适当的基于VNC的X会话。如果远程系统正在运行Windows,可以从网站http://www.tigervnc.org/ 免费下载基于Windows的VNC查看器程序。
-
要使用vncviewer客户端连接到用户显示,请将N替换为所需用户的基于VNC的X会话的编号。
- 如果使用端口号而不是显示号进行连接,大多数vnc客户端需要使用vncserver-ipaddress::portnumber的语法。
# vncviewer vncserver-ipaddress::59XX
e.g:
配置Xvnc选项:
要配置Xvnc参数,打开vncserver-config-defaults配置文件。这个文件是默认的Xvnc配置,将应用于每个用户,除非有以下情况。
- 用户在$HOME/.vnc/config中有自己的配置。
- 同样的选项,在vncserver-config-mandatory配置文件中配置了不同的值,它取代了默认的配置,其优先级甚至高于按用户配置。这个选项是为系统管理员想要强制执行特定的Xvnc选项时准备的。
配置文件的格式也很简单,配置如下。
option=value
例如:
session=gnome #securitytypes=vncauth,tlsvnc #desktop=sandbox #geometry=2000x1200 #localhost #alwaysshared
注意:
这里唯一需要的参数是session=,它应该与/usr/share/xsessions目录下的会话桌面文件名相匹配。对于支持的部署,这里的默认选项是 session=gnome。对于厂商/社区提供的任何第三方/上游GUI,请查看相关文档。
设置vnc密码
为了能够启动Tigervnc服务器,请为每个用户设置一个密码。为了创建密码,请以您要启动服务器的用户身份运行以下命令。
$ vncpasswd
注意:-必须在以用户身份登录时进行设置,不能以root/其他管理员身份使用RHEL 8中的vncpasswd用户名命令进行设置。在RHEL 8中不能以root/其他管理员身份使用vncpasswd用户名命令进行设置。
如果系统中以前使用过vncserver,请确保vncpasswd创建的$HOME/.vnc文件夹具有正确的SELinux上下文。有两种可能的选择来确保这一点。
- 删除 $HOME/.vnc 文件夹,然后通过再创建一次密码来重新创建。
- 或者运行该命令。$ restorecon -RFv /home/<USER>/.vnc。
启动Tigervnc服务器
最后用systemd服务启动服务器。要做到这一点,只要运行。
As root user: # systemctl start vncserver@:$x.service As non-root user: $ sudo systemctl start vncserver@:$x.service
用/etc/tigervnc/vncserver.users中配置的实际数字代替$x。
$ sudo systemctl start vncserver@:1.service
它将以 GNOME 会话为用户 vncuser1 启动一个 Tigervnc 服务器。
注意:- 如果你正在使用vino(屏幕共享),请注意它与VNC共享端口。不要使用任何可能导致冲突的端口。要确定某个用户可能使用的vino端口,让该用户在登录到本地图形控制台时运行 "gsettings get org.gnome.desktop.remote-access alternative-port"。
配置防火墙以接受传入的连接。
执行以下命令在防火墙中打开VNC端口。
# firewall-cmd --permanent --zone=public --add-port 5901/tcp
该命令只为传入的连接打开TCP端口5901。当需要时,同样的命令也可以用来打开其他端口。你可能需要考虑针对你的用例制定丰富的规则。以上只是一个通用规则,它将开放对端口5901的全面访问,或指定的任何端口。
重新加载防火墙以使防火墙规则生效。
# firewall-cmd --reload
注意:-
- 如果之前使用systemd配置过vncserver,请删除之前的systemd配置文件(例如:/etc/systemd/system/vncserver@.service),否则将使用该service文件代替最新的配置文件。
- 关于RHEL7.x和RHEL8.2.0版本的vnc服务器配置,请参考: How to access the GUI of remote RHEL system via Virtual Network Computing (VNC)?
限制:-
- 用户将无法为已经登录到图形会话的用户启动Tigervnc服务器。
- 避免以root用户的身份运行服务器,因为这不是一件安全的事情。虽然以root用户的身份运行服务器在一般情况下应该是可行的,但不建议这样做,可能会有一些事情不能正常运行。参考: Is logging in to the GUI as the root user supported in Red Hat Enterprise Linux?
根源
以前的Tigervnc版本有一个名为vncserver的包装脚本,可以作为用户手动运行来启动Xvnc进程。使用方法很简单,可以通过执行以下命令来启动。
$ vncserver :x [vncserver options] [Xvnc options]
虽然这样做还不错,但当用户想用systemd启动Tigervnc服务器时,就会出现一些问题。由于这些原因,事情被彻底改变了,现在有了一种新的工作方式。
SELinux策略有额外的更新,要求策略也要更新,否则VNC服务器将无法在旧点版本上启动。将SELinux策略包从较新的点版本混合到较旧的点版本上,会引起额外的问题。如果要使用上述tigervnc版本,最佳做法是完全更新。
参考:
[1] How to Install and Configure VNC on CentOS 8
[2] How to configure Virtual Network Computing (VNC) in Red Hat Enterprise Linux 7/8 - 8.2?
[3] Are there any changes to the default vncserver configuration in RHEL8.3?
[4] How to install a graphical user interface (GUI) for Red Hat Enterprise Linux?