远程办公是近几年比较流行的办公方式,这大多是由于疫情的影响。比较流行的远程桌面控制软件有中国的向日葵、德国的 Teamviewer、中国的 ToDesk、中国的 RustDesk。本篇介绍 RustDesk,不仅是因为它是国产软件,更重要它是开源的,并且能够使用自建中继服务器,这给用户保留了更好的定制性和隐私性。本篇以 Debian 10 为例演示。

安装

RustDesk 提供了各平台的版本,如 Windows, Mac, Ubuntu, fedora, Android, iOS, Web 等。安装非常简单,直接从 github rustdesk下载对应的版本就好。

安装后会自动分配一个 ID 和密码,作为唯一标识。当别的客户端连接本电脑时,需要输入该 ID 和密码。

自建中继服务器

默认的软件已经提供免费的中继服务器,但带宽有限,缺乏隐私性。因此,RustDesk 提供了可自建中继服务器的方法,使用自己的服务器作为桥梁连接自己的电脑,获得可控的网速以及更高的安全性。

假设你已经有了一台具有公网 IP 的 vps 服务器(硬件要求很低,最低配置的云服务器就可以了,CPU 和内存要求都是最小的。关于网络大小,如果 TCP 打洞直连失败,就要耗费中继流量,一个中继连接的流量在 30k-3M 每秒之间(1920x1080 屏幕),取决于清晰度设置和画面变化。如果只是办公需求,平均在100K/s。),那么,你可以从 github rustdesk-server 下载安装。

1
2
3
4
5
sudo mkdir -p /usr/local/rustdesk
sudo chown -R jinzhongxu /usr/local/rustdesk
cd /usr/local/rustdesk
wget https://github.com/rustdesk/rustdesk-server/releases/download/1.1.5/rustdesk-server-linux-x64.zip
unzip rustdesk-server-linux-x64.zip

解压后,里面有两个可执行程序,分别是 hbbr 和 hbbs,默认情况下,hbbr 监听21117(tcp), 21119(tcp),hbbs 监听21115(tcp), 21116(tcp/udp), 21118(tcp)。务必在防火墙开启这几个端口, 请注意 21116 同时要开启 TCP 和 UDP。其中 21115 是 hbbs 用作 NAT 类型测试,21116/UDP 是 hbbs 用作 ID 注册与心跳服务,21116/TCP 是 hbbs 用作 TCP 打洞与连接服务,21117 是 hbbr 用作中继服务, 21118 和 21119 是为了支持网页客户端。如果您不需要网页客户端(21118、21119)支持,对应端口可以不开。如果你想选择自己的端口,使用 “-h” 选项查看帮助。

启动方法如下:

1
./hbbr

另启一个终端,启动 hbbs

1
./hbbs -r www.youdomain.com

此时,就已经完成了中继服务器的搭建。在所有使用该中继的客户端配置使用即可。方法如下:

点击 ID 后的三个点,选择 ID/中继服务器,只需在 ID 服务器 一栏中输入你的域名(我这里是 www.youdomain.com,仅用于举例) 即可。其他栏可空置。点击确认。如果一切完备,则在客户端会看到 就绪 两个字。

为了安全起见,我们都会配置 key 键。在第一次启动中继时,我们可以看到自动创建了公钥 id_ed25519.pub 和私钥 id_ed25519,我们可以先关闭中继程序 hbbr 和 hbbs,将公钥信息添加到客服端的 key 中,方法如上,key 在最后一栏中。此时,再把中继服务器中 hbbr 和 hbbs 重新启动即可,方法如下:

1
./hbbr -k _

另启一个终端,启动 hbbs

1
./hbbs -r www.youdomain.com -k _

此时,只有配置了 key 的客户端才能够使用中继 www.youdomain.com 代理客户端。注意上面的所有地方的 www.youdomain.com 都可以换成 IP 地址,同样可以使用。一定要把需要的端口开放。

局域网

当在局域网使用时,如 Windows上远程连接局域网内的 Ubuntu 主机,可以直接使用 ip 直连的方式进行。只需要在 Ubuntu 上(或被连主机)的 rustdesk 设置允许 IP 直接访问即可。

