DeskflowでLinuxノートPCとヘッドレスMac miniを1組のキーボードとマウスで操作する

DeskflowでLinuxノートPCとヘッドレスMac miniを1組のキーボードとマウスで操作する

途中で遭遇したすべての権限設定、証明書、ファイアウォールルール、エラーメッセージを網羅した完全ステップバイステップガイド

今日は2026年10月13日。何日も中途半端なままになっていた小さなプロジェクト、すなわち2台のコンピューターで1組のキーボードとマウスを使うという作業をついに完了しました。1台はLinuxノートPC。もう1台はモニターなしで部屋の隅に置かれ、普段はSSH経由でしかアクセスしないMac miniです。この用途に使用したツールはDeskflowです。これは、1台のコンピューターのキーボードとマウスでネットワーク経由で他のコンピューターを操作できるようにする、無料のオープンソースプログラムです。

アイデア自体はシンプルです。しかし実際には、一連の隠れたステップが10個以上ありました。LinuxもmacOSも以前より多くの権限を要求するようになっており、エラーメッセージが必ずしも本当の原因を示しているとは限らないため、これらを書き留めておくには良いタイミングです。初めて登場する用語はその都度丁寧に説明しながら、ゆっくりと進めていきます。また、実際に遭遇したエラーメッセージも掲載するので、同じメッセージが表示された場合に検索してこのページを見つけられるようにしています。

本記事で学べること

読み終わる頃には、以下の方法がわかるようになります:

  • サーバーとクライアントの選択方法と、なぜその選択が重要なのか;
  • カーソルが正しい方向に画面端を横切るように画面レイアウトを描く方法;
  • Deskflowが接続の暗号化に使用するTLS証明書を作成し、信頼する方法;
  • SSH経由では付与できないmacOSの権限を付与する方法;
  • 自宅ネットワークに対してのみ、それ以外の通信を遮断した状態でLinuxのファイアウォールを開放する方法;
  • Macへのログイン時にクライアントを自動起動する方法;
  • よくある2つの失敗タイプ(接続の問題か、権限の問題か)のどちらが発生しているかを見分ける方法。

Deskflowの仕組み(わかりやすい解説)

Deskflowには2つの役割があります。

「 サーバー 」は、実際のキーボードとマウスが接続されているコンピューターです。すべてのキー入力とマウスの動きを読み取ります。

「 クライアント 」は、サーバーから操作したいコンピューターです。クライアント側の小さなバックグラウンドプログラムがネットワーク経由でサーバーのTCPポート24800に接続し、指示を待ちます。

また、各画面の配置を示す小さなマップも作成します。私の環境では、MacはノートPCの右側にあります。ポインターがノートPCの画面上にある間は、すべて通常通り動作します。ポインターがノートPC画面の右端に達すると、サーバーはノートPCのプログラムへのイベント送信を停止し、代わりにMacへの送信を開始します。Mac上のクライアントは、あたかもキーボードとマウスがMacに直接接続されているかのように、それらのイベントをローカルに注入します。ポインターをMacの左端から外へ押し出すと、操作権はノートPCに戻ります。

Deskflowでは対応していない3つのこと(期待しすぎないために):

  • もう一方のコンピューターの画面を表示することはできません。Macにモニターがない場合でも、ポインターはソフトウェア上にのみ存在する画面上を移動します。そこで何を行っているかを確認するには、モニターまたは画面共有ツールが必要です。
  • ドラッグ&ドロップによるファイル移動はできません。共有されるのはポインター、キーボード、クリップボードのみです。
  • 自動ログインは行いません。クライアントプログラムが実行中である必要があり、ディスク暗号化が有効なMacでは、最初に誰かがログインする必要があります。

