Rustdeskサーバー(community edtion1.1.11-1)/クライアント(1.2.7)を構築
Rustdeskは、OSSのリモートデスクトップツールで、teamviewerのような機能を持っています。
機能豊富でサポートが付く有料プランもありますが、無料プランでもself-hostな中継サーバーを立てられるので、
実際にサーバーを構築した時のメモを残します。
参考にしたもの
▼基本は公式ページ
▼その他の記事
セットアップ方針
installスクリプトやdockerも用意されていますが、
仕組みや構成を理解するために手動でセットアップしていきます。
サーバーの準備
AWS ec2で、arm64系でubuntuインスタンスを立ち上げます。(今回は t4g.micro を使用)
debファイルのダウンロード
最新のdebファイルをダウンロードしに行きます。
arm64用のバイナリをダウンロード、インストールします。
mkdir rustdesk-server
cd rustdesk-server
#リレー(relay)サーバー
wget https://github.com/rustdesk/rustdesk-server/releases/download/1.1.11-1/rustdesk-server-hbbr_1.1.11-1_arm64.deb
#シグナル(ID/Rendezvous) サーバー
wget https://github.com/rustdesk/rustdesk-server/releases/download/1.1.11-1/rustdesk-server-hbbs_1.1.11-1_arm64.deb
#ユーティリティ
wget https://github.com/rustdesk/rustdesk-server/releases/download/1.1.11-1/rustdesk-server-utils_1.1.11-1_arm64.deb
sudo dpkg -i ./rustdesk-server-*.deb
インストールが完了すると、serviceが作成され、自動的に起動しています。
$ ubuntu@ip-172-31-xxx-xxx:~/rustdesk-server$ sudo systemctl status rustdesk-hbbr.service
● rustdesk-hbbr.service - Rustdesk Relay Server
Loaded: loaded (/etc/systemd/system/rustdesk-hbbr.service; enabled; preset: enabled)
Active: active (running) since Thu 2024-07-25 03:35:41 UTC; 10min ago
Main PID: 2264 (hbbr)
Tasks: 5 (limit: 1080)
Memory: 308.0K (peak: 800.0K)
CPU: 55ms
CGroup: /system.slice/rustdesk-hbbr.service
└─2264 /usr/bin/hbbr
Jul 25 03:35:41 ip-172-31-20-158 systemd[1]: Started rustdesk-hbbr.service - Rustdesk Relay Server.
Jul 25 03:38:07 ip-172-31-20-158 systemd[1]: /etc/systemd/system/rustdesk-hbbr.service:1: Assignment outside of section. Ignoring.
Jul 25 03:39:50 ip-172-31-20-158 systemd[1]: /etc/systemd/system/rustdesk-hbbr.service:1: Assignment outside of section. Ignoring.
Jul 25 03:39:55 ip-172-31-20-158 systemd[1]: /etc/systemd/system/rustdesk-hbbr.service:1: Assignment outside of section. Ignoring.
Jul 25 03:45:56 ip-172-31-20-158 systemd[1]: /etc/systemd/system/rustdesk-hbbr.service:1: Assignment outside of section. Ignoring.
$ ubuntu@ip-172-31-xxx-xxx:~/rustdesk-server$ sudo systemctl status rustdesk-hbbs.service
● rustdesk-hbbs.service - Rustdesk Signal Server
Loaded: loaded (/etc/systemd/system/rustdesk-hbbs.service; enabled; preset: enabled)
Active: active (running) since Thu 2024-07-25 03:35:42 UTC; 11min ago
Main PID: 2376 (hbbs)
Tasks: 6 (limit: 1080)
Memory: 644.0K (peak: 1.1M)
CPU: 266ms
CGroup: /system.slice/rustdesk-hbbs.service
└─2376 /usr/bin/hbbs
Jul 25 03:35:42 ip-172-31-20-158 systemd[1]: Started rustdesk-hbbs.service - Rustdesk Signal Server.
utilityから、ポートのチェックを行う
sudo rustdesk-utils doctor <ip or domain>
で、
該当IPまたはdomainのhealth checkが行えます。
今回は、ローカルネットワークからアクセスされる前提のため、EC2インスタンスのローカルIPを指定します。
$ ubuntu@ip-172-31-xxx-xxx:~/rustdesk-server$ sudo rustdesk-utils doctor 172.31.xxx.xxx
Checking server: 172.31.20.158
Checking IP address: 172.31.20.158
Is IPV4: true
Is IPV6: false
TCP Port 21114 (API): ERROR
TCP Port 21115 (hbbs extra port for nat test): OK in 0 ms
TCP Port 21116 (hbbs): OK in 0 ms
TCP Port 21117 (hbbr tcp): OK in 0 ms
TCP Port 21118 (hbbs websocket): OK in 0 ms
TCP Port 21119 (hbbr websocket): OK in 0 ms
port21114はAPI用のポートで、Pro版しか使わないのでERRORで問題無し。
それ以外のport有効性が確認できれば大丈夫です。
pubファイルの名称を確認
$ ls -l /var/lib/rustdesk-server/
total 88
-rw-r--r-- 1 root root 4096 Jul 25 03:33 db_v2.sqlite3
-rw-r--r-- 1 root root 32768 Jul 25 03:35 db_v2.sqlite3-shm
-rw-r--r-- 1 root root 41232 Jul 25 03:33 db_v2.sqlite3-wal
-rw-r--r-- 1 root root 88 Jul 25 03:33 id_ed25519
-rw-r--r-- 1 root root 44 Jul 25 03:33 id_ed25519.pub
初回のhbbs起動時に、自動的に暗号化された秘密鍵と公開鍵のペア(それぞれ実行ディレクトリの id_ed25519とid_ed25519.pubファイル)が自動的に生成されるので、
公開鍵ファイル id_ed25519.pub の中身をコピーしておきます。
その他やりたいことのメモ
amazonlinux上でも動作確認する。
hbbs起動時のオプションで、リレーサーバー指定できる。
サイトによると、
hbbs の -r パラメータは必須ではなく、制御されるクライアント側で中継サーバを 指定しない場合に便利なだけです。 デフォルトの21117ポートを使う場合は、ポートを指定する必要はありません。 クライアントが指定した中継サーバの方が優先順位が高いからです。
とのことだが、クライアント側の設定が漏れて自動的に公開サーバーなどに接続されると嫌なので、
明示しておきたい
hbbs -- -r <relay-server-ip[:port]>
クライアント側の設定
windows, macos, linuxについて自動キッティングまでできるようにしたい。
socks5による通信での動作確認まで。
shadowsocksの準備はこちら
(WIP) クライアント(ubuntu) ビルド
用意されたバイナリを使っても良いのだが、将来カスタマイズして使えるように、
cargo runしてみる。
結論から言うと、githubページ公式の通りに実行しても、いろんな部品が足りずにビルドエラーになるので、
諸々を事前にインストールが必要です。
クライアントモジュールのgithubページ公式の通りに進める。
rustdeskでは、もともとsciter というクロスプラットフォームHTML/CSS/JavaScriptエンジンを提供するUIツールキットが使われていて、現在はFlutterに切り替わっています。
ただ、Flutterが動作しない環境のためにsciter版も残っているので、ビルドの際にsciter関連のバイナリが必要になります。
▼参考:公式sciter公式
#Rust環境入れる(すでに有る人は不要)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
#rustdeskモジュールをダウンロードして、最新バージョニングに合わせる
git clone https://github.com/rustdesk/rustdesk
cd rustdesk
#(1.2.7が最新の場合)
git checkout -b latest_release tags/1.2.7
mkdir -p target/debug
wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so
mv libsciter-gtk.so target/debug
VCPKG_ROOT=$HOME/vcpkg cargo run
その他の厄介なエラー
https://github.com/rustdesk-org/The-Fat-Controller#9dd86151525fd010dc93f6bc9b6aedd1a75cc342
が無いというエラーが発生。
error: failed to get `tfc` as a dependency of package `enigo v0.0.14 (/home/masatoyuna/Project/rustdesk/libs/enigo)`
Caused by:
failed to load source for dependency `tfc`
Caused by:
Unable to update https://github.com/rustdesk-org/The-Fat-Controller#9dd86151
Caused by:
revspec '9dd86151525fd010dc93f6bc9b6aedd1a75cc342' not found; class=Reference (4); code=NotFound (-3)
Cargo.lockをチェックすると、確かに上記のコミットIDが指定されている。
[[package]]
name = "tfc"
version = "0.6.1"
source = "git+https://github.com/rustdesk-org/The-Fat-Controller#9dd86151525fd010dc93f6bc9b6aedd1a75cc342"
dependencies = [
"anyhow",
"core-graphics 0.22.3",
"unicode-segmentation",
"winapi 0.3.9",
"x11 2.19.0",
]
が、githubのページを見ると、なぜか該当のコミットが無い。
リポジトリを見ると、rebase branchというのが作成されていたり、管理が怪しい・・・
仕方ないので、Cargo.lockの上記部分を、直近修正が入っているリポジトリhistory/rebase_upstream_20240722
のコミットID(87a6450f17659edba0cad669d9b57e8775479917)に修正し、再度ビルドで、うまく行きました。
(本来依存が壊れている場合は保証が無いので、動作についてはリスクがあります)
以下は、都度エラーに対応した時のログ。
次のエラー
error: failed to run custom build command for `pam-sys v1.0.0-alpha4 (https://github.com/rustdesk-org/pam-sys?branch=fix/v1.0.0-alpha4_gnuc_va_list#3337c9bb)`
note: To improve backtraces for build dependencies, set the CARGO_PROFILE_DEV_BUILD_OVERRIDE_DEBUG=true environment variable to enable debug information generation.
Caused by:
process didn't exit successfully: `/home/<user>/Project/rustdesk/target/debug/build/pam-sys-db684e7887561fbc/build-script-build` (exit status: 101)
--- stdout
cargo:rustc-link-lib=pam
cargo:rustc-link-lib=pam_misc
cargo:rerun-if-changed=wrapper.h
--- stderr
wrapper.h:1:10: fatal error: 'security/pam_appl.h' file not found
wrapper.h:1:10: fatal error: 'security/pam_appl.h' file not found, err: true
thread 'main' panicked at /home/<user>/.cargo/git/checkouts/pam-sys-9d8d9009a72ec52b/3337c9b/build.rs:70:10:
Unable to generate bindings: ()
stack backtrace:
0: rust_begin_unwind
at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/std/src/panicking.rs:652:5
1: core::panicking::panic_fmt
at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/core/src/panicking.rs:72:14
2: core::result::unwrap_failed
at /rustc/129f3b9964af4d4a709d1383930ade12dfe7c081/library/core/src/result.rs:1654:5
3: core::result::Result<T,E>::expect
4: build_script_build::main
5: core::ops::function::FnOnce::call_once
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
モジュールpam_appl.hが無いと言われているので、インストールして対処。
sudo apt-get install libpam0g-dev
次のエラー
error: failed to run custom build command for `magnum-opus v0.4.0 (https://github.com/rustdesk-org/magnum-opus#5cd2bf98)`
note: To improve backtraces for build dependencies, set the CARGO_PROFILE_DEV_BUILD_OVERRIDE_DEBUG=true environment variable to enable debug information generation.
Caused by:
process didn't exit successfully: `/home/<user>/Project/rustdesk/target/debug/build/magnum-opus-e936588a59ef866d/build-script-build` (exit status: 101)
--- stdout
cargo:info=x64-linux
cargo:rustc-link-lib=static=opus
cargo:rustc-link-search=/home/<user>/vcpkg/installed/x64-linux/lib
cargo:include=/home/<user>/vcpkg/installed/x64-linux/include
rerun-if-changed=/home/<user>/.cargo/git/checkouts/magnum-opus-6f07f61b97016ae9/5cd2bf9/opus_ffi.h
rerun-if-changed=/home/<user>/vcpkg/installed/x64-linux/include
--- stderr
/home/<user>/.cargo/git/checkouts/magnum-opus-6f07f61b97016ae9/5cd2bf9/opus_ffi.h:1:10: fatal error: 'opus/opus_multistream.h' file not found
/home/<user>/.cargo/git/checkouts/magnum-opus-6f07f61b97016ae9/5cd2bf9/opus_ffi.h:1:10: fatal error: 'opus/opus_multistream.h' file not found, err: true
thread 'main' panicked at /home/<user>/.cargo/git/checkouts/magnum-opus-6f07f61b97016ae9/5cd2bf9/build.rs:146:18:
'opus/opus_multistream.hが無いとのことなので、インストール
sudo apt install libopus0 libopus-dev
まだエラーが出ます。
error: could not find native static library `opus`, perhaps an -L flag is missing?
error: could not compile `magnum-opus` (lib) due to 1 previous error
エラーの対象になっている libopus.soが入ってることを確認
$ locate libopus.so
/home/masatoyuna/.robocorp/holotree/457b01d_b1f3c24_4ef6bbd5/lib/libopus.so
〜省略〜
/usr/lib/x86_64-linux-gnu/libopus.so.0
/usr/lib/x86_64-linux-gnu/libopus.so.0.8.0
〜省略〜
/var/lib/flatpak/runtime/org.gnome.Platform/x86_64/45/c3f95c5bffae4b9e0dbdc3dfbe187aba9a000ba1f954f904dbdfbdb2515b1af5/files/lib/x86_64-linux-gnu/libopus.so.0.9.0
上記のエラーメッセージに記載されている通り、このパスを事前に-Lで追加することで対応。
VCPKG_ROOT=$HOME/vcpkg RUSTFLAGS="-L /usr/lib/x86_64-linux-gnu/" cargo run
次のエラー
error: failed to run custom build command for `scrap v0.5.0 (/home/masatoyuna/Project/rustdesk/libs/scrap)`
note: To improve backtraces for build dependencies, set the CARGO_PROFILE_DEV_BUILD_OVERRIDE_DEBUG=true environment variable to enable debug information generation.
Caused by:
process didn't exit successfully: `/home/masatoyuna/Project/rustdesk/target/debug/build/scrap-9532631cd4c74f3f/build-script-build` (exit status: 101)
--- stdout
cargo:rerun-if-env-changed=NO_PKG_CONFIG_libyuv
cargo:info=x64-linux
cargo:rustc-link-lib=static=yuv
cargo:rustc-link-search=/home/masatoyuna/vcpkg/installed/x64-linux/lib
cargo:include=/home/masatoyuna/vcpkg/installed/x64-linux/include
cargo:rerun-if-env-changed=NO_PKG_CONFIG_libvpx
cargo:info=x64-linux
cargo:rustc-link-lib=static=vpx
cargo:rustc-link-search=/home/masatoyuna/vcpkg/installed/x64-linux/lib
cargo:include=/home/masatoyuna/vcpkg/installed/x64-linux/include
rerun-if-changed=/home/masatoyuna/Project/rustdesk/libs/scrap/src/bindings/vpx_ffi.h
rerun-if-changed=/home/masatoyuna/vcpkg/installed/x64-linux/include
--- stderr
/home/masatoyuna/Project/rustdesk/libs/scrap/src/bindings/vpx_ffi.h:1:10: fatal error: 'vpx/vp8.h' file not found
thread 'main' panicked at libs/scrap/build.rs:169:18:
called `Result::unwrap()` on an `Err` value: ClangDiagnostic("/home/masatoyuna/Project/rustdesk/libs/scrap/src/bindings/vpx_ffi.h:1:10: fatal error: 'vpx/vp8.h' file not found\n")
stack backtrace:
vpx/vp8.hが無いのでインストール
sudo apt-get install libvpx-dev
再ビルド。次のエラー
error: failed to run custom build command for `scrap v0.5.0 (/home/masatoyuna/Project/rustdesk/libs/scrap)`
note: To improve backtraces for build dependencies, set the CARGO_PROFILE_DEV_BUILD_OVERRIDE_DEBUG=true environment variable to enable debug information generation.
Caused by:
process didn't exit successfully: `/home/masatoyuna/Project/rustdesk/target/debug/build/scrap-9532631cd4c74f3f/build-script-build` (exit status: 101)
--- stdout
cargo:rerun-if-env-changed=NO_PKG_CONFIG_libyuv
cargo:info=x64-linux
cargo:rustc-link-lib=static=yuv
cargo:rustc-link-search=/home/masatoyuna/vcpkg/installed/x64-linux/lib
cargo:include=/home/masatoyuna/vcpkg/installed/x64-linux/include
cargo:rerun-if-env-changed=NO_PKG_CONFIG_libvpx
cargo:info=x64-linux
cargo:rustc-link-lib=static=vpx
cargo:rustc-link-search=/home/masatoyuna/vcpkg/installed/x64-linux/lib
cargo:include=/home/masatoyuna/vcpkg/installed/x64-linux/include
rerun-if-changed=/home/masatoyuna/Project/rustdesk/libs/scrap/src/bindings/vpx_ffi.h
rerun-if-changed=/home/masatoyuna/vcpkg/installed/x64-linux/include
cargo:rerun-if-env-changed=NO_PKG_CONFIG_aom
cargo:info=x64-linux
cargo:rustc-link-lib=static=aom
cargo:rustc-link-search=/home/masatoyuna/vcpkg/installed/x64-linux/lib
cargo:include=/home/masatoyuna/vcpkg/installed/x64-linux/include
rerun-if-changed=/home/masatoyuna/Project/rustdesk/libs/scrap/src/bindings/aom_ffi.h
rerun-if-changed=/home/masatoyuna/vcpkg/installed/x64-linux/include
--- stderr
/home/masatoyuna/Project/rustdesk/libs/scrap/src/bindings/aom_ffi.h:1:10: fatal error: 'aom/aom.h' file not found
thread 'main' panicked at libs/scrap/build.rs:169:18:
called `Result::unwrap()` on an `Err` value: ClangDiagnostic("/home/masatoyuna/Project/rustdesk/libs/scrap/src/bindings/aom_ffi.h:1:10: fatal error: 'aom/aom.h' file not found\n")
aom/aom_hが無いので、インストール
sudo apt install libaom-dev
次のエラー
error: could not find native static library `opus`, perhaps an -L flag is missing?
error: could not compile `magnum-opus` (lib) due to 1 previous error
warning: build failed, waiting for other jobs to finish...
error: failed to run custom build command for `scrap v0.5.0 (/home/masatoyuna/Project/rustdesk/libs/scrap)`
note: To improve backtraces for build dependencies, set the CARGO_PROFILE_DEV_BUILD_OVERRIDE_DEBUG=true environment variable to enable debug information generation.
Caused by:
process didn't exit successfully: `/home/masatoyuna/Project/rustdesk/target/debug/build/scrap-9532631cd4c74f3f/build-script-build` (exit status: 101)
--- stdout
cargo:rerun-if-env-changed=NO_PKG_CONFIG_libyuv
cargo:info=x64-linux
cargo:rustc-link-lib=static=yuv
cargo:rustc-link-search=/home/masatoyuna/vcpkg/installed/x64-linux/lib
cargo:include=/home/masatoyuna/vcpkg/installed/x64-linux/include
cargo:rerun-if-env-changed=NO_PKG_CONFIG_libvpx
cargo:info=x64-linux
cargo:rustc-link-lib=static=vpx
cargo:rustc-link-search=/home/masatoyuna/vcpkg/installed/x64-linux/lib
cargo:include=/home/masatoyuna/vcpkg/installed/x64-linux/include
rerun-if-changed=/home/masatoyuna/Project/rustdesk/libs/scrap/src/bindings/vpx_ffi.h
rerun-if-changed=/home/masatoyuna/vcpkg/installed/x64-linux/include
cargo:rerun-if-env-changed=NO_PKG_CONFIG_aom
cargo:info=x64-linux
cargo:rustc-link-lib=static=aom
cargo:rustc-link-search=/home/masatoyuna/vcpkg/installed/x64-linux/lib
cargo:include=/home/masatoyuna/vcpkg/installed/x64-linux/include
rerun-if-changed=/home/masatoyuna/Project/rustdesk/libs/scrap/src/bindings/aom_ffi.h
rerun-if-changed=/home/masatoyuna/vcpkg/installed/x64-linux/include
cargo:rerun-if-env-changed=NO_PKG_CONFIG_libyuv
cargo:info=x64-linux
cargo:rustc-link-lib=static=yuv
cargo:rustc-link-search=/home/masatoyuna/vcpkg/installed/x64-linux/lib
cargo:include=/home/masatoyuna/vcpkg/installed/x64-linux/include
rerun-if-changed=/home/masatoyuna/Project/rustdesk/libs/scrap/src/bindings/yuv_ffi.h
rerun-if-changed=/home/masatoyuna/vcpkg/installed/x64-linux/include
--- stderr
/home/masatoyuna/Project/rustdesk/libs/scrap/src/bindings/yuv_ffi.h:1:10: fatal error: 'libyuv/convert.h' file not found
thread 'main' panicked at libs/scrap/build.rs:169:18:
called `Result::unwrap()` on an `Err` value: ClangDiagnostic("/home/masatoyuna/Project/rustdesk/libs/scrap/src/bindings/yuv_ffi.h:1:10: fatal error: 'libyuv/convert.h' file not found\n")
stack backtrace:
libyuv/convert.hが無いとのことなので、インストール
sudo apt install libyuv-dev
実際の動作は、configファイルなどの準備が必要なので、保留。(別スクラップに移動予定)
クライアントインストール(ubuntu)
最新リリースのインストーラをダウンロードする。
debをインストールすると、
必要ファイルが展開され、serviceが登録され、systemdが起動する。
$ sudo systemctl status rustdesk.service
● rustdesk.service - RustDesk
Loaded: loaded (/lib/systemd/system/rustdesk.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-07-29 22:38:37 JST; 44s ago
Main PID: 745794 (rustdesk)
Tasks: 40 (limit: 18611)
Memory: 32.3M
CPU: 6.665s
CGroup: /system.slice/rustdesk.service
├─745794 /usr/bin/rustdesk --service
├─746341 sudo -E XDG_RUNTIME_DIR=/run/user/1000 -u masatoyuna /usr/lib/rustdesk/rustdesk --server
├─746343 /usr/lib/rustdesk/rustdesk --server
└─746910 sh -c "pgrep -a Xwayland"
コマンドラインから設定できる項目を設定
#自分で管理したいIDをセットする(これProしか使えない?未確認)
#$ sudo rustdesk --set-id xxxxxxxxxxxxxxxxxxxx
#確認
$ sudo rustdesk --get-id
xxxxxxxxxxxxxxxxxxxx
$ sudo rustdesk --option relay-server <rustdeskサーバーの ip or domain>
$ sudo rustdesk --option custom-rendezvous-server <rustdeskサーバーの ip or domain>
# リモート接続でRustDeskのGUIアプリを操作して設定変更できるようになる
$ sudo rustdesk --option access-mode 'full'
サーバーのkeyは、rustdeskのGUIを起動して、設定→ネットワーク→Keyに登録する
(※サーバーの id_ed25519.pub を取得してセット)
これで、他のクライアントへのアクセスが可能になります。
※アクセスされる側のクライアントは、rustdeskサーバーの設定さえされていれば、keyの登録は不要です。
RustDeskの設定ファイルは、以下ディレクトリにあるので、
ここを直接編集することで設定も可能です。(今後バージョンで同様に動作するか否かは不明)
/root/.config/rustdesk/RustDesk.toml
/root/.config/rustdesk/RustDesk2.toml
注意
Rustdeskの設定からサービスの停止をすると、
systemdがdisabled状態になり、次回起動時に起動しないことがあります。
設定後、自動起動されることを確認しておくことが必要かもしれません。
Shadowsocksを通したサーバーアクセス
こちらにまとめています。
その他検証したいこと
- self-hostedサーバーに対して、クライアント端末の接続状態をモジュールから直接確認する
(端末管理ツール上でRustdeskの疎通状況を常に確認できるようにしたい) - 安全な自動アップデートの仕組み
(一括バックアップを取って戻せるようにしたうえで、プログラムの更新を行うなど) - 現状、システムトレイの停止=サービスをdisabledしている。ユーザーが誤ってこの操作をするとリモートアクセスできなくなるので、その際の対策を検討する