连接无外接显示器的远程服务器

当远程服务器没有外接显示器时,一般远程连接服务器,显示桌面时会无法显示。这对于机房服务器是常见的,因为机房空间有限,无法为每一个服务器都外接显示器。本节介绍在远程服务器没有外接显示器情况下如何使用虚拟显示器是的远程连接时桌面能够正常显示。我这里使用 gnome 默认的 gdm3 桌面管理器,可以使用命令指定桌面管理器为 gdm3:sudo dpkg-reconfigure gdm3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 安装桌面环境
sudo apt install ubuntu-desktop gnome-session

# 安装虚拟显示器支
sudo apt install xserver-xorg-core-hwe-18.04
sudo apt install xserver-xorg-video-dummy-hwe-18.04

# 配置虚拟 xorg X-server 硬件信息
sudo cat > /usr/share/X11/xorg.conf.d/xorg.conf <<-"EOF"
Section "Monitor"
Identifier "Monitor0"
HorizSync 28.0-80.0
VertRefresh 48.0-75.0
Modeline "1920x1080_60.00" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync
EndSection
Section "Device"
Identifier "Card0"
Driver "dummy"
VideoRam 256000
EndSection
Section "Screen"
DefaultDepth 24
Identifier "Screen0"
Device "Card0"
Monitor "Monitor0"
SubSection "Display"
Depth 24
Modes "1920x1080_60.00"
EndSubSection
EndSection
EOF

# 修改 gdm3 不启用 xwayland
sudo sed -i "s/# WaylandEnable=false/WaylandEnable=false/g" custom.conf

# 根据情况配置是否自动登录
sed -i -e "s/# AutomaticLoginEnable = true/AutomaticLoginEnable = true/g" -e "s/# AutomaticLogin = user1/AutomaticLogin = jinzhongxu/g" custom.conf

# 重要。修改启动 X11 时,X-client 的参数。当参数为空时,发现连接后桌面为黑屏,只有一个 X 图标,说明没有启动桌面程序
cat > ~/.xsessionrc <<-"EOF"
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
EOF

# 设置默认以图像界面启动
sudo systemctl set-default graphical.target

# 重启服务器
sudo shutdown -r now

重启后,使用 rustdesk 连接即可访问远程服务器的(虚拟)桌面。如果不知道 rustdesk 的远程桌面 ID 和密码,可以使用 mobaxterm (开启 x11)SSH 登录远程服务器,然后使用如下命令打开 rustdesk 软件,查看或设置密码、修改局域网访问(如果需要局域网远程访问):

1
sudo /usr/bin/rustdesk

更多关于 X Window 介绍可以参考:X Window 设置介绍

注意:如果为服务器连接了外接显示器,那么当前的配置会使得物理显示器显示问题。可以如下恢复:

1
2
3
sudo mv /usr/share/X11/xorg.conf.d/xorg.conf /usr/share/X11/xorg.conf.d/xorg.conf.dummy
# 重启后就可以在本地显示器正常访问
sudo shutdown -r now

