『Tailscale抜きのTailscale、Tailscale製』── netcat風ツールTailcatが使う仕組みを読む
Tailscale社自身が公開したオープンソースツール「Tailcat」は、Tailscaleのコントロールプレーン(アカウント・管理画面)なしで、データプレーン(magicsock)だけを使ってnetcat風の疎通・ファイル転送・SSH接続を実現する。README本文で確認できるCLIコマンド例と、認証なしSSHサーバーの仕組みをそのまま示す。

目次
VPNサービスTailscaleを開発するTailscale社自身が、「netcat風の使い勝手をTailscaleのデータプレーン上で実現する」ツール「Tailcat」をオープンソースで公開している。README冒頭のキャッチコピーは「Tailscale without Tailscale, by Tailscale」(Tailscale抜きのTailscale、Tailscale製)。Tailscaleアカウントもroot/管理者権限も不要で、コマンド1つでピアツーピアの暗号化トンネルを開けるという。
3行まとめ
- TailcatはTailscaleのデータプレーン(
magicsock)だけを使い、コントロールプレーン(アカウント管理)は使わない「netcat風」CLI/ライブラリ- Tailscaleアカウント不要・root/管理者権限不要。ユーザースペースで動くバイナリで、マシンのルーティングテーブルやDNSを変更しない
- 標準入出力のパイプ、ローカルポートのトンネル公開、認証なしSSH、SOCKS5プロキシ経由のコマンド実行までREADMEにコマンド例付きで示されている
何をしているのか——コントロールプレーン抜きでmagicsockだけを使う
README本文はこう説明する。
Tailcat is a remix of Tailscale open source pieces to act like netcat, but over Tailscale's data plane, without Tailscale's control plane. […] Instead of using the Tailscale control plane, all
tailcatconnection metadata is exchanged out of band, however you want.
(Tailcatは、Tailscaleのオープンソースの構成要素をリミックスし、netcatのように振る舞わせるツールだ。ただし通信はTailscaleのデータプレーン上で行い、コントロールプレーンは使わない。〔中略〕Tailscaleのコントロールプレーンを使う代わりに、tailcatの接続メタデータはすべて、好きな方法でアウトオブバンドにやり取りする)
Tailscale本体のデータプレーン(magicsock)は、2台のマシン間でポイントツーポイントのWireGuard暗号化トンネルを提供し、NAT越えのための通信チャネルとして、そして最終手段の中継としてDERPサーバーを使う。Tailcatはこの仕組みだけを借り、ユーザーがTailscaleアカウントを作ったりデバイスを管理画面に登録したりする必要をなくしている。
You don't need a Tailscale account, root/admin access on the machine (it doesn't alter your machine's routing tables, DNS, etc.). It's just a userspace library and CLI tool.
(Tailscaleアカウントは不要で、マシンのroot/管理者権限も不要だ(ルーティングテーブルやDNS等を変更しない)。ただのユーザースペースのライブラリ兼CLIツールだ)
DERPリレーはTailscale社が提供する無料のレート制限付きリレー(デフォルトのDERPマップはhttps://tailcat.dev/derpmap.json)を使うか、自前で立てることもできる。ブラウザ上で動くWebAssembly版のデモもhttps://tailscale.github.io/tailcat/で公開されているという。
使い方——CLI 1行で疎通からSSHまで
READMEにはコマンド例が豊富に掲載されている。最も基本的な使い方は、サーバー側でtailcatを実行して接続トークンを受け取り、それをクライアント側に渡すというものだ。
$ tailcat
# Selected bootstrap relay region 302, San Francisco
# 🐈 Server listening with new address: tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu
(hangs, waiting...)
$ echo hello | tailcat tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu
ローカルポートをトンネル越しに公開することもできる。
$ tailcat --serve=8080,8443 # or --serve=all
Linux/macOSでは、認証なしのSSHサーバーを一時的に立てる使い方も用意されている。
On Linux and macOS, you can run an SSH server too with no auth. (If you want auth, you can just
tailcat --serve=22and proxy to your system SSH server)
(LinuxとmacOSでは、認証なしのSSHサーバーも実行できる。認証が欲しい場合は、単純にtailcat --serve=22でシステムのSSHサーバーへプロキシすればいい)
$ tailcat --serve=no-auth-ssh
$ tailcat ssh tcXXXXXXXXX
疎通確認用のpingコマンドは、応答がDERPリレー経由か直接パス経由かを報告する。
$ tailcat ping --until-direct <token>
pong in 42.1ms via DERP(sfo)
pong in 1.2ms via 203.0.113.7:41641
SOCKS5プロキシ経由でコマンドをトンネル越しに実行するtailcat socksコマンドもあり、トークンはURLのホスト名としてもそのまま使えるとREADMEは説明している。
トークンの鍵管理──「使い捨て」がデフォルト、保存すると挙動が変わる
READMEの「Key Management」セクションは、接続トークンの安全性がサーバー側のWireGuard鍵にひもづいていることを説明している。デフォルトの挙動はエフェメラル鍵で、tailcatを実行するたびに新しい鍵をメモリ上だけで生成し、プロセスが終了すればそのアドレス(トークン)は二度と使えなくなる。一方、tailcat genkeyで保存鍵を作ると、再起動をまたいで同じアドレスを使い続けられる代わりに、そのアドレスを一度でも共有した相手は将来のどのセッションにも接続できてしまう(--allowで接続元を制限しない限り)。CLIは起動時にどちらの鍵を使っているかを表示するとREADMEは説明しており、鍵は~/.config/tailcat/keys/以下にJSONファイルとして保存される。
接続トークン自体の構造も「How it works」セクションに記載がある。トークンはtcプレフィックス+base64エンコードされたCBOR(32バイトのCurve25519公開鍵+DERPリレー情報)で、リージョンを整数IDだけで指定する典型的なトークンはおよそ50バイトになるという。トークンに有効期限のフィールドはなく、有効性は鍵の生死(エフェメラルかどうか)だけで決まる設計だと読み取れる。
何が中で起きているか──DERP経由の「Meow」ハンドシェイクからP2Pへ
「Connection flow」セクションによれば、接続確立は次の順序で進む。①サーバーがWireGuard鍵ペアを生成(または読み込み)しDERPリレーに接続、トークンをstderrに出力して待機。②クライアントがトークンをパースしてサーバーの公開鍵とDERPリージョンを知り、自分もDERPリレーに接続。③クライアントがDERP経由でサーバーに"Meow"という名前のping メッセージを送り、サーバーは"Meowed"で応答してクライアントをWireGuardピアとして登録。④双方がWireGuardピアとして設定された状態で通常のWireGuardハンドシェイクが進み、暗号化トンネルが確立。⑤並行してSTUNで学習したUDPエンドポイントをDERP経由で交換し合い、Tailscaleの「disco」プロトコルでUDPホールパンチングを試みる。成功すればDERP経由からP2P直接経路へ切り替わり、失敗すればDERPが中継を続ける。ネットワークスタックには、rootを必要としないユーザースペースWireGuard実装、magicsock(transport層)、gVisor製の userspace TCP/IPスタック「Netstack」の3つが使われているという。
デフォルトのDERPリレーは4リージョン、SLAなしの「best effort」
Tailscale社がホストするデフォルトのDERPリレーマップ(https://tailcat.dev/derpmap.json)を実際に取得すると、2026年8月30日時点で以下の4リージョンが登録されていた。
| リージョンID | コード | 都市 | ノード名 | IPv4 |
|---|---|---|---|---|
| 301 | nyc | ニューヨーク | 301a | 199.38.181.166 |
| 302 | sfo | サンフランシスコ | 302a | 208.111.39.38 |
| 303 | fra | フランクフルト | 303a | 185.178.202.197 |
| 304 | tok | 東京 | 304a | 172.238.7.124 |
出典: tailcat.dev/derpmap.json(curlで直接取得したJSON)
READMEの「Stability」セクションは、この公開DERPリレーについて「アップタイムSLAもスループット目標もなく、理由を問わずいつでもアクセスを取り消すことがある」「契約関係のない、best effortの提供」と明記している。CLIのフラグ・出力・ワイヤーフォーマットについてもAPI/CLIの安定性は約束しないとしており、実運用でSLAが必要な場合は「Contact Sales」でTailscale社に問い合わせる導線が用意されている。
「History」セクションによると、Tailcatの前身は2023年9月に「derpcat」という名前で始まり、最初のコミットは同月の飛行機の中で書かれたという。長らくtailscale.comリポジトリのフォーク内で放置されていたが、その後tailscale.comリポジトリに依存する通常のGoモジュールとして書き直され、2026年8月の「TailscaleUp」ユーザーカンファレンスでオープンソース公開された。
誰のためのツールか
「認証なしSSHサーバーをコマンド1つで立てられる」という機能は、一時的なデバッグやファイル転送には便利だが、そのまま公衆インターネットに近い形で使うとセキュリティ上の判断が必要になる機能でもある。上記の鍵管理の仕組みから読み取れるのは、デフォルトのエフェメラル鍵を使う限り「トークンを知っている間だけ」有効という設計であり、トークンを固定運用したい場合は--allowでの接続元制限とセットで使うことが前提になっているという点だ。ただし、トークンの推測困難性(32バイトのCurve25519鍵に由来する高いエントロピー)以上の追加防御——たとえばレート制限やブルートフォース対策——についてREADMEが明記しているかどうかは、今回読めた範囲では確認できなかった。
go installもSSH接続も、実際には試していない
この記事はGitHubリポジトリのREADME本文と、tailcat.dev/derpmap.jsonが返す実データを一次ソースとしている。README記載のgo install github.com/tailscale/tailcat/cmd/tailcat@latestやnix run github:tailscale/tailcatは文面としては確認したが、実際にインストールしてTailcatを起動し、2台のマシン間で疎通確認・ポート公開・SSH接続を試す検証は行っていない。「Meow」「Meowed」ハンドシェイクを含む接続フローの説明もREADME記述の要約であり、パケットキャプチャ等で自分で観測したものではない。認証なしSSHサーバー機能について、レート制限やブルートフォース対策の有無はREADME本文からは読み取れず、確認できていない。
Zenn・Qiitaともに、この記事の元になった候補メモの時点で深掘り記事はまだ見当たらなかった(Qiitaで1件、海外テック動向まとめの中での言及があるのみ)。Tailscale社が自ら公開したオープンソースプロジェクトという性質上、通常のサードパーティ製ツールよりも技術的な裏付けは強いと見てよさそうだが、これは推測であり、独立した第三者によるセキュリティレビューを本記事で確認したわけではない。
関連記事: AIコーディングアシスタント比較
感想・指摘はコメント欄へ。
出典・参照資料
AIニュースの解説を動画でも
YouTubeでは注目ニュースの背景を解説し、Xでは新着記事をお知らせしています。
コメント
まだコメントはありません。最初のコメントを書いてみませんか?
AIについて聞きたいことはありますか?
質問箱で無料で受け付けています。回答は公開され、他の方の参考にもなります。
質問箱を見る →新しい記事をメールで受け取る
AIの新しい発表を、出典付きで整理して届けます。