世界を動かす技術を、日本語で。

Tailcat – netcatのように、しかしTailscaleのデータプレーンを介して

2026年8月27日原文(github.com)

概要

  • 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
  • 認証不要SSHサーバー

    • Linux/macOSで$ tailcat --serve=no-auth-ssh
    • クライアント:$ tailcat ssh <トークン>

便利なコマンド

  • 接続テスト(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通信を実現

Hackerたちの意見

面白いね。昔のブログ記事を読んで、NATを突破する方法を考えたんだ。結局、やる気が出なかったり、友達に他の選択肢(ワームホールとか)を勧められたりして、実行には至らなかったけど。

自作版を何年もSSHフォワーディングとnginxリバースプロキシでやってたよ。

でも、NATトラバーサルなしじゃね…

Tailscaleの独自性がなくなるのはいいね。もしそれが目的なら、完全にオープンソースにして、tsの管理も排除して、完全な主権を得るのもアリじゃない?Netbird、OpenZiti、ZeroTierとかみたいに。

(ここで作者)DERPサーバーはすでにオープンソースだし、tailcatは自分が運営するDERPサーバーを使えるよ。https://github.com/tailscale/tailscale/tree/main/cmd/derper#... もし帯域幅に敏感じゃなければ、始めるためのデフォルトのサーバーも提供してるよ(https://tailcat.dev/derpmap.json)。でも、必ず使わなきゃいけないわけじゃないよ。追記:これについての明確なドキュメントをhttps://github.com/tailscale/tailcat#bring-your-own-derp-rel...に追加したよ。

それか、WireGuardを直接使うのもありだね。設定が面倒なのは分かるけど、オープンソースの設定ジェネレーターもたくさんあるし。

えっと、今フルオープンソースのテイルスケールスタックがあるの?

最近リリースされたbitbang-cliの直接の競合みたいだね。https://github.com/richlegrand/bitbang-cli

Wushも似たようなことをやってた(Tailscaleを使ってる)よ。https://github.com/coder/wush

これってイロハにちょっと似てるのかな? https://github.com/n0-computer/iroh

特にこれね: https://github.com/n0-computer/dumbpipe https://github.com/cablehead/pai-sho

これ、賢いね。ファイル転送だけじゃなくて、一般的な接続性のためのマジックワームホールみたいな感じ。

Hacker Newsで議論の続きを見る