Tailcat – Netcat のような動作だが、Tailscale データプレーン上で行うツールです。

2026/08/27 2:42

Tailcat – Netcat のような動作だが、Tailscale データプレーン上で行うツールです。

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

Tailcat は、netcat のような動作をするオープンソースユーティリティで、Tailscale のインフラストラクチャを利用して安全なリモート接続を可能にし、Tailscale アカウントや root アクセスを必要としません。既存のユーザースペースコンポーネント(WireGuard®、NAT 越え用の magicsock、Netstack(gVisor)など)を活用し、UDP を介して暗号化トンネルを構築します。接続は DERP サーバー(短時間の接続トークンを使用)を経由して初期化され、可能であれば直接のピアツーピアリンクにアップグレードされ、システムルーティングテーブルや DNS 設定の変更が一切不要になります。本ツールは完全にユーザースペースで動作し、管理権限は必要ありません。もともとは「derpcat」と名付けられ、TailscaleUpカンファレンスにてオープンソース化されました。各種ネーティングタスク(stdin/stdoutのパイピング、ローカルポートの公開、認証不要なSSHサーバーの実行、SOCKS5プロキシとしての機能など)に対応しています。鍵管理では、一時鍵(デフォルト)と生成された鍵による安定アドレス(

tailcat genkey
)の両方がサポートされており、トークン解決には DNS TXT レコードまたは
parse
resolve
コマンドを利用できます。
go install
または Nix flakes 経由で入手可能な Tailcat は、コントロールプレーンの依存関係を排除しつつ、多様な環境間で認証された安全な接続を提供することで、複雑なネットワークセットアップを簡素化します。

本文

Tailcat:コントロールプレーン不使用の Tailscale データプレーン利用ツール

概要

Tailcat は、Tailscale のコントロールプレーンを使用せず、データプレーン(magicsock)のみを利用して Netcat と同様の動作を実現するオープンソースツールです。

  • 通信経路: DERP(Direct Endpoint Routing Protocol)を介して点対点の WireGuard® 暗号化トンネルを構築します。
  • 構成要件: Tailscale アカウントの所持不要。ルート/管理者権限も不要(システム設定変更なし)。
  • 実装ベース:
    github.com/tailscale/tailcat
    Go ライブラリと CLI ツール。

動作原理

  1. ブートストラップ: 初期接続は DERP サーバーを経由して確立されます。
  2. 接続アップグレード: magicsock が NAT 経路設定を行い、可能であれば直結のピアツーピア(P2P)UDP 接続へアップグレードします。
  3. 暗号化: すべてのトラフィックが WireGuard でエンドツーエンド暗号化されます。

利用可能な DERP リレー

  • デフォルト:
    https://tailcat.dev/derpmap.json
    を参照する無料リレー。
  • 自管運用: ご自身の DERP サーバーも利用可能です。

インストール方法

Go や Nix flake を使用してインストールできます。

# Go モジュールを使用
go install github.com/tailscale/tailcat/cmd/tailcat@latest

# または Nix flakes で実行・インストール
nix run github:tailscale/tailcat
nix profile install github:tailscale/tailcat

使用方法

1. スタンダードな stdin/stdout パイプ

サーバー側を起動し、生成されたトークンをクライアントに渡します。

サーバー起動(リスナー開始)

$ tailcat
# Selected bootstrap relay region 302, San Francisco
# 🐈 サーバーは新しいアドレスでリスニング中:tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu
(ハングして待機中...)

クライアント側(コマンド実行)

$ echo hello | tailcat tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu
hello
$

サーバー側で解放される状態:

$ tailcat
# 入力された 'hello' が出力されます
hello
$

2. ローカルポートのトンネリング(プロキシ)

ローカルの TCP ポートをリモートからアクセス可能にします。

サーバー設定

# ポート指定:8080 と 8443 を公開(または --serve=all ですべて)
$ tailcat --serve=8080,8443 
# 🐈 サーバーは新しいアドレスでリスニング中:tcXXXXXXXXX

クライアントアクセス

# トークンにポート番号を指定して接続
$ tailcat tcXXXXXXXXX 8080 

# Web サーバーへのリクエストが可能になる
GET / HTTP/1.1
Host: foo

HTTP/1.1 200 OK
....

3. 認証なし SSH サーバー

Linux および macOS で、認証を省略した簡易 SSH サーバーとしても動作します。

サーバー設定

# no-auth-ssh モードで起動
$ tailcat --serve=no-auth-ssh
# 🐈 サーバーは新しいアドレスでリスニング中:tcXXXXXXXXX

