どこでもMy Macに代わりほぼ無料でリモートデスクトップ接続「ここ掘れMy Mac」

# どこでもMy Mac完全終了

macOS Mojaveで廃止された標準リモートデスクトップ機能`どこでもMy Mac`(Back To My Mac)が、7月1日で旧バージョンのmacOSも含め完全に終了するようです。

[さらば無料の公式リモート。｢どこでもMyMac｣が全macOSから削除予定 | ギズモード・ジャパン](https://www.gizmodo.jp/2019/06/good-bye-may-mac.html)

**「有料の公式アプリへの移行を推奨」**とのことですが、なかなかいい値段します(9,800円)。

ぶっちゃけ自分もまわりもどこでもMy Macを使ってる人を見たことなかったんですが、標準の画面共有機能を利用してほぼ無料で似たようなことやってみようと思い立ちました。

# macOSの画面共有=VNC

macOSの画面共有機能は、実はいにしえの[VNC](https://ja.wikipedia.org/wiki/Virtual_Network_Computing)が使われています。
Windows独自の`RDP`もよくできていますが、同じくらい快適だったのでしばらく独自プロトコルだと思っていました。

なので上手くトンネルさえ掘ればどこからでもリモートデスクトップ接続できるはずです。

# トンネルでリモートデスクトップ「ここ掘れMy Mac」

それで`ここ掘れMy Mac`(Tunnel To My Mac)。もうその名の通り、ローカルとリモートからそれぞれSSHでトンネル掘ってVNCするだけです。

![貼り付けた画像_2019_06_06_13_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/14170353-921c-83f7-39f8-f819d715695c.png)

この例では、リモート接続されるサーバーは、自身の`5900`ポート(VNC待ち受けポート)を中継するSSHサーバー上の`59001`ポートに転送します。次にリモート接続するクライアントは、その中継するSSHサーバー上の`59001`ポートを自身の`59001`ポートとして転送します。

操作するクライアント上で`localhost:59001`に接続すると、操作されるサーバーの`5900`ポートにつながるわけです。

# 必要なもの

* インターネットに接続された、SSHでログインできるサーバー(1台くらいありますよね!?)

# 操作されるサーバー側の準備

## 下準備

1. 操作されるサーバーで画面共有サービスを有効にする(システム環境設定→共有→画面共有にチェック)。
2. SSHサーバーへ秘密鍵でSSHログインできるようにする。
3. 操作されるサーバーに`autossh`をインストールする。

SSHでログインはいつもの`ssh-keygen -t rsa -b 4096`などで`id_rsa.pub`を生成し、SSHサーバーの`authorized_keys`に追加する操作です。

`autossh`は接続が切れたときに再接続してくれるSSHクライアントです。
`brew install autossh`でインストールしてもいいですし、他のMacから`/usr/local/bin/`などにバイナリをコピーしても大丈夫です。その場合、`chmod a+x /usr/local/bin/autossh`で実行可能にすることをお忘れなく。

## 起動時にautosshで自動ログイン

操作されるサーバーは、起動したときに自動で永続的なSSHトンネルを掘るように設定します。

コマンドとしてはこんな感じです。

```bash
autossh -M 0 -N -C -R 59001:localhost:5900 -i "id_rsaのパス" -o StrictHostKeyChecking=no ユーザー名@SSHサーバー
```

これをLaunchdに登録します。`/Library/LaunchDaemons/tunnel-to-my-mac.plist`として次のファイルを作成してください。`root`権限が必要です。

```XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>tunnel-to-my-mac</string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/autossh</string>
        <string>-M</string>
        <string>0</string>
        <string>-N</string>
        <string>-C</string>
        <string>-R</string>
        <string>59001:localhost:5900</string>
        <string>-i</string>
        <string>秘密鍵id_rsaのパス(例 /Users/me/.ssh/id_rsa)</string>
        <string>-o</string>
        <string>StrictHostKeyChecking=no</string>
        <string>USER@SSHサーバー</string>
    </array>
  </dict>
</plist>
```

次のコマンドを実行します。これは手元の環境では`root`でなくても動作しました。

```bash
launchctl unload /Library/LaunchDaemons/tunnel-to-my-mac.plist
launchctl load /Library/LaunchDaemons/tunnel-to-my-mac.plist
launchctl start tunnel-to-my-mac
```

**MacではなくSSHサーバー上で**次のコマンドを実行して、以下のように`59001`での待ち受けがあれば準備完了です。

```bash
tcp        0      0 127.0.0.1:59001         0.0.0.0:*               LISTEN     
tcp6       0      0 ::1:59001               :::*                    LISTEN     
```

## 操作するクライアント側の準備

## 下準備

1. SSHサーバーへ秘密鍵でSSHログインできるようにする。
2. 操作するクライアントに`autossh`をインストールする。

## クライアントからのトンネルを掘る

次のコマンドを実行します。

```bash
autossh -M 0 -N -C -L 59001:localhost:59001 -i "id_rsaのパス" -o ユーザー名@SSHサーバー
```

これでSSHサーバーを介して、クライアントの`59001`がVNCサーバーの`5900`にトンネル接続されました。

## VNCクライアントで操作する

Macの画面共有アプリを起動します。画面共有アプリは、`/System/Library/CoreServices/Applications`にあります。
汎用的なVNCクライアントとしても安定しているので個人的にも重宝してます。

![Applications-(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/22f80351-d4f8-f5ec-390b-0a5dbb9b79d2.png)

ダイアログに`localhost:59001`と入力して無事に接続されると、サインインのダイアログが表示されます。以上で完了です！

![signin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/21fb7385-9f8f-3111-3a35-dfa18034060b.png)


# アレンジ

## 複数のVNCサーバーを登録する

今回は`59001`を使いましたが、`59002`、`59003`…と別々のポートを使えば複数のVNCサーバーにリモート接続できます。

## openコマンドで画面共有を開く

macosの`open`コマンドは`vnc://`プロトコルに対応しているので、次のコマンドでも画面共有アプリを開くことができます。
`autossh`での接続と`open`コマンドを組みあわせたシェルスクリプトを作ってもいいかもしれません。

```bash
open vnc://localhost:59001
```

## クライアント側から常時接続

頻繁に接続するのであれば、クライアント側でも`LaunchDaemons`ディレクトリに`plist`ファイルを作成して常時トンネル接続するのもよいでしょう。

## macos以外にも

汎用的なVNC接続なので、LinuxやWindowsにもきっと応用できます。

# 最後に

訳あって最近はTeamViewer BUSINESSを使ってきたのですが、なかなか高いので自前のリモートデスクトップネットワークを作ってみようと思いました。どちらかというとその動機が強かったです。

以前、この記事で用意したConoHaの630円VPNサーバーを利用しました。

高速VPNを最速3分でスタート ConoHaで月額630円
https://qiita.com/miyanaga/items/590b25596d8a716e7e68

630円で、自分専用VPNとリモートデスクトップネットワークが手に入るならお得ですね！