tailcat — Tailscaleのデータプレーンを活用したアカウント不要のP2P通信ツール
tailscale/tailcat
★ 9,467 ・ Go ・ BSD-3-Clause
概要
tailcat は、メッシュVPNサービスを提供するTailscaleが開発・公開しているオープンソースのCLIツールおよびGoライブラリです。READMEでは「Tailscale without Tailscale, by Tailscale」と紹介されており、従来の「netcat(nc)」のように手軽に利用できる通信ツールを目指して作られています。
最大の特徴は、Tailscaleのアカウント登録や集中管理を行うコントロールプレーンを一切必要としない点です。Tailscaleのデータプレーンコンポーネントである magicsock を取り出し、2台のマシン間で直接WireGuardによる暗号化トンネルを確立します。端末のルーティングテーブルやDNS設定を変更しないユーザ空間ツールとして実装されているため、OSのroot権限や管理者権限も不要です。
ファイアウォールやNATの背後にあるマシン同士で一時的に通信したい開発者や、手軽にセキュアなポートフォワーディング・SSHアクセス環境を用意したい人に向いています。
主な特徴
- コントロールプレーン不要のP2Pトンネル: Tailscaleアカウントを作成することなく、端末間でWireGuardによるエンドツーエンドの暗号化通信を行えます。
- DERPとNATトラバーサルによる接続確立: 最初はDERPリレーサーバー経由で通信をブートストラップし、
magicsockによってNAT越え(NAT traversal)を行って直接のUDP接続へと自動的に昇格します。 - 管理者権限が不要なユーザ空間設計: システムのネットワークインターフェースやルーティングテーブル、DNSを書き換えないため、一般ユーザー権限で動作します。
- 多彩な通信モード: 標準入出力(stdin/stdout)のパイプ接続をはじめ、ローカルポートの公開や転送、特定コマンドを接続ごとに実行する機能などを備えています。
- SSHサーバー機能の内蔵: OpenSSHの鍵やGitHubの公開鍵を用いたSSHサーバー、あるいはトンネル自体の秘密性を認証代わりにする認証不要モード(no-auth-ssh)を提供します。
- GoライブラリとWebAssembly対応: CLIツールとしてだけでなくGoパッケージとしてコードに組み込めるほか、ブラウザ上で動作する実験的なWebAssembly実装も公開されています。
使い方
インストール
Linux環境向けの静的バイナリやdeb/rpmパッケージ、macOS向けのHomebrew、Windows向けのScoop、コンテナイメージ、ソースコードからのビルドなど、多種多様な配布方法が用意されています(詳細はリポジトリ内の INSTALL.md に記載されています)。
1. 2台のマシン間で標準入出力をパイプ接続する
サーバー側で引数なしで tailcat を起動すると、一時的なアドレス(tailcat address)が発行されます。
$ tailcat
# Selected bootstrap relay region 302, San Francisco
# 🐈 Server listening with new address: tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu
(hangs, waiting...)
クライアント側でそのアドレスを指定してデータを送信すると、サーバー側に内容が出力されます。
$ echo hello | tailcat tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu
$
# サーバー側の出力
hello
$
2. ポートの公開とフォワーディング
ローカルのTCPポートを公開して、リモートから接続を受け付けることができます。
# サーバー側: 8080ポートと8443ポートを公開
$ tailcat serve 8080,8443
# 🐈 Server listening with new address: tcXXXXXXXXX
クライアント側はアドレスとポートを指定して直接リクエストを送るか、forward サブコマンドを使って手元のローカルポートにバインドできます。
# クライアント側から直接通信
$ tailcat tcXXXXXXXXX 8080
GET / HTTP/1.1
Host: foo
HTTP/1.1 200 OK
....
ローカルポートにマッピングする場合は forward を利用します。
# クライアント側: ローカルの18080ポートをリモートの8080に、3306を3306にマッピング
$ tailcat forward tcXXXXXXXXX 18080:8080 3306
また、Webサーバーへ素早くアクセスするための browse コマンドも用意されています。
# サーバー側
$ tailcat serve 80
# 🐈 Server listening with new address: tcXXXXXXXXX
# クライアント側(接続確立後にローカルブラウザが自動起動する)
$ tailcat browse tcXXXXXXXXX
3. SSHサーバーの起動
ローカルの authorized_keys やGitHub上の公開鍵(user@github 形式で https://github.com/user.keys を取得)を利用して、簡易SSHサーバーを起動できます。
# 公開鍵を指定して起動
$ tailcat serve --ssh-authorized-keys=~/.ssh/authorized_keys ssh
# 🐈 Server listening with new address: tcXXXXXXXXX
クライアントからは以下のように接続します。
$ tailcat ssh tcXXXXXXXXX
$ tailcat ssh tcXXXXXXXXX ls -la
明示的にクライアント認証を行わない no-auth-ssh サービスも用意されています。
$ tailcat serve no-auth-ssh
# 🐈 Server listening with new address: tcXXXXXXXXX
4. 接続ごとにコマンドを実行する(exec)
inetdのように、接続ごとに指定したコマンドを実行し、接続をそのコマンドの標準入出力として扱う機能もあります。
$ tailcat serve exec -- /usr/bin/fortune
# 🐈 Server listening with new address: tcXXXXXXXXX
技術的なポイント
- Go言語による実装とライブラリ提供: コアロジックおよびCLIはGoで書かれており、
github.com/tailscale/tailcatパッケージを自身のGoプログラムにインポートして利用できます。 - データプレーン
magicsockの単独利用: Tailscale内部で使われているUDP通信抽象化レイヤーmagicsockを採用しています。通常は中央のコントロールプレーンがノード情報を取り持ちますが、tailcatでは接続用アドレスを人間や別経路で受け渡す(アウトオブバンド)ことで、中央サーバーなしのP2Pトンネルを実現しています。 - DERPリレーによるフォールバック: 初期ハンドシェイクやNAT越えのシグナリングにDERP(Designated Encrypted Relay for Packets)を利用します。P2P接続への昇格が失敗した場合でも、DERPがリレーとして機能するため通信が成立します。デフォルトでは提供されているDERPリレー(
https://tailcat.dev/derpmap.json)が使われますが、自前のDERPサーバーを指定することも可能です。 - WebAssembly対応: GoコードをWebAssembly(js/wasm)にコンパイルすることで、ブラウザからファイルの送受信やテキスト送受信を行うWebデモが用意されています。なお、READMEによるとWebRTC対応が入るまでは、ブラウザ版のトラフィックはDERPリレー経由のみとなっています。
注意点
no-auth-sshのセキュリティ: クライアント認証を行わないno-auth-sshモードでは、発行されたtailcatアドレス自体が認証情報(クレデンシャル)として扱われます。アドレスを知る人であれば誰でもサーバーを起動したユーザーの権限でシェルを取得できてしまうため、DNSのTXTレコードなど公開の場にアドレスを配置してはならず、安全なプライベート経路でのみ共有するようREADMEで強く警告されています。- DERPリレーの利用制限: デフォルトで設定されているDERPリレーは無料で利用できますが、レート制限が設けられています。大量の帯域を必要とする用途では、自身でDERPリレーをホストすることが推奨されます。
- ライセンス: 本ソフトウェアはBSD 3-Clauseライセンスの下で公開されています。
- ブラウザ版の機能制限: ブラウザ上で動作するWebAssembly版は実験的な位置づけであり、直接のP2P接続(WebRTC)には未対応でDERP経由のリレー通信のみとなります。
まとめ
tailcat は、Tailscaleの洗練されたP2P暗号化トンネル技術を、アカウント登録やシステム設定の変更なしで手軽に扱えるようにしたコマンドラインツールです。一時的なファイル転送からセキュアなポートフォワーディング、SSHアクセスまで、従来のnetcatの感覚でWireGuardの強固な通信環境を迅速に構築できます。