作業開始時の環境

  • サーバーとして使用する、Wayland環境でGNOMEデスクトップが動作し、2台のモニターを備えたLinuxノートPC。ここではこれを laptop.
  • クライアントとして使用する、FileVault(ディスク暗号化)が有効な最新のmacOSが動作するMac mini。ここではこれを macminiと呼びます。モニターはなく、普段はSSH経由でのみアクセスするため、公開鍵認証のみのSSHログインはすでに設定済みでした。
  • Deskflow 1.27.0は両方のマシンにインストール済み。Linuxでは .deb パッケージから導入し、MacではApplicationsフォルダーにある通常のアプリケーションです。
  • 両方のマシンが同じ自宅のネットワーク上にあり、各マシンに変更されない固定アドレスを割り当てるプライベートネットワークであるTailscaleにも接続されていること。
  • USBハブ経由でノートPCに接続されたキーボードとマウス。

本記事全体を通してプレースホルダーのアドレスを使用します。 192.0.2.10 は自宅ネットワーク上のノートPC、そして 100.64.0.10 はTailscale上のノートPCです。Mac自身のアドレスである 192.0.2.20は、どこにも入力する必要はありません。これらはご自身の環境のアドレスに置き換えてください。

始める前に:ハードウェアを把握する

最初に数分かけて、ノートPCに実際にどのキーボードとマウスが接続されているかを確認しました。物理デバイスがMacではなく確実にノートPC側にあることを確認したかったからです。Linuxなら追加ソフトウェアなしで確認できます。

USBデバイスを一覧表示する:

lsusb
lsusb -t

2つ目のコマンドはツリー形式で出力し、どのデバイスがどのハブの配下にあるかを示します。私の環境では、両方のワイヤレスレシーバー(ワイヤレスマウスやキーボードが使用する小型USBドングル)が同じUSBハブに接続されており、そのハブがノートPCに接続されていました。

Bluetoothデバイスを一覧表示し、詳細情報を確認する:

bluetoothctl devices
bluetoothctl info AA:BB:CC:DD:EE:FF

bluetoothctl info は、デバイスがペアリングされ、信頼され、現在接続されているかどうかを表示します。私のキーボードは3つのBluetoothチャンネルに対応しており、1つのチャンネルはノートPCに、もう1つのチャンネルはMacにペアリングされていました。これは便利なフォールバックになります。もしDeskflowが動作しなくなった場合でも、キーボード上のボタンを押すだけで別のコンピューターに切り替えることができます。

ドングルが2つあり、どちらがマウスのものかを知りたい場合は、マウスを動かしている間に各デバイスが送信するイベントをカウントできます。まずデバイス名を確認します:

ls -l /dev/input/by-id/

次に、1つのデバイスを30秒間監視し、ポインターイベントをカウントします:

sudo timeout 30 libinput debug-events --device /dev/input/event3 | grep -c POINTER

マウスを動かしたときに数千件のイベントを生成したドングルがマウスのレシーバーでした。もう一方は何も生成しませんでした。これはDeskflowを使う上で必須ではありませんが、複数のUSBレシーバーが接続されたLinuxマシンでは便利な小技です。

ステップ 1: サーバーウィンドウでモードを選択する

最初の試みでは、設定ファイルを手動で記述し、SSH経由でコマンドラインからサーバーを起動しようとしました。しかしこのバージョンのDeskflowでは、設定ファイルに画面レイアウトが存在すると、サーバーが直ちにセグメンテーション違反(segmentation fault)でクラッシュしました。ヘッドレスQtプラットフォームの指定有無を両方試しましたが、結果は同じでした。無理にコマンドラインで粘るのをやめ、代わりにGUIウィンドウを使用することにしました。

ウィンドウを開いたとき、Startボタンはグレー表示され、ウィンドウには「You must select a mode」と表示されていました。このコンピューターがサーバーであることをDeskflowに指定していなかったためです。「Use this computer's keyboard and mouse (make this computer the server)」と書かれた最初のオプションを選択してください。「Configure Server」ボタンと、有効化されたStartボタンが表示されます。

もしStartがグレー表示されているのを見かけたら、まずここを確認してください。Startをクリックしても何も起きない最も一般的な原因です。

