😢

TailScale をもっと早く使っていればよかった...

2025/01/06に公開

最近 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

https://tailscale.com/kb/1347/installation

適当な 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"],
    },
],

https://tailscale.com/kb/1193/tailscale-ssh
https://tailscale.com/kb/1337/acl-syntax
https://tailscale.com/kb/1192/acl-samples?q=acl

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 の具体的な使い方は少し複雑なので、ここでは説明しません。

https://tailscale.com/kb/1019/subnets

寛大すぎる無料枠

個人利用の無料枠がとても寛大です。法人向けの管理機能やログ機能以外はほぼすべて利用できます。

https://tailscale.com/pricing?plan=personal

その他

上に挙げた機能以外で気になっている・気に入っている機能です。

Discussion