0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Tailscale経由でSelf-Hosted RustDesk Serverを構築する

忙しい人向け

仕組みはあとで読めば大丈夫です。まず動かしたい場合は、ここだけ進めれば設定できます。

1. Server側

まず、Server PCが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つはClient側で使うので、ここで保存しておきます。


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サーバー

が表示されれば、Client側の設定は完了です。ここまで出ていれば、次は実際に別PCから接続できるか確認します。


3. 接続先PCにも同じ設定を入れる

接続する両方のPCで、

HOST = 同じTailscale IP
KEY  = 同じ公開鍵

を使います。

あとは通常のRustDeskと同じように、

RustDesk ID
+
Password

で接続できます。ここまで同じServerを向いていれば、普段のRustDeskとほぼ同じ感覚で使えます。

つながらない場合

つながらないときは、設定を闇雲に触るより、次の順番で確認します。

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を再installする前に、まずここを確認するのがおすすめです。

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側から直接つなぐなら、通信をどう届けるかまで自分で考える必要があります。

一般的には、

Internet
   ↓
Public IP
   ↓
Router
   ↓
Port forwarding
   ↓
RustDesk Server

という形です。

この方法でも使えます。ただ、Public IPが変わる環境ではDDNSが必要になり、routerのport forwardingやfirewallの公開範囲まで管理することになります。remote desktopのためだけに背負うには、少し重いです。

そこで今回は、できるだけ管理を増やさないために、RustDesk ServerをTailscaleのnetwork内に置きます

Tailscaleへ参加したdeviceには、通常100.x.x.x形式のIP addressが割り当てられます。LAN側の192.168.x.xとは別のIPで、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の中身を少しだけ知っておく

設定へ進む前に、hbbshbbrの役割だけ整理しておきます。

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を想定しています。

Tailscaleの導入部分は、Qiitaの「[Ubuntu Server 22.04] Tailscale インストール」を参考にしました。この記事ではTailscaleそのものの導入手順は詳しく扱わず、ServerとClientを同じTailnetへ参加させた状態から進めます。

必要なものは次の4つです。

  • RustDesk ServerにするUbuntu PC
  • RustDeskで操作するUbuntu PC
  • Tailscale
  • Git

まず、Server側とClient側の両方を同じTailnetへ参加させます。

ここでは、RustDeskより先にTailscaleだけで通信できる状態を作ることが大事です。ここを確認せず進めると、あとで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へ登録
        ↓
自動起動
        ↓
公開鍵を生成

までをまとめて行います。

hbbshbbrはsystemdのserviceとして登録されるので、Server PCを再起動したあとも自動で立ち上がります。

そのため、PCを再起動するたびにterminalからRustDesk Serverを手動で起動する必要はありません。

処理が終わると、最後に次のような表示が出ます。

==============================
 公開鍵 (Key) : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
 IDサーバー   : 100.72.10.25
==============================

ここで表示された2つは必ず保存しておきます。 Client側の設定でそのまま使います。

ID Server = 100.72.10.25
Key       = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=

この2つを、あとでRustDesk Client側へ設定します。

ID ServerにはRustDesk ServerのTailscale IP、KeyにはServerで生成された公開鍵が入ります。


2. Serverが本当に動いているか確認する

scriptが最後まで動いたら、Client側へ移る前にServerの状態を確認しておきます。

この確認を先に済ませておけば、あとで接続できなかったときに「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

という経路までは正常です。ここまで通れば、Tailscale側は一度切り分けから外せます。

この確認をしておけば、あとでRustDeskがつながらなかった場合に、

Tailscaleの問題なのか
        ↓
RustDeskの問題なのか

を分けて考えられます。

逆に、この時点でtailscale pingが通らないなら、RustDeskを何度再installしても直りません。まずTailscale側を確認します。

その場合は、

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側へ渡すだけです。

ここは難しく考えなくて大丈夫です。Serverが出したID ServerKeyをClientへ渡す、と覚えておけば足ります。


5. RustDesk Clientを一発で設定する

HOSTKEYを書き換えたら、

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まで通信が届いていません。RustDesk側を触る前に、まずTailscaleを直します。

続いて、

tailscale status

を確認します。

serverとclientの両方が見えているか確認します。


2. hbbsとhbbrが動いているか

server側で、

systemctl status hbbs hbbr --no-pager

を確認します。

両方とも、

active (running)

になっていればOKです。

落ちている場合は、

sudo systemctl restart hbbs hbbr

で再起動できます。再起動しても落ちる場合は、次のjournalctlでlogを確認します。

原因を詳しく確認したい場合は、

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ではありません。ここを取り違えると、別networkから接続できません。

Tailscaleのdevice IPは通常安定しているので、LAN側のDHCPで192.168.x.xが変わっても、RustDesk側を毎回設定し直す必要はありません。

研究室のように、PCをつなぎ直すたびLAN側IPが変わりやすい環境では、この点がかなり助かります。


UFWを有効にしている場合

ここまで問題がなければ、次はUbuntu側のfirewallを確認します。

まず、

sudo ufw status

を実行します。

Status: inactive

であれば、UFWは原因ではないのでこの項目は飛ばして大丈夫です。

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から入ってきた通信を許可する

という点です。Internet全体へ開ける必要はありません。

なお、RustDeskのWeb Clientまで使う場合は21118/TCP21119/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を担当

になります。

役割を分けて考えると、今回の構成はかなりシンプルです。RustDeskは画面操作、Tailscaleは通信経路だけを担当します。


1つだけ注意しておきたいこと

現在のrustdesk-server.shには、Tailscale IPを取得できなかった場合に警告を出し、その後LAN側IPへfallbackする処理が入っています。

つまり、

Tailscale IPを取得
      ↓
失敗
      ↓
LAN側IPを取得

という挙動です。

とりあえずServerを動かすだけなら便利です。ただし、

「このRustDesk Serverは必ずTailscale経由だけで使う」

と決めているなら、Tailscaleへ接続できていない時点で処理を止める方が安全です。意図せずLAN側IPをClientへ設定する事故を防げます。

例えば、

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では届きません。そのため、Tailscale専用で運用するならこの変更を入れておく方が安全です。


まとめ

今回は、RustDesk Server OSSとTailscaleを組み合わせて、自前RustDesk Serverを構築する方法を紹介しました。

この構成を使うと、

RustDesk公式の公開serverへ依存しない
+
RustDesk ServerをInternetへ直接公開しない
+
Routerのport forwardingを増やさない
+
Public IPを意識しなくてよい
+
安定したTailscale IPを利用できる

という環境を作れます。

Server側では、まず次のscriptを実行します。

sudo bash rustdesk-server.sh

scriptが終わったら、表示されたID ServerKeyを控えておきます。

そこで表示された、

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から互いに見えている状態を作ってから進めるのがおすすめです。ここを先に確認しておけば、問題が起きてもRustDesk側とTailscale側を分けて追えます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?