ステップ 2: レイアウトを配置する

「Configure Server」をクリックします。中央に自分のコンピューターが配置されたグリッドが表示されます。右上隅にモニターのアイコンがあります。それをグリッド上にドラッグし、もう一方のコンピューターが物理的に置かれている側に配置します。私はノートPCのすぐ右隣のマスに配置しました。

新しく追加された画面の名前は「Unnamed」になっています。ダブルクリックして設定を開き、クライアントが使用する名前を入力します。この名前は、大文字やハイフンを含め、クライアントのコンピューター名と完全に一致している必要があります。私の場合は macminiと指定しました。修飾キーやその他のオプションはそのままにしておいて構いません。そのウィンドウでSaveをクリックし、次に「Configure Server」ウィンドウでもう一度Saveをクリックします。

その後、メインウィンドウでStartをクリックします。ステータス行が「Deskflow is waiting for clients」に変わるはずです。

ステップ 3: サーバーに入力キャプチャを許可する(Wayland)

Waylandデスクトップでは、デスクトップ環境による明示的な許可がない限り、プログラムがシステム全体のキーボードやマウスの入力を読み取ることは禁止されています。Deskflowがサーバーを起動すると、GNOMEは次のようなプロンプトを表示します:

アプリケーションが入力イベントのキャプチャを求めています。リモート入力のキャプチャを許可(Allow Remote Input Capturing)。

スイッチをオンにして「Share」をクリックします。これが、Deskflowがキーボードとマウスの入力を読み取って転送できるようにするための権限です。これを拒否すると、サーバーは起動するものの、クライアント側には何も送信されなくなります。

サーバーが起動してリッスンしていることは、次のコマンドで確認できます:

ss -ltn | grep 24800

リスニング状態の 0.0.0.0:24800 が含まれる行が表示されるはずです。

ステップ 4: クライアントに証明書を付与する

Deskflowは、Webページを保護するのと同じ技術であるTLSを使用して接続を暗号化します。双方に証明書が必要です。サーバーは初回実行時に自身の証明書を自動作成します。一方、コマンドラインからしか実行したことがないクライアントには証明書が存在せず、起動した際に以下のようなエラーが表示されました:

ERROR: secure socket error: tls certificate doesn't exist: .../Library/Deskflow/tls/deskflow.pem
ERROR: could not load client certificates

Mac上ですでにインストールされている opensslを使用して証明書を作成しました:

mkdir -p ~/Library/Deskflow/tls && cd ~/Library/Deskflow/tls
openssl req -x509 -newkey rsa:2048 -nodes -days 3650 \
  -subj "/CN=macmini" -keyout key.tmp -out cert.tmp
cat key.tmp cert.tmp > deskflow.pem && rm key.tmp cert.tmp
chmod 600 deskflow.pem
openssl x509 -in deskflow.pem -noout -fingerprint -sha256

Deskflowは秘密鍵と証明書が1つのファイルにまとまっていることを前提としているため、 cat コマンドでそれらを結合しています。ファイルパーミッションの 600 は、自身のユーザーのみが読み取れることを意味します。ファイルに秘密鍵が含まれているため、これは重要です。最後のコマンドは、証明書を識別する短いコードである証明書のフィンガープリントを出力します。これを書き留めておいてください。次のステップで比較します。

ステップ 5: お互いのフィンガープリントを信頼する

フィンガープリントは、偽造できない名札のようなものです。Deskflowは、信頼するように設定されていないフィンガープリントを持つコンピューターとは通信しません。これにより、ネットワーク上の見知らぬ第三者がMacになりすますのを防ぎます。

サーバー側。 クライアントが初めて接続した際、サーバー側には「New client connecting」というウィンドウが表示されます。そこには画像とクライアントのフィンガープリントのハッシュが表示されます。「Show hash」をクリックし、ステップ4で書き留めたフィンガープリントと比較してください。完全に一致している場合のみ「Yes」をクリックします。私の場合、1文字も違わず一致していました。「Yes」をクリックすると、サーバーはそのフィンガープリントを trusted-clients というファイル名で、自身の tls フォルダー内に保存します。

