tailscaleで自宅やどこかとセキュアにつなぐ (tailscale, securely connect to home or third places)


## VPNの悩ましさ

外部からのアクセス、認証用にサーバやネットワーク機器を用いて行い、プライベートネットワークへの接続を必要とするケースは様々なところで利用してきましたが、
そのための踏み台/proxyサーバやユーザ用VPN機器を中継する形をとると、以下でボトルネックとなる場合がある

- 作業ユーザー増、サーバやIoT機器等では接続台数、セッション/コネクション数が多くなり、さばききれなくなる
- トラフィック増に対して、集約箇所のサーバやNWとその帯域などに変更をするため対処がしずらい

接続台数が増えると接続が重くなり、複数に増やすとIDや鍵の情報管理が煩雑になり、また、プライベートIPを使う企業などの制限されたネットワーク環境下で必ずしも使えるわけでもないので、対処に困るというということがありました。

## wireguard, tailscale

wireguardは比較的新しい実装であり、UDPを用いてのポイント・ツー・ポイント接続を実現しているアプリケーション・プロトコルである。tailscaleはwireguardをベースとし導入や接続を管理するサービスを提供している

- wireguard - [ポイント・ツー・ポイント接続でのVPNのアプリケーションとプロトコル](https://ja.wikipedia.org/wiki/WireGuard)
  - 参考
      - [インターネットVPNの選択肢に WireGuardはいかがですか︖](https://www.janog.gr.jp/meeting/janog46/wp-content/uploads/2020/06/janog46-wireguard-tanioka.pdf)
      - [WireGuardでVPNサーバーを構築する](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0614)

- [tailscale](https://tailscale.com/)

## tailscaleの何が嬉しいの？

- クライアント同士が直接接続するメッシュ型のNWが使え、中継によるボトルネックがない
- 制限されたNW環境でも利用が可能
- 中継/クライアントNW情報の管理が不要となる

## tailscaleの仕組み

- https://tailscale.com/blog/how-tailscale-works/#encrypted-tcp-relays-derp

- 主な要素
  - メッシュネットワーク
  - key exchange and coordination : wireguardの鍵管理と認証サーバの機能
  - DERP(Designated Encrypted Relay for Packets) : STUN,TURNサーバ相当の役割でhttps通信での実装を利用しNAT環境化でのクライアント情報の受け渡し&リレー処理

## 試してみる

自宅と別の場所にサーバを設置しており、mac,andoridクライアントを利用しているため、接続してみました。

- セットアップ
  - linux,mac,pc,android等は標準でクライアント[app](https://tailscale.com/download)があり、インストールと起動だけで可能、接続先情報のやり取りは不要
  - 100.x.x.xのIPが自動で割当され、クライアント間の通信が可能
 
- 接続テスト
  それぞれで別のNAT配下のクライアント同士にて接続先の情報を確認、確認にiftop利用、sshや後述のTailscale CLIを実行
  - クライアントは以下への接続
    - 1.複数のDERPへの接続
    - 2.接続先のネットワーク機器(NAT)のグローバルIPへの接続

  ```
(一部省略)
 *                                                     => XXXXXXXXXXXXXX.ppp-bb.dion.ne.jp                       277Mb   268Mb   202Mb
                                                       <=                                                        5.46Mb  5.44Mb  4.14Mb
 *                                                     => derp7-tok.tailscale.com                                 208b     42b     94b
                                                       <=                                                         208b     42b     59b
 *                                                     => derp6-blr.tailscale.com                                   0b      0b     14b
                                                       <=                                                           0b      0b     12b
 *                                                     => derp3-sin.tailscale.com                                   0b      0b     14b
  ```

  - ssh実施時のでのサーバー間の通信トラフィックは2.のトラフィックのみが増加、接続先ローカルネットワークの最大速度と同程度までの速度が出る
  - 参考で確認したCPU使用率はローカル通信より微増程度で負荷は高くない
  - 

- 操作関連
  - 管理画面
    - ![screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286841/eca37ad3-2c30-6497-ded1-5e70bf68c6d2.png)

  - [Tailscale CLI](https://tailscale.com/kb/1080/cli/)
    - 起動停止以外に、一覧の確認(status)、ping,機能等のコントロールwebサーバ(web),ファイル転送(file)
      - 例、linuxから接続先にファイル送信する場合
      
      ```
      tailscale file cp 1gb.tmp clinethostname:
      ```

  - アプリでのファイル転送に関しては[Taildrop](https://tailscale.com/kb/1106/taildrop/)が用意されている


## 所感

個人で扱うには簡単であり、台数が増えても用意に使えるものである、よくできている

- 実際にファイル転送までの事前準備が手軽、wireguardに必要な設定はなしでシンプルにできている、
- ファイル転送によるネットワークの処理が重たくなることもなく高速で、パフォーマンスは実用的
- 管理画面の機能は現状少ないが、alphaなどの機能や他のサービスと組み合わせて使っていく必要がある(認証,DNS,vpcネットワークをまたぐ際の中継,e.t.c.)

かなり有用であるが、企業で扱うにはアルファ提供しているような機能拡張、耐障害性やアップデート等の追加が必要であり、また、頻繁に更新されているところから、セキュリティ周りの検証が必要で、今後別途確認してみたい

## その他

- きっかけ
  - [100台まで無料のVPNサービス「tailscale」、リンクだけでマシンのシェアも可能!?](https://internet.watch.impress.co.jp/docs/column/shimizu/1303751.html)
    - wireguardやその対応製品等は以前から知ってましたが、悩ましく発展途上だったのでなんとなく保留してました
- クライアントの自動アップデートや接続先に任意の処理をフックさせるなど他サービスとの組み合わせを作るのは、どこかで試したいですね