クライアント接続

$ tailcat ssh tcXXXXXXXXX 
$ tailcat ssh tcXXXXXXXXX ls -la
# 標準的な SSH コマンドが実行可能

4. Miscellaneous コマンド

ピングによる接続性テスト

DERP リレー経由か直結(ダイレクトパス)かをレポートします。

# --until-direct: タイムアウト(デフォルト 10 秒)まで ping を続け、直結まで待機する
$ tailcat ping --until-direct <トークン>
pong in 42.1ms via DERP(sfo)
pong in 1.2ms via 203.0.113.7:41641 # 直結成功

SOCKS5 プロキシ経由の実行

トークンを URL ホスト名として認識します(ブラウザのホスト名小文字化処理に注意)。

# トークン引数または --serve 形式
$ tailcat socks <トークン> curl http://server.tailcat:8081/
$ tailcat socks curl http://<トークン>:8081/

エグジットノードとして動作

クライアントがサーバーのネットワークに到達できるようにします。

$ tailcat --serve=exit-node

トークンの解析(JSON 出力)

接続を試行せず、WireGuard 公開鍵や DERP 情報を確認できます。

$ tailcat parse tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu
{
    "ServerPublic": "nodekey:9c8d2e6728da80a1dd37e275a82595b42d9a838610bc53f74a7670d1610f2e34",
    "RegionID": 302
}

トークンの展開(短縮版 → 自己完結型)

DERP リージョン ID を含んだ短縮トークンを、ホスト名や IP が埋め込まれた完全な形式に変換します。これによりクライアントはより迅速に接続できます。

# 短縮トークンの解決
$ tailcat resolve tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu
tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8UdGjYWhudGMzMDJhLmlwbi5kZXZhNG0yMDguMTExLjM5LjM4YTZzMjYwNzpmNzQwOjA6M2Y6OjcyMA

# 展開後の解析(DERP ノード情報を含む)
$ tailcat parse <展開されたトークン>
{
    "ServerPublic": "...",
    "Region": [
        {
            "Nodes": [
                {
                    "HostName": "tc302a.ipn.dev",
                    "IPv4": "208.111.39.38",
                    "IPv6": "..."
                }
            ]
        }
    ]
}

サーバー側でも

--full-address
フラグで完全な形式を出力できます。


キーマネジメント(鍵の管理)

接続トークンは派生する WireGuard 鍵により、アクセス権限が決定されます。

キータイプ特徴
一時的鍵 (Ephemeral keys)デフォルト。
起動時に新しい鍵を生成し、プロセス終了時に破棄されます。
安全なデフォルト。共有してもそのセッションのみ有効です。
保存された鍵 (Saved keys)
tailcat genkey
でディスクに保存。
再起動後もアドレスが安定します。
注意: 以前共有したすべてのアドレスで、将来の接続が可能になる可能性があります(
--allow
で制限しない限り)。

操作例

  • 永続鍵の生成と保存:

    $ tailcat genkey --region=nyc
    # トークン出力。キーは ~/.config/tailcat/keys/default.private.json に保存されます。
    
  • 保存された鍵を自動使用:

    # 'default' という名前の鍵が存在すると自動的に使用されます
    $ tailcat --serve=8080 
    # 🐈 サーバーは保存されたキー "default" でリスニング中:tcXXXXXXXXX
    
  • 新しい一時的鍵を強制的に生成:

    $ tailcat --serve=8080 --key=new
    # 🐈 サーバーは新しいアドレスでリスニング中:tcXXXXXXXXX
    
  • 保存済みデフォルト鍵の削除:

    tailcat genkey --delete --key=default
    

DNS によるトークン解決 トークンを DNS TXT レコードとして公開し、ドメイン名で接続できます。

# DNS 設定例
my-server.example.com. 300 IN TXT "tailcat=tcXXXXXXXXX"
# ドメイン名を直接指定(自動解決)
$ tailcat example.com 8080
$ tailcat ssh example.com
$ tailcat ping example.com

例:DNS を介した保護された SSH サーバー