クライアント側。 クライアント側でもサーバーを信頼する必要があります。そうしないと、クライアントのログは次のようなメッセージで埋め尽くされます:

WARNING: fingerprint does not match trusted fingerprint
ERROR: failed to verify server certificate fingerprint

これを修正するには、Mac上の trusted-serversというファイルにサーバーのフィンガープリントを追加します。まずノートPC側でフィンガープリントを確認します:

openssl x509 -in ~/.config/Deskflow/tls/deskflow.pem -noout -fingerprint -sha256

次にMac側で、コロンを省いて小文字にし、プレフィックスとして v2:sha256: を付けて書き込みます:

printf 'v2:sha256:<64 lowercase hex characters>\n' > ~/Library/Deskflow/tls/trusted-servers
chmod 600 ~/Library/Deskflow/tls/trusted-servers

先頭の数文字がサーバーウィンドウに表示されたものと一致していることを確認してください。この確認は省略しないでください。GUIクライアントを使用している場合は、初回接続時に画面上でフィンガープリントの確認を求めるプロンプトを表示させることもでき、同じ役割を果たします。

ステップ 6: DeskflowにMacの制御権限を付与する

この時点でクライアントは接続されたものの、直ちに終了してしまいました。ログには次のように記録されていました:

INFO: connected to secure socket
WARNING: cursor may not be visible
ERROR: failed to create quartz event tap
FATAL: process is not trusted anymore, quitting

接続と証明書には問題ありませんでした。macOSがDeskflowによるキーボードとマウスのイベントの読み取りおよび注入を拒否していたのです。この権限は「アクセシビリティ(Accessibility)」と呼ばれ、「システム設定」の「プライバシーとセキュリティ」内にあります。

これはSSH経由では実行できないステップです。macOSはそのリストを保護しており、変更にはアカウントのパスワードが求められます。システム整合性保護(SIP: System Integrity Protection)によってブロックされるため、管理者権限を持つユーザーであってもコマンドラインからプライバシーデータベースを編集することはできません。そのため、モニターを直接接続するか「画面共有」経由でMacの画面を表示し、自分でパスワードを入力する必要があります。

手順は以下のとおりです:

  1. 「システム設定」を開き、「プライバシーとセキュリティ」、「アクセシビリティ」の順に進みます。
  2. MacでDeskflowアプリケーションを起動します。するとmacOSが「“Deskflow”がこのコンピュータを制御することを求めています(Deskflow would like to control this Mac)」と尋ね、Deskflowをオフの状態でリストに追加します。
  3. Deskflowのスイッチをオンにします。パスワードを求められたらアカウントのパスワードを入力します。
  4. 同じエリアに「入力監視(Input Monitoring)」もある場合、キーボード入力がMacに届かないときはそこでもDeskflowが許可されているか確認してください。

SSHに関する落とし穴

DeskflowクライアントをSSHセッションから起動した場合、macOSは権限を要求しているプログラムを「Deskflow」とは認識しません。SSHサービスとして認識します。そのため、アクセシビリティのリストには sshd-keygen-wrapperという名前のエントリとして表示されます。SSHから起動したクライアントを動作させるために、これをオンにしたくなるかもしれませんが、それはお勧めしません。これを有効にすると、あらゆるSSHセッションから起動されたすべてのプロセスに対して、キーボードの読み取りやマウスの制御を行う権限が与えられてしまいます。これは決して与えるべきではない強大な権限です。クライアントはDeskflowアプリケーションから起動し、そのアプリケーションに対して権限を付与してください。すでにこのラッパーをオンにしてしまった場合は、オフに戻してください。Deskflowには独自のエントリがあるため、引き続き問題なく動作します。

