Tailscale(VPN)で外部ネットワークから秘密鍵公開鍵なしでVSCode Remote SSH

[Tailscale](https://tailscale.com/)というVPNサービスを使って、秘密鍵・公開鍵なしで、VSCode Remote SSHする方法を備忘録がてら書きます。

# はじめに

プログラマなら誰しも、出先から自宅にある強強PCにアクセスしたくなった経験があると思います。
そこで、RealVNCやらChromeリモートデスクトップやらを使ってみて、外部から画面をいじれるけど、動きがカクカクしてイライラした経験はないでしょうか？

本記事では、新しいサービスである[Tailscale](https://tailscale.com/)というVPNサービスとVSCode Remote SSHすることでそのような問題に対処します。
（:warning:リモートデスクトップやVNCのように画面を乗っ取るのではなく、sshで計算環境のみにアクセスする方法について書きます。また、私はネットワークに疎いので、用語の使い方等がおかしいかもしれません。）

Tailscaleが100台まで無料で使えますので、個人利用の方は無料で使用可能だと思います。

**言葉の定義**
- ホストPC：sshで繋がれる（操作される）PC、強いPCを想定（受け）
- クライアントPC：VSCode Remote SSHを用いて接続を行うPC、ノートPCを想定（攻め）

# 既存研究

https://qiita.com/nlog2n2/items/1d1358f6913249f3e186

↑こちらは秘密鍵・公開鍵を使用した方法です。
提案手法の方が楽だと思います。

# 大まかな手順

1. クライアントPCのブラウザで[Tailscale](https://tailscale.com/)にアクセス
    1. アカウントを作成（email, Google, Microsoft, Github等の選択肢がある）
    1. Tailscaleをダウンロード
1. ホストPCでも1.と同様のことをする
1. クライアントPCからホストPCに接続
    1. クライアントPCのブラウザで開かれたTailscaleの確認
    1. .ssh/config の記述
    1. VSCodeの設定と接続


# 1. クライアントPCのブラウザで[Tailscale](https://tailscale.com/)にアクセス

## 1.1. アカウントを作成

Get Startedからアカウントを作成します。

メールアドレス、Google, Microsoft, Githubなどの選択肢があります。
多分どれでも良いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011247/fea2c81e-1c31-f262-0cf6-e4dca9fb6359.png)

## 1.2. Tailscaleをダウンロード

OSに合わせて、ダウンロードしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011247/06c63444-b910-3096-c469-eb412ca4e848.png)

↓のようになればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011247/43ca30b9-841d-919d-9730-e7cc21454039.png)
ホストPCに`100.x.y.z`のIPアドレスが発行されています。

# 2. ホストPCでも1.と同様のことをする

ここでは、Ubuntuにインストールします。

1.1と同じアカウントでログインすると、ホストPCのブラウザで開かれたTailscaleはこのようになっているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011247/26197f94-559f-f78c-6dbf-d6c15f1177b3.png)

コマンドをterminalで実行してください。
実行結果に
`sudo tailscale up`
を実行しろとあるなら、実行してください。

その結果、ホストPCのブラウザで開かれたTailscaleはこのようになっているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011247/4ddf05ad-c5ee-eadc-6ab4-95b6386341b9.png)

# 3. クライアントPCからホストPCに接続

## 3.1 クライアントPCのブラウザで開かれたTailscaleの確認

クライアントPCから[Tailscale](https://tailscale.com/)を開くと次のような画面になっているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011247/b164ebeb-f061-a2ba-eb84-000dc7b353cc.png)

## 3.2 .ssh/config の記述

.ssh/config （無ければ作成）に次の内容を記述する。
ここで、**.ssh/config はosごとに適切な場所に作成**してください。
- Mac, Linux: ~/.ssh/config
- Win: Users/{ユーザー名}/.ssh/config
- etc

```
Host {ホストPCの名前を好きに書く。例)HostPC}
  HostName {ホストPCのIPアドレス(100.x.y.z)；上の画像からコピペすれば良い}
  User {ホストPCで使用するユーザー名（パソコン起動した時に選択するユーザー）}
```
{}内は適切に記述する。記述例↓
```
Host StrongHostPC
  HostName 100.12.345.67
  User OneOfUser
```

## 3.3 VSCodeの設定と接続

### 3.3.1 VSCodeにRemote - SSHの拡張機能をインストール

VSCodeの拡張機能で`Remote - SSH`を検索してインストールする。

### 3.3.2 接続

左の窓に`リモートエクスプローラー`が生えているはず。
そこを開いて、ホストPCの名前をクリックする。
ホストPCでのユーザーのパスワードを入力する。

:warning:ホストPCがMacである場合に、sshできない可能性があります。
このときは、[リモートコンピュータにMacへのアクセスを許可する](https://support.apple.com/ja-jp/guide/mac-help/mchlp1066/mac)の`Macでリモートログインを設定する`を参考に、外部からMacにアクセスできるように設定してください。

これで、VSCodeだけは、ホストPC（強いPC）になったかのように使用できます。

# 注意点

深層学習の訓練等の時間がかかる計算を行うときは、`nohup`コマンドを使用してください。
なぜならば、sshの接続が切れる（電波が無くなる）と計算が終了してしまうからです。
`nohup`コマンドを使用すれば、そのようなことが起こらないので、安心して使用することができます。