ポートフォワーディングやノッキングなしに、どこからでも名前でアクセス可能な SSH サーバーを設定できます。WireGuard がパケットを見る前にクライアント認証を行います。

  1. クライアント側: アイデンティティ鍵ペアを生成し、公開鍵のみをサーバーに渡す必要はありません(CLI 上で処理可能)。

    client$ tailcat genkey --client
    # ファイル:~/.config/tailcat/keys/client-default.private.json に保存されます。
    nodekey:cfb6bfa77a0654d7450947fd6acef17d2cd848da1d30b2540b13dac272ddfd16
    
  2. サーバー側: ネイレスト DERP リージョンに固定された鍵ペアを生成し、特定のクライアントに対してのみ SSH サーバーを提供します。

    server$ tailcat genkey --fixed-region
    # ファイル:~/.config/tailcat/keys/default.private.json に保存されます。
    tcXXXXXXXXX
    
    server$ tailcat --serve=22 --allow=nodekey:cfb6bf...ddfd16
    # 🐈 サーバーは保存されたキー "default" でリスニング中:tcXXXXXXXXX
    
  3. DNS レコード設定:

    my-server.example.com. 300 IN TXT "tailcat=tcXXXXXXXXX"
    
  4. 接続:

    client$ tailcat ssh my-server.example.com
    

    自動保存された

    client-default
    キーが使用されるため、追加のフラグは不要です。

なぜ
--fixed-region
を使うのか?

通常

tailcat genkey
--region=auto
(起動時選択)を使用しますが、DNS に公開されたトークンはクライアントとサーバー再起動後も同じ場所で集合できるようにするため、固定されたリージョンを指定する必要があります。

  • 固定:
    --fixed-region
    または
    --region=<名前>
  • リージョン選択可:
    --region=list