ステップ 7: アプリケーションからクライアントを起動する

MacでDeskflowアプリを開きます。「Use another computer's mouse and keyboard (make this computer the client)」を選択します。コンピューター名がステップ2で指定した画面名と同じであることを確認してください。「Connect to」にノートPCのアドレスを入力し、「Connect」をクリックします。起動に成功すると次のように表示されます:

INFO: connected to secure socket
INFO: server tls certificate info: /CN=Deskflow
INFO: local layouts: en
INFO: remote layouts: en
Deskflow is connected as client of 192.0.2.10

ノートPC側からは、反対側から次のコマンドで接続を確認できます:

ss -tn state established '( sport = :24800 )'

ピアとしてMacのアドレスが表示されている行があれば、クライアントが接続されていることを意味します。次に、ポインタをノートPC画面の右端の外側へ動かし、そのまま少し押し続けてみてください。Deskflowは画面端で約0.25秒待機してから切り替わるため、境界付近で作業しているときに誤って移動してしまうのを防ぐことができます。

ステップ8: Tailscaleだけでなく、自宅ネットワークも利用する

最初にMacからノートPCのTailscaleアドレスを指定したところ、すぐに動作しました。Tailscaleは各マシンに固定アドレスを割り当て、暗号化とルーティングを処理してくれるため、他に追加でポートを開放する必要はありません。しかし、この2台のコンピューターは同じ部屋にあります。自宅ネットワーク経由の直接接続の方が遅延が少なく、マウスの動作は遅延に対して非常に敏感です。また、悪天候などでインターネット接続が切断された場合でも、ローカル接続なら動作し続けます。

そのため自宅ネットワークのアドレスを使おうとしたのですが、接続は単にタイムアウトしてしまいました。クライアントのログには次のように表示されていました:

WARNING: failed to connect to server: cannot connect socket
WARNING: failed to connect to server: Timed out

2つの独立した問題が原因となっていました。

macOSの「ローカルネットワーク」確認プロンプト

最初のメッセージ、 cannot connect socketは、macOSがDeskflowによるローカルネットワーク上のデバイスとの通信をまだ許可していなかったために表示されたものです。アプリケーションが初めて試行する際、macOSは次のように表示します:

"Deskflow" にローカルネットワーク上のデバイスの検索を許可しますか?

「許可」をクリックします。Tailscaleのアドレスではこのプロンプトが表示されないため、それまで目にしたことがありませんでした。誤って「許可しない」をクリックしてしまった場合は、後から「システム設定」の「プライバシーとセキュリティ」>「ローカルネットワーク」で変更できます。

Linuxのファイアウォール

「許可」をクリックした後、メッセージは Timed outに変わりました。これは、パケットがMacから送信されているものの、一切応答がないことを示しています。Macからテストしてみました:

ping -c 2 192.0.2.10
nc -vz -G 4 192.0.2.10 24800
nc -vz -G 4 100.64.0.10 24800

pingは通り、自宅アドレスへのポートテストはタイムアウトし、Tailscaleアドレスへのポートテストは成功しました。この挙動のパターンは、ノートPC上のファイアウォールを真っ先に示唆しています。ノートPCでは ufwが使われており、デフォルトルールは「すべての受信接続を拒否(deny all incoming connections)」でした。Tailscaleのトラフィックは別のルールで許可されているため、Tailscaleアドレスは最初から機能していたのです。

ルールは次のコマンドで確認できます:

sudo ufw status verbose

自宅ネットワークに対してのみDeskflowのポートを開放するルールを1つ追加しました:

sudo ufw allow from 192.0.2.0/24 to any port 24800 proto tcp comment "Deskflow (LAN only)"

重要なのはこの from 192.0.2.0/24 の部分です。これは、インターネット全体ではなく、自身の自宅ネットワーク上のコンピューターのみがポートにアクセスできることを意味します。リスクを理解していない限り、このようなポートを「Anywhere」に対して絶対に開放してはいけません。ノートPC上のリモートデスクトップや印刷用の他のルールもすでに同じパターンを踏襲していたため、このルールも違和感なく適合しました。

