概要
- Tailcat はTailscaleのデータプレーンのみを利用した軽量ツール
- Tailscaleのアカウントや管理権限不要 でP2P暗号通信を実現
- DERPサーバー経由でNAT越えやリレー通信 が可能
- CLIツールやGoライブラリ として利用可能
- 鍵管理やカスタムDERPサーバー対応 など柔軟な運用が可能
Tailcatとは:Tailscaleのデータプレーンを活用したP2Pツール
- Tailcat は、Tailscaleのオープンソースコンポーネントを使い、 管理プレーンを排除 したP2P通信ツール
- magicsock によるWireGuard®暗号トンネルで、 2台のマシン間を直接接続
- DERPサーバー をNAT越えやリレー用途で利用し、NAT環境下でも通信確立
- 接続メタデータは任意の方法で手動共有 (Tailscaleのコントロールプレーンは不使用)
- アカウント登録やroot権限不要、ルーティング・DNS設定も変更しない
- オープンソース であり、CLIまたはGoライブラリとして利用可能
インストール方法
- Go利用時
$ go install github.com/tailscale/tailcat/cmd/tailcat@latest
- Nix flakes利用時
$ nix run github:tailscale/tailcat$ nix profile install github:tailscale/tailcat
基本的な使い方
-
標準入出力の転送
- サーバー起動:
$ tailcat- 新規アドレス(トークン)が表示され待機
- クライアント接続:
$ echo hello | tailcat <トークン> - サーバー側で受信内容が表示される
- サーバー起動:
-
ローカルポートのトンネル転送
- サーバー:
$ tailcat --serve=8080,8443 - クライアント:
$ tailcat <トークン> 8080- HTTPリクエスト例:
GET / HTTP/1.1
- HTTPリクエスト例:
- サーバー:
-
認証不要SSHサーバー
- Linux/macOSで
$ tailcat --serve=no-auth-ssh - クライアント:
$ tailcat ssh <トークン>
- Linux/macOSで
便利なコマンド
-
接続テスト(Ping)
$ tailcat ping --until-direct <トークン>- 直接接続/DERP経由の判別表示
-
SOCKS5プロキシ経由コマンド実行
$ tailcat socks <トークン> curl http://server.tailcat:8081/
-
Exit Nodeとしての利用
- サーバー:
$ tailcat --serve=exit-node
- サーバー:
-
トークン情報の解析
$ tailcat parse <トークン>- WireGuard公開鍵やDERP情報をJSONで表示
-
短縮トークンの解決
$ tailcat resolve <トークン>- DERP情報を埋め込んだ長いトークンを生成
鍵管理とアドレス
- サーバーアドレス(トークン)はWireGuard鍵から生成
- エフェメラル鍵(デフォルト) :プロセス終了で無効化
- 保存鍵 :
tailcat genkeyで生成・保存、再起動後も同一アドレス利用可能$ tailcat genkey --region=nyc$ tailcat --serve=8080(保存鍵が自動利用される)$ tailcat --serve=8080 --key=newで新規エフェメラル鍵を強制
- 保存鍵一覧 :
tailcat genkey --list - DNS TXTレコードによるトークン公開・参照
- 例:
tailcat ssh example.com
- 例:
DNSとSSHの連携例
- クライアント鍵生成 :
tailcat genkey --client - サーバー鍵生成 :
tailcat genkey --fixed-region - 特定クライアントのみ許可 :
tailcat --serve=22 --allow=nodekey:xxxx - DNSにトークン登録 :
my-server.example.com. 300 IN TXT "tailcat=tcXXXX" - クライアント接続 :
tailcat ssh my-server.example.com
カスタムDERPサーバー・DERPマップ
- 独自DERPサーバー利用 :
tailcat genkey --region=derp.example.com - DERPマップJSONの指定 :
--derpmap-urlで独自マップ利用可能
Goライブラリとしての利用
- 最小サーバー実装例
- TCPポートをトンネル経由で受け付け、トークンを表示
- 最小クライアント実装例
- トークンを指定してTCPポートに接続・データ受信
仕組み・ネットワーク構成
- トークン(ConnBlob)
"tc"プレフィックス+base64エンコードCBOR- WireGuard公開鍵 と DERP情報 を含む
- DERP情報はIDまたはノード詳細
- ネットワークスタック
- Tailscaleのクライアントネットワーク部品を再利用
- WireGuard による暗号化通信
- magicsock によるNATトラバーサル
- DERPサーバー によるリレーもしくはNAT越え失敗時のフォールバック
まとめ
- TailcatはTailscaleのデータプレーンを最大限活用しつつ、管理プレーンを排除したシンプルなP2Pツール
- 柔軟な鍵管理・DERPサーバー対応・DNS連携など多様なユースケースに対応
- Tailscaleアカウントやroot権限不要で、セキュアかつ手軽なP2P通信を実現