HeadlinesBriefing favicon HeadlinesBriefing.com

Tailcat: Tailscale上のnetcat

Hacker News •
×

TailcatはTailscaleのオープンソースコンポーネントをリミックスしたもので、netcatのように動作しますが、Tailscaleのデータプレーン上で、コントロールプレーンなしで動作します。Tailscaleのデータプレーン(内部的にmagicsock)は、2台のマシン間でWire Guard®暗号化されたポイントツーポイントトンネルを提供し、DERPはNATホールパンチングの通信サイドチャネルとして、またNATトラバーサルが失敗した場合の最後のリレーとして機能します。Tailscaleのコントロールプレーンを使用する代わりに、すべてのtailcat接続メタデータは帯域外で交換されます。tailcat CLI(cmd/tailcat内)は、tailcat Goライブラリ(github.com/tailscale/tailcatとしてインポート可能)上に構築されています。

tailcatをCLIツールとして使用するかライブラリとして使用するかにかかわらず、一方の側がtailcatサーバー(リスナー)を実行し、短い接続トークンを取得します。もう一方の側はそのトークンをtailcatのクライアント側に渡して接続します。両者間のすべてのトラフィックはWire Guardでエンドツーエンドに暗号化されます。初期接続はTailscaleのDERPリレーネットワークを介してブートストラップされ、その後magicsockがNATトラバーサルを実行して、可能な場合(通常!)直接のポイントツーポイントUDP接続にアップグレードします。

Tailscaleアカウントは不要で、マシンへのroot/管理者アクセスも不要です(ルーティングテーブルやDNSなどを変更しません)。これは単なるユーザースペースライブラリとCLIツールです。そしてすべてオープンソースです。当社の無料のレート制限付きDERPリレー(デフォルトのDERPマップはhttps://tailcat.dev/derpmap.json)を使用するか、独自のものを実行できます。

使用法:2台のマシン間でstdin/stdoutをパイプします。サーバーが起動し、一時的なアドレスを出力します:$ tailcat # 選択されたブートストラップリレーリージョン302、サンフランシスコ # サーバーが新しいアドレスで待機中:tcom Fw WCCcj S5n KNq Aod034n Wo JZW0LZq Dhh C8U_d Kdn DRYQ8u NGFp GQEu(ハングして待機中...)そしてクライアントは:$ echo hello | tailcat tcom Fw WCCcj S5n KNq Aod034n Wo JZW0LZq Dhh C8U_d Kdn DRYQ8u NGFp GQEu $ その後サーバーがブロック解除されます:$ tailcat # 選択されたブートストラップリレーリージョン302、サンフランシスコ # サーバーが新しいアドレスで待機中:tcom Fw WCCcj S5n KNq Aod034n Wo JZW0LZq Dhh C8U_d Kdn DRYQ8u NGFp GQEu hello $ トンネルを介してローカルポートを公開するまたは、ローカルTCPポートを提供し、localhostに転送できます:$ tailcat --serve=8080,8443 # または --serve=all # サーバーが新しいアドレスで待機中:tc XXXXXXXXX そしてクライアント:$ tailcat tc XXXXXXXXX 8080 GET / HTTP/1.1 Host: foo HTTP/1.1 200 OK.... 認証なしSSHサーバーLinuxおよびmacOSでは、認証なしのSSHサーバーも実行できます。(認証が必要な場合は、tailcat --serve=22を実行してシステムSSHサーバーにプロキシできます)$ tailcat --serve=no-auth-ssh # サーバーが新しいアドレスで待機中:tc XXXXXXXXX クライアント側:$ tailcat ssh tc XXXXXXXXX $ tailcat ssh tc XXXXXXXXX ls -la その他のコマンド接続をテストするためのping。各pongはDERPリレー経由か直接パスかを報告します。--until-directは直接パスが機能するまでpingを続け(最大--timeout、デフォルト10秒)、機能しない場合は非ゼロで終了します:$ 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 <token> curl http://server.tailcat:8081/ トークンはURLホスト名として直接機能します:SOCKSプロキシがそれらを認識してダイヤルするため、トークン引数はオプションです。(トークンは大文字と小文字を区別します。これはcurlやほとんどのCLIツールで機能しますが、ホスト名を小文字にするブラウザでは機能しません。)$ tailcat socks curl http://<token>:8081/ クライアントがサーバーのネットワークに到達できるように出口ノードとして機能:$ tailcat --serve=exit-node 接続トークンを解析し、その内容(サーバーのWire Guard公開鍵とDERP情報)をJSONとして出力します。何にも接続せずに:$ tailcat parse tcom Fw WCCcj S5n KNq Aod034n Wo JZW0LZq Dhh C8U_d Kdn DRYQ8u NGFp GQEu {"Server Public": "nodekey:9c8d2e6728da80a1dd37e275a82595b42d9a838610bc53f74a7670d1610f2e34","Region ID": 302} 短いトークン(IDでDERPリージョンを参照し、クライアントがDERPマップを取得する必要がある)を、DERPサーバー情報が埋め込まれたより長い自己完結型トークンに解決します...