接続は数秒以内に確立されました。その後、Mac側のログには、Macの自宅アドレスからノートPCの自宅アドレスへの接続が表示されました。

クライアントに両方のアドレスを指定する

Deskflowはカンマ区切りのサーバーリストを受け付け、順に接続を試行します。Macの「Connect to」フィールドを次のように設定しました:

192.0.2.10,100.64.0.10

これは、最初に自宅ネットワークを試し、それが機能しない場合にTailscaleへフォールバックすることを意味します。カンマの後にスペースを入れないでください。試しに 192.0.2.10, 100.64.0.10 のようにスペースを入れて入力したところ、アプリケーションは何の警告もなくフィールドを空にし、Connectボタンを押しても何も起きませんでした。設定ファイルにはこのリストが単一の引用符で囲まれた文字列として保存されますが、これは正常な動作です。

もう1つのヒント: ノートPCの自宅アドレスは通常DHCPから割り当てられるため、変更される可能性があります。変更された場合、クライアントはTailscaleにフォールバックします。自宅アドレスを恒久的なものにするには、ルーター側でノートPCに固定IPアドレスを割り当てるか、DHCP予約を設定してください。

ステップ9: クライアントを自動起動する

普段触れることのないコンピューターにおいて、手動で起動しなければならないクライアントはあまり役に立ちません。アプリケーションをログイン項目に追加しましょう。これは「システム設定」の「一般」>「ログイン項目」で行えます。コマンドで行いたい場合は次のとおりです:

osascript -e 'tell application "System Events" to make login item at end with properties {path:"/Applications/Deskflow.app", hidden:false, name:"Deskflow"}'

続いて、クライアントの設定ファイルで2つの設定が適切に配置されていることを確認します: ~/Library/Deskflow/Deskflow.conf:

[core]
coreMode=1
computerName=macmini

[client]
remoteHost="192.0.2.10,100.64.0.10"

[gui]
startCoreWithGui=true

coreMode=1 はクライアントを意味し、 startCoreWithGui=true は「アプリケーションの起動時に接続を開始する」ことを意味し、 remoteHost にはサーバーのリストが保持されます。アプリは接続された状態で終了すると、 startCoreWithGui 自体を自動的に書き込みます。

アプリケーションを終了して再度起動することでテストしました。約15秒後、クリックなどの操作を一切することなく、クライアントは自動的に接続されました。

1つ制限があります。FileVaultが有効になっている場合、再起動後に誰かがログイン画面でログインするまで、Macはログイン項目を起動できません。リモートのMacを再起動する場合は、 sudo fdesetup authrestartを使用してください。これによりMacが再起動され、1度だけ自動的にサインインが行われるため、ログイン項目が実行されます。

コンピューター間を移動する方法

MacをノートPCの右側に配置している場合は、次のように操作します:

  • ノートPCからMacへ移動するには、ポインタをノートPC画面の 右 端から画面外へ押し出します。
  • 戻るには、ポインタをMac画面の 左 端から画面外へ押し出します。
  • ポインタが切り替わらない場合は、Scroll Lockキーを押してください。DeskflowはデフォルトでScroll Lockを使用して、ポインタを現在操作中のコンピューターにロックします。もう一度押すとロックが解除されます。
  • 配置が合わない場合は、ノートPC側の「Configure Server」で変更できます。Macは左右どちらの側にも、あるいは上下にも配置できます。

直面した問題の一覧

