tailscaleでVPNを作ってみたら爆速だった件

<!-- tailscaleでVPNを作ってみたら爆速だった件 -->

## はじめに

自宅サーバーでDiscord Botを動かすようになったあと、たまにBotがエラーを起こしたり、落ちたり、内部仕様を変更したりする必要があった。

障害発生時に家にいたらそこで直すのだが、外出中に障害が発生したら、家に帰るまでどうにもできない、という課題があった。

そのため、外部のネットワークからサーバにアクセスし、遠隔保守を可能とする必要があったので、VPNを構築することにした。

ただ、VPNを構築したことはなく、またやり方もよく分かっていなかったため、とりあえず簡単にVPNを構築できると聞いたことのあったtailscaleを使ってみることにした。

https://github.com/tailscale/tailscale

## Tailscaleのインストール

とりあえず、tailscaleの公式ページからアカウントを作成する。

https://tailscale.com/

画面右上の``Get started``をクリックし、アカウントを作成する。作成するというっても、GitHubと連携ができるので、GitHubアカウントを持っている人はそれでログインすると楽だろう。

アカウントが作成出来たら、「デバイスを登録しましょう！」みたいな案内が来る。さまざまなOSが出て来るので、使っているOSに合わせてインストールする。

### Windowsの場合

Windowsを選択し、``Download for Windows``をクリックすると、ダウンロードページに飛ぶ。今一度``Download Tailscale for Windows``をクリックすると、インストーラがダウンロードされる。

あとはインストーラを管理者権限で実行し、インストールするだけである。確認事項とかは規約への同意くらいしかなかった。

ダウンロードが終わると、以下のようタスクバーからtailscaleを起動できるようになる(画像は起動後、左上の9つの点があるやつ)。

![tail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468660/21e8d349-d334-dc30-b741-8ffb7901466e.png)

これをクリックすると、ログインが求められる。先ほどと同様にログインすると、自動的にVPN接続される。

### iPhoneやAndroidの場合

アプリストアから``Tailscale``を検索し、インストールする。インストール後、アプリを起動し、ログインするとVPN接続される。

### Linuxの場合

コマンドラインから行う。UbuntuとかRaspberry Pi OSなどでも同様である。

1. キーの登録
    ```bash
    curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
    curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list
    ```
2. インストール
    ```bash
    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install tailscale
    ```
3. 起動
    ```bash
    sudo tailscale up
    ```

ここまでやると、コマンドラインにURLが表示される。そのURLをブラウザに入力するなどして開くと、ログイン画面が表示されるので、今までと同様にログインするとサーバがVPN接続される。

## 接続の管理

[このページ](https://login.tailscale.com/admin/machines)にアクセスすると、VPN接続されている機器一覧を見ることができる。

表形式になっていて、各行に接続機器が表示される。各列の意味はそれぞれ以下の通りである。

- ``MACHINE``：接続機器の名前と登録した人のアカウント名
- ``ADDRESSES``：接続機器のIPアドレス(100.xxx.xxx.xxxの形式)
- ``VERSION``：バージョンとOSの種類
- ``LAST SEEN``：最後に接続された日時(接続中は``connected``と表示される)
- ``・・・``：その他の情報や設定など

デフォルトでは、``ADDRESSES``には、tailscaleで割り当てられたIPアドレスが表示されているが、折りたたみを開くと、以下の情報が表示され、クリップボードにコピーできる。

- 機器名(``MACHINE``に表示されているものと同じ)
- ドメイン名(yyy.xxxxxx.ts.netの形式、yyyには機器名が入る)
- IPアドレス(IPv6)
- IPアドレス(IPv4)

表にはフィルターをかけることもできる。

他にも、[DNSタブ](https://login.tailscale.com/admin/dns)からは用いるドメイン名を変更できる。``Rename tailnet...``をクリックすると、ドメイン名を変更できる(詳細は[ここ](https://tailscale.com/kb/1217/tailnet-name))。

他にも様々な設定があるらしい。

## 使ってみる

### pingする

``Machines``から接続を確認したいサーバを探し、IPアドレスかドメイン名をコピーする。同じVPNにある限りは名前解決もやってくれるらしいので、どちらでもよい。

その後、以下のようなコマンドを実行すると、pingが通ることが確認できる。

```bash
ping xxxxxx.ts.net
ping 100.xxx.xxx.xxx
```

### Webサーバを見てみる

サーバ側で``apache``や``nginx``などのWebサーバを立てている場合、ブラウザでアクセスすることができる。

クライアント側でブラウザを開き、以下のようなURLを入力すると、サーバのWebページが表示される。

``http://xxxxxx.ts.net``, ``http://100.xxx.xxx.xxx``

スマホなどでやってみるとしっかり接続できていることがわかりやすいかもしれない。

### sshする

特に難しいことはなく、``config``ファイルに以下のようなことを記載し、``.ssh``ディレクトリで鍵のペアを``ssh-keygen``コマンドで作成してから、サーバ側でユーザのホームディレクトリにある``.ssh/authorized_keys``に公開鍵を登録すれば、``ssh``でログインできるようになる。これができてしまえば、あとはサーバをいつもの感覚で操作するだけなので、遠隔保守が可能になる。

```config
Host myserver
    HostName xxxxxx.ts.net
    User myuser
    Port 22
    IdentityFile ~/.ssh/id_rsa
```

鍵の名前は適当に変更する。``Hostname``にはtailscaleで割り当てられたIPアドレスかドメイン名を指定することとなる(上の例ではドメイン名)。

## 所感

とにかく簡単かつ爆速でVPNを構築することができて、非常に便利だと感じた。特に危険性などもなく、無料で使えるので、まずVPNを立ててみたいという人にとっては良い選択肢だろう。サーバを介さずPeer to Peerで通信しているらしいので(どうやってるのか気になる)、高速性もある。

ただ、ネットワークのことを何も意識せずとも使えてしまうので(独自ドメインを取る必要すらない)、VPNの勉強にはならないかもしれない。VPNを一から組みたい人には、OpenVPNなどを使うとよいかもしれない(自分も今度やってみる)。

[OpenVPNのインストールとセットアップからインターネット接続までのガイドブック #Ubuntu - Qiita](https://qiita.com/noraworld/items/2fe6be489e1d93c748b8)

## 参考文献

[Tailscaleで無料で簡単、VPNを構築するぞ](https://zenn.dev/0_0/articles/16975274aa3ba7)

[Tailscaleのインストール #tailscale - Qiita](https://qiita.com/broccoli07/items/cbc730eb06beb89ae1fb)