かんたん3分 拠点間VPN


1行で要約：**Tailscale の Subnet routers機能を活用した、拠点間VPNの構築です。**

## Let's do it!
まずはセットアップの様子をご覧ください。
2分46秒で、別ノードのネットワーク上のデバイスへのアクセスに成功しています。
<iframe width="640" height="360" src="https://www.youtube.com/embed/QTE-AcAqO9Q" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" loading="lazy" allowfullscreen></iframe>

( 最初に動画を持ってきた理由は ~~『かんたん3分』とタイトル詐欺のようなタイトルをつけてしまったからには、証明するしかない！」という自己満足~~ セットアップの様子をなんとなく知っていただくためです。)

## 構築方法の解説
動画で行っていた操作について、順を追って説明します。
「動画では操作が速すぎてついていけなかった」という方も、ゆっくりとお読みください ☕️

今回は以下のような環境で構築します。

:::note info
説明の都合上、動画では片方のネットワーク(Network A)のみを共有しています。
逆方向も設定は同じです。
:::

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806870/55be7f1b-8001-44df-00d4-ff69ee0a0bf1.png">


### 0. Tailscaleとは
Tailscaleは、WireGuardプロトコルを使用したP2PのVPNサービスです。
簡単な操作で、複数のデバイス間でメッシュネットワークを構築することが出来ます。

下に挙げるように様々な機能がありますが、今回はSubnet routers機能を使用します。
<details><summary>特徴や機能 (クリックして展開)</summary>

- 基本
  - 動作が非常に軽量 (WireGuardプロトコル)
  - メッシュネットワーク
  - NAT越え (NATトラバーサル + DERP)
  - マシン名の名前解決 (Magic DNS)
- 機能
  - クライアントが接続しているサブネットへのアクセス (Subnet routers)
  - SSH接続の認証と承認の管理 (Tailscale SSH)
    - SSHセッションの記録 (Tailscale SSH session recording)
  - デバイス間でのファイルの共有 (Taildrop)
  - トラフィックのルーティング
    - デバイスで実行されているサービスへのアクセス (https対応)
      - Tailscaleネットワーク内からのアクセス (Tailscale Serve)
      - インターネットからのアクセス (Tailscale Funnel)
    - 全トラフィックの転送 (Exit nodes)
      - 任意のデバイスへの転送
      - VPNサービス(Mullvad)への転送
- アクセス管理
  - Dashboardでの視覚的な管理
  - ACLによる詳細な管理
  - 特定デバイスへのアクセスの共有 (Share node)
- And more!

</details>

https://tailscale.com/kb/1169/features/


### 1. Tailscaleアカウントの作成 (Web)
はじめに、Tailscaleのホームページにアクセスしてアカウントを作成します。

#### アカウントの作成

https://login.tailscale.com/start

Tailscaleではメールアドレスとパスワードの代わりに、Google, Microsoft, GitHub, Apple, Okta, OneLoginのいずれか、又は任意のOIDCプロバイダーをIdPとして使用します。

GitHub Organizationを連携する場合、TailscaleのメンバーはOrgのメンバーと同期されます。

<img width="360" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806870/d2ba33ab-71d4-90be-abd0-34c052c03f24.png">

#### プラン
プランを指定せずアカウントを作成すると、自動的にFreeプランとなります(2023/12/02時点)。
Freeプランは3名のユーザー、100台のデバイスという制限でほぼ全ての機能を使用可能です。
https://tailscale.com/pricing/

#### 認証キーの作成
アカウント作成後、サーバーをTailscaleネットワークに接続するための認証キーを作成します。

認証はTailscaleネットワークへの接続時にブラウザで行うことも出来ますが、端末がサーバーの場合はターミナル内で操作が完結する認証キーが便利です。

<img width="240" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806870/5a06a00d-1262-34c7-14c2-aa48aff96be9.png">

<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2806870/1bef25b7-bcbd-780a-9384-082ea0586cdd.png">


### 2. Tailscaleのインストール (Server)
アカウントの準備が完了したら、端末にTailscaleをインストールします。