画面に表示される事象 実際の原因・意味 解決策
Startボタンがグレーアウトし、「You must select a mode」と表示される サーバーまたはクライアントのオプションが選択されていない ウィンドウ内でサーバーオプションを選択する
unknown computer name (レイアウトファイル内) このバージョンでは、スクリーン定義はレイアウトファイルではなくメイン設定ファイルに保存されている 設定ファイルでスクリーンを定義するか、GUIウィンドウを使用する
起動時にサーバーがセグメンテーション違反(Segmentation fault)でクラッシュする バージョン1.27.0において、レイアウトが存在する場合のヘッドレスサーバーのバグ GUIウィンドウからサーバーを起動する
tls certificate doesn't exist クライアントに証明書が存在しない 作成: deskflow.pem 、使用コマンド: openssl
fingerprint does not match trusted fingerprint クライアントがまだサーバーを信頼していない サーバーのフィンガープリントを次に追加する: trusted-servers
failed to create quartz event tap macOSの「アクセシビリティ」権限が付与されていない Macの実画面で、「アクセシビリティ」にてDeskflowをオンにする
Connectボタンを押しても何も起きず、「Connect to」が空になる サーバーリストにスペースが含まれているか、アプリが値を破棄した スペースを含めずに再入力する
cannot connect socket (自宅ネットワーク上) macOSの「ローカルネットワーク」権限が付与されていない プロンプトで「許可」をクリックする
Timed out (自宅ネットワーク上。ただしTailscaleは動作) Linuxファイアウォールが自宅ネットワークからのポートをブロックしている 自宅ネットワーク専用に ufw ルールを追加する

時間を節約できるいくつかのクイックチェック

うまく動作しないときは、これらを上から順に実行してください。それぞれが1つの疑問に答えてくれます。

  1. サーバーは稼働しているか? ss -ltn | grep 24800 をサーバー上で確認します。何も出力されない場合はリッスンしていません。
  2. クライアントは稼働しているか? Mac上で deskflow-core client プロセスを探します。
  3. クライアントはサーバーに到達できるか? クライアントから nc -vz <server address> 24800 を実行してみてください。タイムアウトはネットワークまたはファイアウォールに原因があることを示しています。拒否(refusal)される場合は何もリッスンしていません。
  4. クライアントのログで証明書、フィンガープリント、または権限に関するエラーが出ていないか? それらのメッセージは非常に具体的であり、上記の一覧表で私が見かけたものを網羅しています。
  5. ポインタがロックされていないか? Scroll Lockキーを1回押して、もう一度試してみてください。

おわりに

Deskflowは一度起動してしまえば快適に動作しますが、そのセットアップの大部分はプログラム自体というよりも、権限と信頼の設定に関するものです。モードを選択し、レイアウトを描き、クライアントに証明書を付与し、双方でフィンガープリントを信頼し、Macの実画面でmacOSの権限を付与し、自宅ネットワーク専用にファイアウォールを開放し、アプリケーションをログイン項目に追加します。これらを順序どおりに行えば、LinuxノートPCとヘッドレスMacの間をカーソルがスムーズに行き来するようになります。私が費やした時間の多くは、一見すると接続問題に見えて実際には権限の問題だったエラーメッセージに起因していたため、ログメッセージを注意深く読み解くことが何よりも有益な教訓と言えます。

メリット

  • 無料でオープンソースであり、1組のキーボードとマウスで2台のコンピューターを操作できる。
  • TLSで暗号化されており、フィンガープリントによる検証によって第三者の不正参加を防げる。
  • クリップボードを共有できるため、マシン間でコピー&ペーストが可能。
  • 自宅ネットワークとTailscaleの双方で動作し、フォールバック用のアドレスも簡単に追加できる。
  • ログイン時にクライアントを自動起動できるため、ヘッドレスMacを手動操作する必要がない。
  • コンピューターのリソースをほとんど消費しない。