常见QA

  1. 当连接 Ubuntu 时,有时会遇到:Wayland supportx11 support 问题。需要将 Wayland 更改为 X11 (Xorg),这是因为RustDesk 不支持 Wayland。将 Xorg 配置为默认 GNOME 会话,可尝试使用如下方法:

    1
    sudo vim /etc/gdm3/custom.conf

    把注释取消

    1
    2
    3
    WaylandEnable=false
    # 增加如下,下次开机默认使用 X11 桌面
    # DefaultSession=gnome-xorg.desktop

    然后,

    1
    sudo systemctl restart gdm.service

    如果不能显示桌面建议重启服务器。重启后,记得运行如下命令:

    1
    sudo systemctl start gdm.service
  2. 切换账户或退出账号导致无法再次连接成功。可尝试如下方法:

    如果仍然无法连接,先关闭 gdm, rustdesk

    1
    2
    sudo systemctl stop gdm.service
    sudo systemctl stop rustdesk.service

    查看有哪些桌面进程,尝试关闭目前的桌面进程,

    1
    ps -ef | grep Xorg | grep -v grep

    结果可能如下

    1
    2
    root      3804  3801  0 9月18 tty1    00:02:43 /usr/lib/xorg/Xorg vt1 -displayfd 3 -auth /run/user/121/gdm/Xauthority -background none -noreset -keeptty -verbose 3
    root 5038 5036 1 9月18 tty2 00:16:59 /usr/lib/xorg/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -background none -noreset -keeptty -verbose 3

    杀掉进程

    1
    sudo kill 3804 5038

    再次开启 gdm 和 rustdesk

    1
    2
    sudo systemctl start gdm.service
    sudo systemctl start rustdesk.service
  3. 重启电脑连接步骤
    关闭 rustdesk 开机自启

    1
    sudo systemctl disable rustdesk.service

    开机后,安装如下顺序打开软件,先开 gdm,再开 rustdesk:

    1
    2
    sudo systemctl start gdm.service
    sudo systemctl start rustdesk.service
  4. 键盘打字失控
    先关闭rustdesk 连接,尝试再次连接,一般可解决。

  5. rustdesk 1.2.3 安装需要安装依赖

    1
    2
    3
    4
    5
    6
    sudo add-apt-repository ppa:pipewire-debian/pipewire-upstream
    sudo apt update
    sudo apt install pipewire pipewire-audio-client-libraries
    sudo apt install gstreamer1.0-pipewire libpipewire-0.3-{0,dev,modules} libspa-0.2-{bluetooth,dev,jack,modules} pipewire{,-{audio-client-libraries,pulse,media-session,bin,locales,tests}}
    systemctl --user daemon-reload
    # 更详细安装参考:https://linuxconfig.org/how-to-install-pipewire-on-ubuntu-linux
  6. 如果是远程服务器安装的,那么如何获取或者修改 rustdesk 配置信息(如更改登录密码等)
    使用 mobaxterm 进行 SSH 登录,然后,输入如下命令,在本地打开服务器的 rustdesk,并显示在本地客户端:

    1
    sudo /usr/lib/rustdesk/rustdesk

    如果出现 cannot open display: localhost:11.0 等问题,那么可以如下操作:

    1
    cp /home/jinzhongxu/.Xauthority /root/.Xauthority

    然后在使用上面的命令打开 rustdesk 显示在本地。

  7. 重装 nvidia 驱动导致 rustdesk 无法使用:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    sudo apt-get purge xorg "xserver-*"
    sudo apt-get purge lightdm plymouth
    sudo rm -rf /etc/X11/xorg
    sudo apt-get autoremove
    sudo apt-get install xauth xorg openbox lightdm plymouth
    sudo apt-get install ubuntu-desktop
    sudo reboot

    # 重启后,设置 gdm3 为默认登录程序
    sudo systemct restart gdm3
    sudo dpkg-reconfigure gdm3
  8. xorg 占用 gpu 现存:

    1
    2
    3
    sudo sed -i "s/^/#/g" /usr/share/X11/xorg.conf.d/10-nvidia.conf
    # 重启登录界面程序
    sudo systemctl restart display-manager
  9. 屏幕分辨率变小:

    1
    2
    # 登录远程界面后,输入如下改变当前分辨率
    xrandr --fb 1920x1080

参考文献

  1. rustdesk-docs
  2. 自建服务器
  3. Rustdesk | Virtual Remote Desktop infrastructure Written In Rust
  4. Configuring Xorg as the default GNOME session
  5. MobaXterm报错:MobaXterm X11 proxy: Unsupported authorisation protocol
  6. Can’t Login Ubuntu GUI (Login Loop)
  7. Prevent /usr/lib/xorg/Xorg from using GPU Memory in Ubuntu 20.04 Server
  8. 避免 /usr/lib/xorg/Xorg 占用显存
  9. X Window 设置介绍
  10. Ubuntu虚拟显示器且远程控制(无显示器接入)