wayvnc
简介
这是一个用于基于 wlroots 的 Wayland 合成器(:no_entry: Gnome、 KDE 和 Weston 不受支持)的 VNC 服务器。它会附加到一个正在运行的 Wayland 会话, 创建虚拟输入设备,并通过 RFB 协议暴露单个显示。Wayland 会话可以是无头(headless)的,因此 也可以在没有连接物理显示器的情况下运行 wayvnc。
请查阅 FAQ 以获取常见问题的答案。如需进一步 支持,请加入 libera.chat 上的 #wayvnc IRC 频道,或在 GitHub 上针对该项目的 讨论区 提问。
构建
运行时依赖
- aml
- drm
- gbm(可选)
- libxkbcommon
- neatvnc
- pam(可选)
- pixman
- jansson
构建依赖
- GCC
- meson
- ninja
- pkg-config
适用于 Arch Linux
pacman -S base-devel libglvnd libxkbcommon pixman gnutls jansson
适用于 Fedora 37
dnf install -y meson gcc ninja-build pkg-config egl-wayland egl-wayland-devel \
mesa-libEGL-devel mesa-libEGL libwayland-egl libglvnd-devel \
libglvnd-core-devel libglvnd mesa-libGLES-devel mesa-libGLES \
libxkbcommon-devel libxkbcommon libwayland-client \
pam-devel pixman-devel libgbm-devel libdrm-devel scdoc \
libavcodec-free-devel libavfilter-free-devel libavutil-free-devel \
turbojpeg-devel wayland-devel gnutls-devel jansson-devel
适用于 Debian(unstable / testing)
apt build-dep wayvnc
适用于 Ubuntu
apt install meson libdrm-dev libxkbcommon-dev libwlroots-dev libjansson-dev \
libpam0g-dev libgnutls28-dev libavfilter-dev libavcodec-dev \
libavutil-dev libturbojpeg0-dev scdoc
额外的构建时依赖
满足 neatvnc 和 aml 依赖的最简单方法是在 subprojects 目录中链接它们:
git clone https://github.com/any1/wayvnc.git
git clone https://github.com/any1/neatvnc.git
git clone https://github.com/any1/aml.git
mkdir wayvnc/subprojects
cd wayvnc/subprojects
ln -s ../../neatvnc .
ln -s ../../aml .
cd -
mkdir neatvnc/subprojects
cd neatvnc/subprojects
ln -s ../../aml .
cd -
配置与构建
meson build
ninja -C build
运行单元测试:
meson test -C build
运行集成测试:
./test/integration/integration.sh
运行
可以从构建目录按如下方式运行 Wayvnc:
./build/wayvnc
:radioactive: 服务器默认仅接受来自 localhost 的连接。若要
接受通过任意接口的连接,请将地址设置为 0.0.0.0,如下所示:
./build/wayvnc 0.0.0.0
:warning: 在未启用用户身份验证的情况下,请勿在公共网络或互联网上执行此操作。保护 VNC 连接的最佳方式是在监听 localhost 时使用 SSH 隧道,但用户也可以在连接到 wayvnc 时进行身份验证。
加密与身份验证
VeNCrypt (TLS)
对于 TLS,您需要一个私有的 X509 密钥和一个证书。可以通过以下方式生成带有证书的自签名密钥:
cd ~/.config/wayvnc
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:secp384r1 -sha384 \
-days 3650 -nodes -keyout tls_key.pem -out tls_cert.pem \
-subj /CN=localhost \
-addext subjectAltName=DNS:localhost,DNS:localhost,IP:127.0.0.1
cd -
将上述命令中的 localhost 和 127.0.0.1 分别替换为您的对外主机名和 IP 地址,或者如果您是在本地测试,则保持原样即可。
创建一个包含身份验证信息的配置文件,并使用 --config 命令行选项加载它,或者将其放置在默认位置
$HOME/.config/wayvnc/config。
use_relative_paths=true
address=0.0.0.0
enable_auth=true
username=luser
password=p455w0rd
private_key_file=tls_key.pem
certificate_file=tls_cert.pem
RSA-AES
RSA-AES 安全类型将 RSA 与 EAX 模式下的 AES 相结合,提供能够抵御窃听和 MITM 的安全身份验证和加密。其主要弱点是用户必须在首次使用时验证服务器的凭据。此后,如果服务器凭据发生变化,客户端软件应警告用户。这是一种类似于 SSH 所采用的首次使用信任 (TOFU) 方案。
要启用 RSA-AES,您需要生成一个 RSA 密钥。可以按以下方式实现:
ssh-keygen -m pem -f ~/.config/wayvnc/rsa_key.pem -t rsa -N ""
您还需要通过设置 rsa_private_key_file 配置参数来告诉 wayvnc 该文件的位置:
use_relative_paths=true
address=0.0.0.0
enable_auth=true
username=luser
password=p455w0rd
rsa_private_key_file=rsa_key.pem
您还可以添加 TLS 凭据与 RSA 结合使用。客户端将自行选择。
DES 身份验证 (遗留)
:warning: DES 认证不提供 VNC 会话的加密。它 使用过时的质询-响应方案,仅使用密码的前 8 个字符。这不安全,不符合任何现代标准。
此选项仅用于兼容支持 DES 但不支持无认证模式的 VNC 客户端,例如 macOS 屏幕共享。
如果需要支持此类客户端,请在配置中添加以下内容:
enable_auth=true
password=p455w0rd
relax_encryption=true
allow_broken_crypto=true
当启用 enable_pam 时,DES 认证不起作用,因为 PAM 会覆盖
基于密码的认证。
在不完全信任的网络中,请使用 SSH 隧道或 VPN 来提供 加密。
wayvncctl 控制套接字
为了便于运行时交互和控制,wayvnc 会在 $XDG_RUNTIME_DIR/wayvncctl(或回退到 /tmp/wayvncctl-$UID)打开一个 unix 域套接字。 客户端可以连接并交换 json 格式的 IPC 消息,以查询和控制 正在运行的 wayvnc 实例。
使用 wayvncctl 工具从
命令行与此控制套接字交互。
请参阅 wayvnc(1) 手册页,深入了解 IPC 协议和
可用命令,以及 wayvncctl(1) 了解命令行
接口的更多信息。
还有一种便捷的事件循环模式,可用于在 wayvnc 中发生各种事件时运行命令。请参阅 examples/event-watcher 以获取更多详细信息。