デメリット

  • いくつかの権限はリモートから付与できずMac実機で設定する必要があり、アカウントのパスワードも要求される。
  • Wayland環境のLinuxではグラフィカルな設定画面で権限プロンプトが必要であり、このバージョンではコマンドラインサーバーの動作が不安定だった。
  • もう一方のコンピューターの画面を表示することはできず、ドラッグ&ドロップによるファイル移動にも対応していない。
  • FileVaultが有効なMacでは、再起動後に誰かがログインするまでクライアントが起動しない。
  • 実際には権限の問題であるにもかかわらず、ネットワーク障害のように見えるエラーメッセージが出るため、原因特定には根気が必要。
  • 厳格なファイアウォールにはルールの追加が必要であり、設定を誤ると意図した以上の範囲を開放してしまう恐れがある。

注意事項

本記事は学習を目的としたものです。プレースホルダーとして記載されているアドレス、ホスト名、名前はすべてご自身の環境のものに置き換え、本物の証明書、秘密鍵、フィンガープリント、パスワードを決して共有しないでください。設定画面、プロンプト、ファイルの場所、コマンド名は、Deskflow、Linux、macOSのバージョンによって異なる場合があるため、手順を実行する前にご自身のシステムで確認してください。ファイアウォールのポートは信頼できるネットワークに対してのみ開放し、リモートアクセスプログラムには必要以上の権限を与えないようにしてください。重要な用途に適用する前に、本記事のすべての内容をご自身の環境で検証してください。

よくある質問

  • Deskflowはドラッグ&ドロップでファイルを共有できますか? — いいえ。共有できるのはポインタ、キーボード、クリップボードです。ファイルの場合は scpなどのコピーツール、共有フォルダ、または同期ツールを使用してください。
  • カーソルがもう一方のコンピューターに移動しないのはなぜですか? — よくある原因としては、モードが選択されていない、クライアントが接続されていない、macOSの権限が不足している、カーソルがロックされている、あるいはファイアウォールがポート24800をブロックしていることなどが挙げられます。サーバーおよびクライアントのログを確認すれば、どれが原因であるかが分かります。
  • クライアントでフィンガープリントが一致しないと表示されるのはなぜですか? — クライアントがまだサーバーを信頼するよう設定されていません。実際のフィンガープリントと照合した上で、サーバーのSHA-256フィンガープリントをtrusted-serversファイルに追加してください。
  • Macで「アクセシビリティ」権限は必要ですか? — はい、必要です。これがないと、macOSはDeskflowによるキーボードおよびマウスイベントの読み取りや挿入を阻止し、クライアントは接続直後に終了してしまいます。
  • SSH経由でmacOSの権限を付与することはできますか? — いいえ、できません。プライバシー設定はシステムによって保護されており、Macの実画面または画面共有経由でアカウントのパスワードを入力する必要があります。
  • DeskflowはTailscale経由で動作しますか? — はい、動作します。クライアントでサーバーのTailscaleアドレスを指定してください。両方のマシンが同じ場所にある場合は自宅ネットワークのアドレスの方が高速であるため、それをリストの最初に指定してください。
  • ファイアウォールでポート24800を開放しても安全ですか? — 自宅サブネットからの接続のみを許可するルールなど、自身のローカルネットワークに限定している場合に限られます。インターネット全体に向けて開放してはいけません。
  • MacからLinuxへ戻すにはどうすればよいですか? — もう一方のコンピューターと接している側の画面端からポインタを押し出します。切り替わらない場合は、カーソルを1台のマシンに固定または解除するScroll Lockキーを押してください。
  • 再起動後に自動的に起動しますか? — ログイン項目に追加しており、かつMacにログインしていれば自動起動します。FileVaultが有効な場合は、最初に誰かがログインするか、認証付き再起動(authenticated restart)を行う必要があります。
  • 接続は暗号化されていますか? — はい、TLSで暗号化されており、双方が信頼する前に相手のフィンガープリントを検証します。

タグ

#deskflow #linux #macos #homelab #tailscale #kvm #wayland #sysadmin #remoteaccess #opensource

Free field guide

Docker Security Checklist

Lock down your containers from build to runtime — 29 practical controls covering images, runtime flags, secrets, and the daemon. Enter your email — you'll get the PDF instantly, plus new posts on Docker, Linux & security.