TODO: DERP マップが変化した場合のクライアント側強化が必要(Issue #7)


独自 DERP リレーの導入

Tailscale のリレーを使用せず、独自の DERP サーバーを運用可能です。 DERP は hostname と TLS 証明書が必要です(derper により Let's Encrypt で自動取得可能)。

サーバー設定例:

server$ tailcat genkey --region=derp.example.com
tcomFwWCCAIsKOqPUux6ClG2RM4A_vOq4VBzGgHGGjq9OsJuFKSWFygaFhToGhYWhwZGVycC5leGFtcGxlLmNvbQ

server$ tailcat --serve=22

自己完結型トークンの確認: トークンにはリレーのホスト名が埋め込まれており、Tailscale マップサーバーへの依存はありません。

$ tailcat parse tcomFwWCCAIsKOqPUux6ClG2RM4A_vOq4VBzGgHGGjq9OsJuFKSWFygaFhToGhYWhwZGVycC5leGFtcGxlLmNvbQ
{
    "ServerPublic": "...",
    "Region": [
        {
            "Nodes": [
                {
                    "HostName": "derp.example.com"
                }
            ]
        }
    ]
}

複数のリレーを運用している場合は、独自の DERP マップ JSON を

--derpmap-url
で渡すことも可能です。


Go ライブラリによる利用

TCP ポートを回答する最小限のサーバーとクライアントを実装できます。

サーバー側コード例

package main

import (
	"fmt"
	"log"
	"net"
	
	"github.com/tailscale/tailcat"
)

func main() {
	s := &tailcat.Server{
		OnTCP: func(port uint16) func(net.Conn) {
			return func(c net.Conn) {
				fmt.Fprintf(c, "hello from port %v\n", port)
				c.Close()
			}
		},
	}
	if err := s.Start(); err != nil {
		log.Fatal(err)
	}
	fmt.Println(s.ConnBlob()) // トークンを出力
	select {} // 待機
}

クライアント側コード例

package main

import (
	"context"
	"io"
	"log"
	"os"

	"github.com/tailscale/tailcat"
)

func main() {
	// サーバーから取得したトークンを引数に指定
	cl := tailcat.NewClient(tailcat.ConnBlob(os.Args[1]))
	defer cl.Close()
	
	c, err := cl.DialTCPPort(context.Background(), 80)
	if err != nil {
		log.Fatal(err)
	}
	io.Copy(os.Stdout, c) // 結果を表示
}

実行例:

$ ./client tcomFwWCAWf933BLELdzd3RkHiOufJ...
hello from port 80

仕組みの詳細

接続トークン (ConnBlob)

tcXYZ...
の形式で、Base64 エンコードされた CBOR を含む。

  • WireGuard 公開鍵: Curve25519(32 バイト)。
  • DERP 情報:
    • 整数のリージョン ID(デフォルト Tailscale リレー参照)。
    • または、完全な DERP サーバーメタデータ(
      --full-address
      tailcat resolve
      で生成)。自己完結型。

ネットワークスタック

コントロールプレーンを使用せず、以下のコンポーネントを再利用します。

  • WireGuard: ユーザースペース実装。カーネル TUN/TAP デバイスやルート権限は不要。
  • magicsock: UDP と DERP リレーを超えてマルチプレックスするトランスポートレイヤー。NAT 経路設定(ホールパンチ)も処理。
  • Netstack (gVisor): ユーザースペースの TCP/IP スタック。OS のネットワーク構成なしに入出力を処理。
  • DERP リレー: フォールバック用および集合チャネルとしての暗号化プロトコル。

接続フロー

  1. サーバー起動: 鍵ペア生成 → DERP に接続 → トークン出力 → クライアント待機。
  2. クライアント解析: トークン学習 → 独自鍵ペア生成 → DERP 接続。
  3. ハンドシェイク: クライアントが "Meow" を送信 → サーバーがピアリストに追加 → "Meowed" 確認。
  4. WireGuard トンネル: WireGuard ハンドシェイク完了。暗号化トンネル確立。
  5. NAT 経路設定: STUN ベースのホールパンチを試行。成功すれば DERP から直結 P2P にアップグレード。失敗しても DERP で動作(スループット制限あり)。
  6. データ転送: gVisor タックで TCP コネクション処理 → サーバー側でのハンドリング(ポートディスパッチ、SSH など)。

アドレス指定

ピアは WireGuard 公開鍵から派生する決定的な IPv6 アドレスを割り当てられますが、これは実装詳細であり変更可能な可能性があります。


安定性と保証

  • 無償: 利用は無料です。
  • 非保証: API や CLI の挙動、出力形式は予告なく変更される可能性があります。
  • SLA なし: アップタイムやスループットについて何らかの保証はありません。
  • サービス停止: 必要な場合、理由を問わずアクセスを停止する可能性があります。

サポートと歴史

サポート

設定やサポートで困った場合は、販売担当者に連絡してください。 お金のやり取り(製品・サービス交換)も可能です。

歴史

  • 2023 年 9 月: Tailscale コミュニティメンバーによって「derpcat」として誕生。長距離フライト中に作成されました。
  • 初期コミット:
    9e4d925cc
    (開始)、
    911915fbb
    (動作開始:"UA 605 PDX-ORD en route to Ireland. yay not buying the wifi.")。
  • 進化: tailscale.com リポジトリのフォークから、通常の Go モジュールとして再ファクタリング。
  • 2026 年 8 月: TailscaleUp カンファレンスでオープンソース化されました。

同じ日のほかのニュース

一覧に戻る →

2026/08/27 4:23

アクチニドが、高品位低濃縮ウラン(HALEU)を生産する初のスタートアップ企業となった

## Japanese 翻訳: Actinide はテキサス州ダラスを拠点とする先進材料企業であり、史上初のハイレウ(HALEU:高検査値低濃度ウラン)を製造したスタートアップとなりました。このマイルストーンは、同社の第 1 世代カルトロン(現代型の電磁式アイソトープ分離装置)を使用して達成されました。独立した ISO/IEC 17025 認定の分析室が、製造された物質の濃度をウラン -235 で 15.38% と測定しており、これは HALEU の米国法律上の定義(ウラン -235 で 5% 以上かつ 20% 未満)に適合しています。濃度調整は、実験目的のために行われた NRC(原子力規制委員会)の研究所規模の規制の下で行われ、また Actinide の主力商業製品である enrich エルビウム -176 を製造し、Oklo Isotopes に納品した機械でもありました。 Actinide の技術は、ウランヘキサフルオライド気体から固体ハイレウを直接製造することにより、米国が現在商業的に容量を持たない(DOE が 2024 年にそのような脱換化能力を構築するために 6 社に委託した)プロセスであるウランヘキサフルオライド気体を固体形態に変換する必要があるという重要な国内サプライチェーンのボトルネックを回避します。共同創設者兼 CTO のロバート・メンデルゾーン氏によると、彼らの機械は数十万ドルで済み、どこにも設置でき、数日で再構成できる一方、数億ドルをかけ、数年をかけて立ち上げること离心分離工場とは対照的です。共同創設者兼 CEO エリック・オルシェフスキ氏は依存リスクについて言及しています:2025 年には、米国 civilesian リアクター向けの濃度調整サービスの 77% は外国からの供給に頼っており、そのうちロシアからは 26%、アメリカから 23% に過ぎませんでした。 2025 年 9 月に設立された Actinide は、7 年にわたる研究とプロトタイピングの後、オルシェフスキ氏による個人投資が 100 万ドルを超えたことにより支えられ、2026 年 3 月にオント・ベンチャーズを筆頭に複数の他の投資家が参加した超過需要のシードラウンドを引き起こしました。現在同社は「Fortitude」、第 2 世代の分離装置を建設中であり、これは米国政府の現在の電磁式艦隊のアイソトープ分離能力のおおよそ半分を提供すると推定されています。これにより、 civilesian リアクター向けの燃料を安全に確保するための即時かつ拡張可能な道が開け、新たなインフラ開発が数年かかることを必要とせずに実現されます。

2026/08/26 21:59

AWS が DuckLabs を買収

## Japanese Translation: 9 月上旬、DuckLabs は Amazon Web Services(AWS)に参加し、DuckDB に AWS の長期的なサポートをもたらしつつ、そのオープンソースの性質を維持します。このユニークな枠組みの下、「Duck Stack」プロジェクトである DuckDB、DuckLake、Quack のすべては MIT ライセンスに基づいて無料でオープンソースであり続けます。知的財産権は非営利組織である DuckDB Foundation が保有し、アムステルダムのチームが管理します。この構造は、DuckDB の大規模な世界的採用(日間のダウンロード数が 100 万回超)を反映するとともに、専門家のコンセンサスである「企業傘下においてオープンソースとしての地位を維持することがプロジェクトの健全性に不可欠である」という点に対応しています。 本移行は、5 年以上前に創設された、ボトストラップ経営で創業者所有の会社としての DuckLabs の歴史に支えられています。AWS Distinguished Engineer および Vp である Andy Warfield は、同プロジェクトがより広範な影響を与えることを支援することについて熱意を示し、Peter Boncz(CWI アムステルダム/DuckDB Foundation 評議員)は、オープンソースの DuckDB に関するすべての知的財産権が/Foundation に留保されることを確認しました。University of Tübingen の Torsten Grust も、AWS の傘下に DuckDB をオープンソースとして維持する計画を受け入れることに歓迎感を表明しました。コミュニティパートナーもこの動きを称賛しており、Jordan Tigani(MotherDuck)と George Fraser(Fivetran)は、追加される勢いおよび強化されたエコシステムについて言及しています。これからは、DuckDB Foundation が技術諮問委員会を設置し、外部開発者に対しエクステンションスタックを開示することで、アクセシビリティや中立性を損なうことなくコミュニティ協力を一層深めることを目指します。

2026/08/27 2:41

未解決の 3D プリンターに関する AGPL の違反問題

## Japanese Translation: ## 概要: バンクーバーで開催された FOSSY 2026 で、ソフトウェア自由保守財団(SFC)は、3D プリンターメーカーである Bambu Lab が AGPLv3 ライセンスに対して継続的に違反していることを提示した。この件については、Bradley Kühn、Karen Sandler、Denver Gingerich の登壇者が議論を行った。Bambu Lab は PrusaSlicer の改変版を配布しており、対応するソースコードを公開せずに動的にロードされるバイナリを内蔵させていることで AGPLv3 の要件に違反している。同社は、そのネットワークベースの User-Agent メカニズムが DMCA による回避防止ツールであることを主張したが、Kühn はこれがライセンスの精神と矛盾すると反論した。ポーランドのユーザー Paweł Jarczak が関連コードをリバースエンジニアリングしたところ、Bambu Lab から DMCA による削除依頼が送られてきたが、その結果としてコンプライアンスを満たすフォーク版である OrcaSlicer が作成され、現在 SFC のリポジトリ上で"baltobu"プロジェクトを通じてミラーリングされている。Gingerich はまた、Bambu Lab が Buildroot ベースのファームウェアのソースコードを提供していない点について、一部のモデルで GPLv2 に違反している可能性も指摘した。これに対する対応として、SFC は最近、主に小額寄付から成る資金調達目標である 25 万ドルを超過し、常勤の訴訟弁護士を雇用してさらなる法的措置を取ることを決めた。登壇者は、ライセンスは自己執行されず、能動的なコミュニティによる執行、ソースコードへの消費者からの需要、そして公的な批判が不可欠であると強調した。SFC は以前、テレビにおける GPLv2/LGPLv2.1 コードに伴う同様のコペyleft 問題に関して Vizio を提訴していた。Gingerich は、Bambu Lab がツールをゼロから再実装することもできたが、大手企業で一般的であるショートカットを選んだと指摘し、Sandler は、電力格差といった根本的な原因に対処するには技術者以外の人物の関与が必要であり、それによって製品、技術、立法を改善できると結論付けた。この状況はまた、市場での優位性が主要なテクノロジー企業の厳格なライセンス義務からの例外にはならないことを示している。

Tailcat – Netcat のような動作だが、Tailscale データプレーン上で行うツールです。 | そっか~ニュース