RustDeskの公開サーバーが使えなくても困らない。Tailscaleで自前サーバーを立てる
忙しい人向け
仕組みの説明は後回しにして、まず動かしたい場合は以下だけでよい。
1. Server側
Tailscaleへ接続されていることを確認する。
tailscale status
tailscale ip -4
repositoryを取得する。
git clone https://github.com/sakai1250/Rustdesk-tailscale.git
cd Rustdesk-tailscale
RustDesk Serverを構築する。
sudo bash rustdesk-server.sh
最後に表示される、
公開鍵 (Key)
IDサーバー
の2つを保存する。
2. Client側
repositoryを取得する。
git clone https://github.com/sakai1250/Rustdesk-tailscale.git
cd Rustdesk-tailscale
rustdesk.shを開く。
nano rustdesk.sh
server側で表示された値を設定する。
HOST="100.x.x.x"
KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx="
その後、実行する。
sudo bash rustdesk.sh
最後に、
RustDesk ID
Password
IDサーバー
が表示されれば設定完了となる。
3. 接続先PCにも同じ設定を入れる
接続する両方のPCで、
HOST = 同じTailscale IP
KEY = 同じ公開鍵
を使用する。
あとは通常のRustDeskと同じように、
RustDesk ID
+
Password
で接続できる。
つながらない場合
まず、この順番だけ確認する。
tailscale ping 100.x.x.x
systemctl status hbbs hbbr --no-pager
sudo cat /var/lib/rustdesk/id_ed25519.pub
Tailscaleが通る → hbbs / hbbrが動いている → Keyが一致している
の順で確認すると、原因を切り分けやすい。
RustDeskは、離れた場所にあるPCを操作できるopen-sourceのremote desktop softwareである。
研究室や自宅のPCへ外から入りたいときに便利である一方、利用しているnetworkによってはRustDeskの公開serverへ接続できないことがある。
例えば、RustDeskを開いても、
Not ready. Please check your connection
のような表示が出て、公開ID serverへ接続できない場合がある。
この問題は、自前のRustDesk Serverを用意すれば回避できる。
ただし、普通に自前serverをInternetへ公開しようとすると、今度は別の面倒が生じる。
Public IP
Port forwarding
Firewall
DDNS
はじめに
remote desktopを使いたいだけにもかかわらず、routerの設定やPublic IPまで管理し始めると、必要な作業が一気に増える。
そこで今回は、
RustDesk Server OSS + Tailscale
を組み合わせる。
自分のPC
│
│ Tailscale
▼
自前RustDesk Server
├─ hbbs
└─ hbbr
│
│ Tailscale
▼
接続先PC
RustDesk Serverそのものは自分で管理しつつ、RustDesk用のportをInternetへ直接公開しない構成である。
つまり、
「公開RustDesk Serverには依存したくない。しかし、自前serverをInternetへ公開する管理も避けたい」
という場合に使いやすい構成となる。
この記事ではUbuntuを用い、server側とclient側をshell scriptで設定する。
この記事が向いている人
特に、次のような人を想定している。
- RustDeskの公開serverへ接続できない
- 研究室や自宅に常時起動しているUbuntu PCがある
- 複数のPCをRustDeskで遠隔操作したい
- Public IPやport forwardingをなるべく触りたくない
- Tailscaleをすでに使っている、または導入してもよい
最終的には、次のような構成を作る。
PC A
RustDesk Client
│
│ Tailscale
▼
┌─────────────────────┐
│ RustDesk Server │
│ │
│ hbbs : PCを見つける │
│ hbbr : 通信を中継 │
└─────────────────────┘
▲
│ Tailscale
│
PC B
RustDesk Client
ここまで構築すれば、普段のRustDeskと同じように、
RustDesk ID
+
Password
を使って別のPCへ接続できる。
なぜRustDesk Serverだけではなく、Tailscaleも使うのか
今回の構成で最も重要なのは、RustDesk ServerをTailscaleの内部へ置く点である。
RustDesk Server OSSを自分で立てれば、RustDesk公式の公開serverを使わずに接続できる。
しかし、自宅や研究室にserverを置き、それをInternet側から直接使えるようにする場合は、serverまで通信を届ける方法を考える必要がある。
一般的には、
Internet
↓
Public IP
↓
Router
↓
Port forwarding
↓
RustDesk Server
という形になる。
この方法でも利用できるが、Public IPが変わる環境ではDDNSを考えたり、router側でport forwardingを設定したり、firewallで公開範囲を確認したりする必要がある。
そこで今回は、RustDesk ServerをTailscaleのnetwork内に置く。
Tailscaleへ参加したdeviceには、通常100.x.x.x形式のIP addressが割り当てられる。このIPはLAN側の192.168.x.xとは別に割り当てられ、deviceが別の場所へ移動した場合でも基本的に維持される。
例えば、RustDesk ServerのTailscale IPが、
100.72.10.25
であるとする。
この場合、RustDesk clientから、
100.72.10.25
をID Serverとして指定すれば、Tailscale経由で自前serverへ接続できる。
その結果、
RustDesk ServerをInternetへ直接公開
↓
不要
Routerでport forwarding
↓
不要
LAN側IPが変わるたびにRustDeskを再設定
↓
不要
という構成にできる。
仕組みとしては、RustDesk用の通信経路をTailscale側へ任せているだけである。
研究室、自宅、ノートPCのように、別々のnetworkにあるPCをまとめて管理したい場合にも扱いやすい。
RustDesk Serverの中身を少しだけ知っておく
設定へ進む前に、hbbsとhbbrの役割だけ整理しておく。
RustDesk Server OSSでは、主に2つのprogramが動作する。
hbbs
→ 接続したいPCを見つける
hbbr
→ 直接つながらない場合に通信を中継する
正式には、hbbsがID、rendezvous、signalingを担当し、hbbrがrelayを担当する。
ただし、この記事では、
hbbs = PCを見つける
hbbr = 必要なら通信を中継する
程度の理解で十分である。
例えば、PC AからPC Bへ接続するとする。
PC A
│
│ 「PC Bにつなぎたい」
▼
hbbs
│
│ PC Bの情報
▼
PC A ───────────── PC B
直接接続
まずhbbsを使ってPC Bを見つける。
その後、PC同士を直接つなげられる場合は、そのまま直接通信する。
一方、直接接続できない場合には、
PC A
│
▼
hbbr
│
▼
PC B
という形でhbbrが通信を中継する。
したがって、自前serverを立てたからといって、すべての画面転送が必ずserverを経由するわけではない。
ここまで理解できれば、server側の設定へ進める。
準備
今回はUbuntu系Linuxを想定している。
必要なものは次の4つである。
- RustDesk ServerにするUbuntu PC
- RustDeskで操作するUbuntu PC
- Tailscale
- Git
まず、server側とclient側の両方を同じTailnetへ参加させる。
ここでは、RustDeskより先にTailscaleだけで通信できる状態を作ることが重要である。
Tailscaleの状態は次のcommandで確認できる。
tailscale status
続いて、serverとして使うPCのTailscale IPを確認する。
tailscale ip -4
例えば、
100.72.10.25
と表示されたとする。
このIPをあとでRustDeskのID Serverとして使用する。
1. RustDesk Serverを作る
今回使うscriptはGitHubに置いている。
git clone https://github.com/sakai1250/Rustdesk-tailscale.git
cd Rustdesk-tailscale
repositoryの中身は次のようになっている。
Rustdesk-tailscale/
├── README.md
├── rustdesk-server.sh
└── rustdesk.sh
それぞれの役割は単純である。
rustdesk-server.sh
→ RustDesk Serverを作る
rustdesk.sh
→ 各PCのRustDesk Clientを設定する
まず、serverとして使いたいPCで、
sudo bash rustdesk-server.sh
を実行する。
このscriptでは、
RustDesk Serverをdownload
↓
hbbs / hbbrをinstall
↓
systemdへ登録
↓
自動起動
↓
公開鍵を生成
までをまとめて行う。
hbbsとhbbrはsystemdのserviceとして登録されるため、server PCを再起動したあとも自動で起動する。
したがって、PCを再起動するたびにterminalからRustDesk Serverを手動で起動する必要はない。
処理が終わると、最後に次のような表示が出る。
==============================
公開鍵 (Key) : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
IDサーバー : 100.72.10.25
==============================
ここで表示された2つを保存しておく。
ID Server = 100.72.10.25
Key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
この2つを、あとでRustDesk client側へ設定する。
ID ServerにはRustDesk ServerのTailscale IP、Keyにはserverで生成された公開鍵が入る。
2. Serverが本当に動いているか確認する
scriptが最後まで動いたら、client側へ移る前にserverの状態を確認しておく。
この確認を挟んでおくと、接続できなかった場合の原因を切り分けやすい。
まず、
systemctl status hbbs hbbr --no-pager
を実行する。
両方に、
active (running)
と表示されていれば、server側は正常に起動している。
もしfailedになっている場合は、client側の設定へ進む前にserver側を直す必要がある。
公開鍵も確認できる。
sudo cat /var/lib/rustdesk/id_ed25519.pub
例えば、
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
のような文字列が表示される。
このid_ed25519.pubがclient側へ設定する公開鍵となる。
一方、
/var/lib/rustdesk/id_ed25519
は秘密鍵であるため、clientへコピーせずserver側だけに保存しておく。
名前がかなり似ているので、
id_ed25519.pub
↑
.pubあり
↓
clientへ設定
と覚えておくと分かりやすい。
3. RustDeskを設定する前にTailscaleで通信確認
次にclient PCへ移る。
ただし、すぐRustDeskを設定するのではなく、先にTailscaleだけでserverへ届くか確認する。
serverのTailscale IPが、
100.72.10.25
なら、client側から、
tailscale ping 100.72.10.25
を実行する。
応答が返れば、
Client
↓
Tailscale
↓
RustDesk Server
という経路までは正常に動作している。
この確認をしておけば、あとでRustDeskがつながらなかった場合に、
Tailscaleの問題なのか
↓
RustDeskの問題なのか
を分けて考えられる。
逆に、この時点でtailscale pingが通らない場合は、RustDeskを何度再installしても改善しない。
その場合は、
tailscale status
を確認し、serverとclientの両方が同じTailnet上に存在するか確認する。
4. RustDesk Clientを設定する
Tailscaleで通信できたら、RustDesk clientを設定する。
client側でもrepositoryをcloneする。
git clone https://github.com/sakai1250/Rustdesk-tailscale.git
cd Rustdesk-tailscale
続いて、
nano rustdesk.sh
でscriptを開く。
変更するのは次の2行である。
HOST="100.72.10.25"
KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx="
HOSTにはserver PCのTailscale IPを入れる。
HOST
↓
100.72.10.25
KEYには、rustdesk-server.shを実行したときに表示された公開鍵を入れる。
KEY
↓
id_ed25519.pubの中身
つまり、server側で取得した、
IDサーバー
公開鍵
の2つを、そのままclient側へ渡す形である。
ここについては、仕組みを複雑に考える必要はない。
5. RustDesk Clientを一発で設定する
HOSTとKEYを書き換えたら、
sudo bash rustdesk.sh
を実行する。
このscriptでは、
RustDeskをinstall
↓
ID Serverを設定
↓
公開Keyを設定
↓
固定Passwordを設定
↓
RustDeskを再起動
までをまとめて行う。
通常のGUI操作でも設定できるが、複数台へ同じserver設定を入れる場合はscript化しておく方が楽である。
特に、研究室PCやGPU serverなどを何台も設定する場合には、同じ作業を繰り返す必要がなくなる。
処理が終わると、
==============================
RustDesk ID: 123456789
パスワード : A8b3Jd92Ks
IDサーバー : 100.72.10.25
==============================
のように表示される。
ここで表示された、
RustDesk ID
Password
を使って接続する。
これでclient側の基本設定は完了となる。
Passwordを自分で決めたい場合
rustdesk.shでは、引数を指定しなければ10文字の英数字Passwordを自動生成する。
sudo bash rustdesk.sh
自分で固定Passwordを決めたい場合は、
sudo bash rustdesk.sh '自分のPassword'
のように指定できる。
ただし、この方法では入力したPasswordがshell historyに残る可能性がある。
例えば、
sudo bash rustdesk.sh 'MyPassword123'
というcommandそのものが履歴へ残る場合がある。
そのため、固定Passwordへこだわらない場合は、
sudo bash rustdesk.sh
として、自動生成されたPasswordを保存しておく方法が扱いやすい。
6. 接続したいPCにも同じServerを設定する
接続元のPCだけ自前serverへ向ければ終わり、というわけではない。
接続する両方のRustDesk clientを、同じRustDesk Serverへ向ける必要がある。
例えば、
RustDesk Server
100.72.10.25
を使う場合は、
PC A
HOST = 100.72.10.25
KEY = 同じ公開鍵
PC B
HOST = 100.72.10.25
KEY = 同じ公開鍵
とする。
PCごとに別々のKeyを作る必要はない。
同じRustDesk Serverを使うPCには、同じID Serverと同じ公開鍵を設定する。
ここまで終われば、あとは通常のRustDeskとほぼ同じ操作になる。
PC A
↓
PC BのRustDesk IDを入力
↓
Passwordを入力
↓
接続
2台目以降についても、
HOST
KEY
は同じ値を使えるため、そのまま設定を流用できる。
ここまでの流れを整理する
少し手順が長く見えるので、一度まとめる。
server側では、
git clone https://github.com/sakai1250/Rustdesk-tailscale.git
cd Rustdesk-tailscale
sudo bash rustdesk-server.sh
を実行する。
すると、
ID Server
Key
が表示される。
次にclient側で、
git clone https://github.com/sakai1250/Rustdesk-tailscale.git
cd Rustdesk-tailscale
nano rustdesk.sh
を実行する。
そして、
HOST="ServerのTailscale IP"
KEY="Serverの公開鍵"
を書き換えたあと、
sudo bash rustdesk.sh
を実行する。
流れだけを見ると、
Serverを作る
↓
Tailscale IPとKeyを取得
↓
Clientへ設定
↓
RustDesk IDで接続
という単純な構成である。
接続できない場合は、上から順番に確認する
接続できない場合は、RustDeskをいきなり再installするより、通信経路を上から順番に確認した方が原因を見つけやすい。
今回の構成では、確認する順番も単純である。
1. TailscaleでServerへ届くか
まず、
tailscale ping 100.72.10.25
を確認する。
ここで失敗する場合は、まだRustDesk Serverまで通信が届いていない。
続いて、
tailscale status
を確認する。
serverとclientの両方が見えているか確認する。
2. hbbsとhbbrが動いているか
server側で、
systemctl status hbbs hbbr --no-pager
を確認する。
両方とも、
active (running)
となっている必要がある。
落ちている場合は、
sudo systemctl restart hbbs hbbr
で再起動できる。
原因を詳しく確認したい場合は、
journalctl -u hbbs -u hbbr -n 100 --no-pager
でlogを見る。
3. Keyが正しいか
server側で、
sudo cat /var/lib/rustdesk/id_ed25519.pub
を実行する。
表示された文字列と、client側の、
KEY="..."
が完全に一致しているか確認する。
特に末尾の、
=
まで含めてcopyする必要がある。
手入力すると間違えやすいため、そのままcopyする方が安全である。
4. Tailscale IPを間違えていないか
server側で、
tailscale ip -4
をもう一度確認する。
今回使うのは、
100.x.x.x
というTailscale側のIPである。
例えば、
192.168.1.50
のようなLAN側IPを指定するわけではない。
Tailscaleのdevice IPは通常安定しているため、LAN側のDHCPによって192.168.x.xが変わってもRustDesk側を毎回設定し直す必要はない。
研究室のように、PCを再接続するとLAN側IPが変わる環境では特に便利である。
UFWを有効にしている場合
ここまで確認してもserverへ接続できない場合は、Ubuntu側のfirewallも確認する。
まず、
sudo ufw status
を実行する。
Status: inactive
であれば、この項目は飛ばしてよい。
一方でUFWを有効にしている場合は、Internet全体にRustDeskのportを開けるのではなく、tailscale0から来た通信だけ許可する構成にできる。
最小構成なら、
sudo ufw allow in on tailscale0 to any port 21115 proto tcp
sudo ufw allow in on tailscale0 to any port 21116 proto tcp
sudo ufw allow in on tailscale0 to any port 21116 proto udp
sudo ufw allow in on tailscale0 to any port 21117 proto tcp
という形になる。
重要なのは、
Internet全体へRustDesk portを公開する
のではなく、
tailscale0から入ってきた通信を許可する
という点である。
なお、RustDeskのWeb clientまで利用する場合は21118/TCPと21119/TCPも関係する。
今回の記事では通常のdesktop clientを想定しているため、Web clientについては扱わない。
Tailscaleを使うと何が楽になるのか
ここまで設定すると、今回Tailscaleを組み合わせた理由が分かりやすくなる。
普通にRustDesk ServerをInternetへ公開する場合は、
RustDesk Client
↓
Internet
↓
Public IP
↓
Router
↓
Port forwarding
↓
RustDesk Server
という構成になる。
一方、今回の構成は、
RustDesk Client
↓
Tailscale
↓
100.x.x.x
↓
RustDesk Server
となる。
したがって、RustDesk Serverのためだけにrouterへport forwardingを追加する必要がない。
さらに、
研究室PC
自宅PC
ノートPC
GPU Server
が別々の場所に置かれていても、同じTailnetへ参加させれば、Tailscale上では相互に通信できる。
役割を分けると、
RustDesk
→ remote desktopを担当
Tailscale
→ PC同士をつなぐnetworkを担当
となる。
このように考えると、今回の構成を理解しやすい。
1つだけ注意しておきたいこと
現在のrustdesk-server.shには、Tailscale IPを取得できなかった場合に警告を表示し、その後LAN側IPへfallbackする処理が入っている。
つまり、
Tailscale IPを取得
↓
失敗
↓
LAN側IPを取得
という挙動になる。
とりあえずserverを動かしたい場合には便利である一方、
「このRustDesk Serverは必ずTailscale経由だけで使う」
と決めている場合には、Tailscaleへ接続できていない時点で処理を終了させる方が分かりやすい。
例えば、
TS_IP=$(tailscale ip -4 2>/dev/null | head -1)
if [ -z "$TS_IP" ]; then
echo "Tailscaleに接続されていません"
exit 1
fi
のように変更できる。
こうしておけば、
Tailscale未接続
↓
LAN側IPへfallback
↓
気付かずそのIPをClientへ設定
という間違いを防げる。
特に研究室と自宅のように別network間で利用する場合、LAN側IPでは接続できないため、この変更を入れておく方が挙動も明確になる。
まとめ
今回は、RustDesk Server OSSとTailscaleを組み合わせ、自前RustDesk Serverを構築する方法を紹介した。
この構成を使うと、
RustDesk公式の公開serverへ依存しない
+
RustDesk ServerをInternetへ直接公開しない
+
Routerのport forwardingを増やさない
+
Public IPを意識しなくてよい
+
安定したTailscale IPを利用できる
という環境を作れる。
server側で行う作業は、
sudo bash rustdesk-server.sh
である。
そこで表示された、
ID Server
Key
をclient側のrustdesk.shへ設定し、
sudo bash rustdesk.sh
を実行する。
最終的な流れは次のようになる。
ServerとClientをTailscaleへ参加
↓
RustDesk Serverを起動
↓
Tailscale IPと公開Keyを取得
↓
各Clientへ同じ値を設定
↓
RustDesk ID + Passwordで接続
RustDeskの公開serverへ接続できない環境への対策として利用できるだけでなく、研究室PC、自宅PC、GPU serverなど、自分で管理している複数のPCをまとめて遠隔操作したい場合にも使いやすい構成である。
今回使用したscriptはこちらに置いている。
GitHub:sakai1250/Rustdesk-tailscale
https://github.com/sakai1250/Rustdesk-tailscale
最初にserverとclientで、
tailscale status
を確認し、同じTailnetから互いに見えていることを確認してから設定を進めると、問題が起きた場合にも原因を切り分けやすい。