#### 概要
Tailscaleでは、Linux/Mac/Windows/iOS/Androidがサポートされています。
Subnet routers機能によるネットワークの共有は、Linux/Mac/Windowsでサポートされています。

https://tailscale.com/download/

#### インストール
Linuxの場合、以下のコマンド一つでインストールが完了します。
rootまたはsudo権限のあるアカウントで実行してください。

```bash:root
root@machine:~# curl -fsSL https://tailscale.com/install.sh | sh
```

Mac/Windowsをお使いの場合、ダウンロードページの指示に従ってインストールを行ってください。


### 4. Tailscaleネットワークへの接続 (Server)
インストールが完了したら、Tailscaleネットワークへの接続を行います。
今回はLinuxでの接続方法を説明します。

#### Tailscaleネットワークへの接続
以下のコマンドでTailscaleネットワークへの接続が可能です。

- tailscale up：Tailscaleネットワークへの接続を行うコマンドです
  - --accept-routes：他のデバイスが共有しているサブネットを受け入れます。
    - 動画では片方のネットワークのみを共有しており、このオプションは共有先のデバイスでのみ指定しています
  - --advertise-routes：サブネットルーターとして動作します。``＝``に続けてサブネット(IPv4/IPv6)を指定します。
    - 動画では片方のネットワークのみを共有しており、このオプションは共有元のデバイスでのみ指定しています
  - --authkey：Tailscaleネットワークに接続する際の認証に用います。上で取得した認証キーを指定してください。
```bash:root
root@machine:~# tailscale up --accept-routes --advertise-routes=192.168.0.0/17 --authkey tskey-abcdef1432341818
```

#### FWの設定
FWが構成されている場合、Tailscaleネットワークからのパケットを許可します。
```bash:root
#UFWの場合
root@machine:~# ufw allow in on tailscale0
```

#### ルーティングの設定
サブネットを共有するデバイスでは、トラフィックのルーティングのための設定が必要です。
以下のいずれか(適切な方)を順に実行してください。
```bash:root
#If your Linux system has a /etc/sysctl.d directory
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf

#Otherwise
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf
```

### 5. Tailscale Dashboardでの設定 (Web)
最後に、設定したサブネットの使用を許可する必要があります。

1. Dashboardの ``Machines`` タブを開く
2. 追加した端末の右側にある「・・・」から、``Edit route settings…`` を選択
3. ``Subnet routes`` で、上で設定したサブネットが表示されていることを確認、トグルをオンに。


### 6. 接続確認 (Server)
設定が完了したら、接続を確認してみてください。
今回の場合、512f(Network B)から、512e(Network A)に接続しています。
LAN内で接続する場合と同じipアドレスを使用して接続できます。

:::note info
Subnet routers機能では、サブネット内へのリクエストはサブネットを共有しているデバイスから送信されます。
これにより、サブネット内へのリクエストは、送信先のデバイスからは(送信元のデバイスに関わらず)サブネットを共有しているデバイスから送信されたものとして扱われます。
:::


## 最後に
Tailscaleでは、専用のハードウェアなどを使用することなく手軽に拠点間VPNの構築が可能です。

私は普段、自宅環境/パブリッククラウド/手持ちのデバイスを接続し、(拠点間VPNに加え)以下のような機能を活用して、趣味の開発を行っています。

- 外部一般に公開するポートをゼロにする (Tailscale経由のパケットのみを許可する)
- 資格情報無しでのSSH (Tailscale SSH)
- 開発環境内に限定したサービス公開 (https対応, Tailscale Serve)
- 外向きトラフィックのIPの固定 (トラフィックを特定のデバイスに転送, Exit nodes)

Tailscaleに興味を抱かれた方は、是非一度Tailscaleに触れてみてください。
~~一度慣れると戻れなくなります。~~


**P.S.**
今回、Qiita初記事 && アドベントカレンダー初参加となります。
コメント・ご意見・批判等、お手柔らかにお願いいたします<(_ _)>