tailscaleの使い方
概要
- hamachiのようなp2p VPN
- 一部GUIがシェアウェアである点もhamachiと似ている
- wireguardをバックエンドに使用しており、認証関連を管理してくれるもの
- wireguardは多少設定が面倒であるが、tailscaleを用いるとGoogle AccountやMicrosoft Accountでログインするだけで利用できる
- UDP NAT traversalをサポートしており、NATの内側のコンピュータでもVPNネットワークに参加できる
- 一定のコンピュータ数(20)までは無料なので、個人で利用するには十分そう
- ある程度のオーバーヘッドがあり、速度が半分程度になる
- コントロールプレーンという管理サーバが必要で、無料プランではここが制約となる
- 半年に一度認証が解除されるため、いざというときに使えないのが痛い
仕組みと用語の整理
- 認証・鍵管理
- デフォルトでは一定期間でキーが期限切れになるため、無効化するにはWeb UIから
disable key expiry
を選択する
- デフォルトでは一定期間でキーが期限切れになるため、無効化するにはWeb UIから
- デバイス/アドレス管理
- 登録しているコンピュータのIPアドレスはMachinesから確認できる
- directモードとrelayモード
- relayモードとdirectモードがあり、directモードはとても速いが
41641/udp
の開放が必要になる - 手動でポートを変更したい場合は
/etc/default/tailscaled
を編集すれば良い - 同じサブネットに複数のtailscaleのノードがあったとしてもポートを自動調整するので原則として変更する必要はない
- directモードを確立できない場合、世界中に配置されたDERPと呼ばれる公開サーバをリレーとしてフォールバックする
-
tailscale status
で接続状況を確認できる(relay "tok"
であれば東京のリレーサーバ経由)
-
- relayモードとdirectモードがあり、directモードはとても速いが
- exit node
- exit nodeを指定・利用することができる
- VPNをトンネリングで利用しているイメージですべてのトラフィックをexit node経由で行うことができる
- exit node利用時に任意のnameserverを指定することができる
-
Admin Console
->DNS
->nameservers
にDNSを設定 +Override local DNS
を有効にする
-
- 仮想インターフェイス
- Linux:
tailscale0
- macOS:
utunX
- Linux:
- セルフホストのコントロールプレーン
- headscaleというコントロールプレーンをセルフホストにするOSSもある
ユースケース
- ファイアウォールの内部に構築したセキュアな環境にアクセスする
- ssh
- グローバルIPの設定がいらない
- jupyter
- 踏み台の設定がいらないので楽
- ssh
セットアップ(インストール)
linux
$ curl -fsSL https://tailscale.com/install.sh | sh
$ sudo tailscale up
macOS
-
App Store
からtailscale
を検索してインストール - App Store版ではCLIは含まれない
macOSでビルドしてインストール/アップデート
$ go install tailscale.com/cmd/tailscale{,d}@main
$ sudo $HOME/.go/bin/tailscaled install-system-daemon # launchdに登録
よく使うコマンド
- 接続デバイス一覧と接続形式の確認
$ tailscale status
- 接続可能なデバイスの一覧を表示できる
- メニューバーやタスクトレイから確認するより早い
- 通信方式の確認
-
relay <tok>
のような表示のときrelayサーバ経由でのアクセス -
direct 211.15.239.222:15968
のような表示のときdirectアクセス
-
- ネゴシエーション込みのping(direct誘導にも有効)
$ tailscale ping 100.108.132.113
pong from kichijouji (100.108.132.113) via DERP(tok) in 39ms
pong from kichijouji (100.108.132.113) via 211.15.239.222:41641 in 38ms
exit nodeの設定/利用
- tailscaleのルーティングするデバイスを指定してexit nodeにすることができる
- exit nodeはルーターのようなイメージ
linuxをexit nodeとして設定
$ 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
$ sudo tailscale up --advertise-exit-node
macOSでexit nodeを利用する
- tailscaleのアイコンをクリック
-
Exit Node
を選択
linuxでexit nodeを利用する
$ sudo tailscale up --exit-node=<exit-node-ip>
ベンチマーク
- relayサーバ経由だと、パフォーマンスが約54%に低下する
直接接続した場合
$ netperf -H gimpeik.duckdns.org -t TCP_STREAM -v 2 -- -o mean_latency,throughput
MIGRATED TCP STREAM TEST from (null) (0.0.0.0) port 0 AF_INET to gimpeik.duckdns.org () port 0 AF_INET
Mean Latency Microseconds,Throughput
17474.43,58.68
tailscaleのVPNを経由した場合
$ netperf -H 100.123.207.30 -t TCP_STREAM -v 2 -- -o mean_latency,throughput
MIGRATED TCP STREAM TEST from (null) (0.0.0.0) port 0 AF_INET to (null) () port 0 AF_INET
Mean Latency Microseconds,Throughput
33108.25,31.51
wireguardとrelayサーバ経由のtailscaleの速度の違い
- 2〜3倍程度の速度差がある
wireguard
$ netperf -H 10.87.131.4 -t TCP_STREAM -- -o mean_latency,throughput
MIGRATED TCP STREAM TEST from (null) (0.0.0.0) port 0 AF_INET to (null) () port 0 AF_INET
Mean Latency Microseconds,Throughput
10961.86,94.87
relayサーバ経由のtailscale
$ netperf -H 100.82.111.109 -t TCP_STREAM -- -o mean_latency,throughput
MIGRATED TCP STREAM TEST from (null) (0.0.0.0) port 0 AF_INET to (null) () port 0 AF_INET
Mean Latency Microseconds,Throughput
27856.18,37.48
セルフホスト(headscale)
- 概要
- tailscale互換のFOSS
- tailscaleのコントロールプレーンのみをself-hostにすることで完全に無料にしている
- インストールのハードルが高い
- Dockerで管理するのがよい
トラブルシューティング
- direct connectionが利用できない
- 原因
- 接続クライアント側(ノートパソコン等)で公衆無線LANなどを利用していると、ルーターの制限のためか、directモードが確立できないことがあった
- 原因