TailScale をもっと早く使っていればよかった...
最近 Tailscale を使い始めました。そしてどうしてもっと早く使わなかったんだろうと後悔しました。
Tailscale の名前だけは以前から知っていましたが、よくある VPN サービス、くらいの認識でした。しかし実際に使ってみると想像以上に便利で、特にITエンジニアが業務で直面するネットワーク周りの課題をあっさり解決してくれる機能が多く存在します.
本記事では、「Tailscale って VPN 的なやつ?」くらいの認識だった自分が Tailscale を手放せなくなった理由を説明します。
インターネットアクセスがあればどんなデバイスでも接続できる
Tailscale はインストールがとても簡単です。例えば Linux サーバーの場合、インターネットアクセスがある状態で以下のコマンドを実行するだけで Tailscale のインストールと Tailscale ネットワークへの参加が完了します。(実行するには auth-key
を発行する必要があります)
curl -fsSL https://tailscale.com/install.sh | sh && sudo tailscale up --auth-key=tskey-auth-xxxxxxxxx
適当な VPS を起動して Tailscale をセットアップしてみました。Tailscale の Admin Console に VPS が追加されているのを確認できます。 ubuntu-vps
という名前のマシンとして登録されています。この名前は自由に変更できます。
これで Tailscale がインストールされている他のデバイスからubuntu-vps
という名前で通信できるようになります。例えば、次のように SSH で接続できます。
ssh root@ubuntu-vps
もちろんマシンのプライベートIPアドレスを使っても同じようにアクセスできます。
ssh root@100.67.183.87
マシンの名前をそのままホスト名として利用できるのは、 Tailscale の MagicDNS という機能のおかげです。デバイスが Tailscale のネットワークに参加すると、マシン名を元にしたDNS名が自動的に付与されます。
> dig ubuntu-vps
...
;; ANSWER SECTION:
ubuntu-vps. 366304 IN CNAME ubuntu-vps.tailxxxxxx.ts.net.
ubuntu-vps.tailxxxxxx.ts.net. 366304 IN A 100.67.183.87
...
サーバーが Tailscale ネットワークに参加したあとは、Tailscale のネットワークを通してサーバーと通信できるようになります。つまり VPS の ファイアウォール設定ですべてのインバウンド通信を閉じても通信できる、ということです。( Tailscale を使っていないクライアントがいる場合はもちろん別です)
SSH ポートを開放する不安がなくなるのがとても嬉しいです。さらに次の機能では、SSHキーの管理が大幅に減ります。
SSH接続が簡単になる Tailscale SSH
Tailscale SSH は、SSH の使用感を変えずに、認証方法や暗号化を Tailscale に任せることができる機能です。SSHキーの管理が大幅に減り、サーバーへのアクセス用のキーペアを生成したり、アクセスを許可したい人の公開鍵を authorized_keys
に登録したり、みたいな作業が不要になります。
Tailscale SSH を使いたい場合は、 Tailscale SSH アクセスされる側に Tailscale をインストールし、 --ssh
オプションを付けて Tailscale を起動します。すでに Tailscale が起動していてもこのコマンドが使えます。
tailscale up --ssh
そして Tailscale ネットワークに参加している他のデバイスから SSH 接続すると、ブラウザが起動して Tailscale にログインすることを求められます。ログインすると、いつも通りの SSH セッションが起動します。
> ssh root@ubuntu-vps
be4rr@lenovo:~$ ssh root@ubuntu-vps
# Tailscale SSH requires an additional check.
# To authenticate, visit: https://login.tailscale.com/a/15c3f5b401daac
Tailscale SSH が便利なのは、 authorized_keys
に公開鍵を追加しなくても SSH 接続できる点です。その代わり Tailscale では ACL (Access Control List) を使って誰がどのマシンに SSH 接続できるのかを制御します。ACL は Admin Console の Access Controls タブから確認できます。
少し細かい話になります。 SSH 接続を制御する ACL は次のような形式で書きます。"src"
と "dst"
で、 Tailscale の どのマシン/ユーザー が どのマシン/ユーザー に SSH 接続できるか設定し、 "users"
で SSH 接続した先で利用できるユーザーを設定します。"action"
で SSH 接続を試みた際の認証方式を指定します。 "check"
に設定すると先ほどのように Tailscale にログインすることを求められ、 "accept"
に設定すると、何もせずにそのまま SSH 接続ができます。もちろん "src"
, "dst"
, "users"
が合っている場合のみです。
{
"action": "check", // "accept" or "check"
"src": [list-of-sources],
"dst": [list-of-destinations],
"users": [list-of-ssh-users],
"checkPeriod": "20h", // optional, only for check actions. default 12h
"acceptEnv": [ "GIT_EDITOR", "GIT_COMMITTER_*", "CUSTOM_VAR_V?" ] // optional, allowlists environment variables that can be forwarded from clients to the host
}
デフォルトだと、次のように設定されています。ユーザーが自分のデバイスに "check"
モードで SSH できる、という設定になっています。
"ssh": [
// Allow all users to SSH into their own devices in check mode.
// Comment this section out if you want to define specific restrictions.
{
"action": "check",
"src": ["autogroup:member"],
"dst": ["autogroup:self"],
"users": ["autogroup:nonroot", "root"],
},
],
Tailscale をインストールできないデバイスと通信できる Subnet Routers
様々な理由で Tailscale をサーバーにインストールできない場合でも、そのサーバーを Tailscale のネットワークに接続する方法があります。それが Subnet Routers です。
Subnet Router は Tailscale をインストールできないデバイスの代わりに、そのデバイスの存在を Tailscale ネットワークに知らせるためのものです。例えば自宅に置いてある Tailscale をインストールできないデバイスに自宅外からアクセスしたいとします。この場合、自宅のネットワークに Subnet Router を用意することで、Tailscale のネットワーク経由でTailscale をインストールできないデバイスに自宅外からアクセスすることができます。
Subnet Router の実体は Tailscale がインストールされた Linux サーバーです。例えば私は Raspberry Pi 4 を Subnet Router として利用しています。
Subnet Router を使うことで、Site-to-Site ネットワーク を構築することができます。つまり直接接続されていないネットワーク同士を Tailscale ネットワークを通して接続することができます。例えば、物理的に離れた拠点のネットワークを接続したり、AWS VPC と 社内ネットワークを接続したりすることができます。もちろん AWS にも同等あるいはより高度な Site-to-Site ネットワークのサービスがありますが、Tailscale はより安価でシンプルに構築できる点が気に入っています。
Subnet Router の具体的な使い方は少し複雑なので、ここでは説明しません。
寛大すぎる無料枠
個人利用の無料枠がとても寛大です。法人向けの管理機能やログ機能以外はほぼすべて利用できます。
その他
上に挙げた機能以外で気になっている・気に入っている機能です。
-
Tailscale Funnel
- インターネットからTailscaleネットワーク内のサービスへの安全なアクセスを提供
-
Tailscale Serve
- ローカルのWebサービスをTailscaleネットワーク内で簡単に共有
-
Serverless アプリケーションとの接続
- AWS LambdaやCloud Functionsからの接続をサポート
-
GitHub Action との連携
- CIパイプラインからTailscaleネットワークへの接続が可能
-
Ephemeral Nodes
- 一時的なマシンとして自動登録・削除
Discussion