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

ダムパイプ

概要

dumbpipe は、アカウント登録や設定不要で、2台のコンピュータ間に Unixライクなパイプ を作成できるツール。 インストールは 1行コマンド で完了し、接続もシンプル。 セキュリティキー を利用してデータ送受信を実現。 どこにいても データ転送が可能。 curl と組み合わせて使える利便性。

dumbpipeによるシンプルなクロスコンピュータパイプ

  • dumbpipe は2台のマシン間で パイプ通信 を実現するツール
  • アカウント登録や複雑な設定が不要 な点が特徴
  • インストールは以下の ワンライナー で実行
    • curl -sL https://www.dumbpipe.dev/install.sh | sh
  • 2台のマシンにインストール後、片方で listen コマンドを実行
    • 例:./dumbpipe listen --key 23ryys7pgvjrr57pcrvyivdrhvqyykg2tv3leou5grm66xfd7zzq
  • 実行後に表示される 接続用コマンド をもう一方のマシンで利用
    • 例:./dumbpipe connect nodeecsxraxjtqtneathgplh6d5nb2rsnxpfulmkec2rvhwv3hh6m4rdgaibamaeqwjaegplgayaycueiom6wmbqcjqaibavg5hiaaaaaaaaaaabaau7wmbq
  • データ送信は パイプ で簡単に実現
    • 例:echo "hello" | ./dumbpipe connect ...
  • どのような場所でも 接続可能な柔軟性
  • NAT越えファイアウォール越え も自動対応
  • セキュリティキー による安全な通信確保

dumbpipeのユースケースと利点

  • ファイル転送標準入力/出力のリダイレクト に最適
  • SSHやSCPの代替 として利用可能
  • 一時的なデータ共有スクリプト連携 に便利
  • インターネット経由 でのシンプルなデータパイプライン構築
  • 追加のアカウント作成やサーバー設定が不要 な手軽さ

Hackerたちの意見

これとTailscaleの間にはどれくらいの再実装があるんだろう?共通のニーズがたくさんありそうだし。NATを通過するための低レベルのライブラリはもうあると思うけど、もしかしたらこれがそのライブラリの最初のものなのかもね!

これはirohを使って作られていて、分散ソフトウェアのための低レベルフレームワークを目指してるんだ。ネットワーキングも含まれてるけど、ネットワークノード間のレプリケーションや整合性を実現するためのさまざまなデータ構造もあるよ。

irohがそのライブラリになる予定だけど、irohの前にlibp2pもあったよね。

TailscaleってWireGuardのラッパーじゃない?他にもいくつかのホールパンチの仕組みがあるみたいだけど。

重なりはあるけど、補完的な使い方も見えるね。同じSTUN系の技術をいくつか使ってるし。TailScale(やsocat)を使うのをやめるつもりはないけど、今はこれも毎日使ってると思う。

Tailscaleでモバイルやcignatの電話をつなぐのは、今までのソフトウェアの中で数少ない「アハ!」な瞬間の一つだよ。

もう誰も気にしないよね。Tailscale自体は同じアイデアの600回目の再実装で、前のものにはnebulaやtincがある。彼らはタイミングよく登場して、WireGuardが注目されてる時に、広告に何百万も投資したけど、コミュニティの「競争相手」はほとんどがVCマネーに頼ってないから、そんな予算がないんだよね。

Irohはアプリケーション層にすごく向いてるよ。同じ接続上で複数のQUICストリームを多重化できて、それぞれ特定の目的に使える。必要なのはQUICへのアクセスだけで、仮想ネットワークインターフェースはいらないんだ。gRPCに似てるけど、各バイトストリームをコントロールできて、例えば音声通話用に1つ使いながら、別のストリームでファイル転送、さらに別のストリームで簡単なRPCを使うことができるんだ。

pico.shではSSHを使って似たようなものを作ったよ:https://pipe.pico.sh

dumbpipeに対する直接的なベンチマークで、結果はどうなると思う?

年に1回か2回、こういう解決策が出てくるよ。接続をオーケストレーションするのにぴったりなものがあるよ:https://docs.spacebrew.cc/

「2023年には…」

それが本当だとしても、このプロジェクトのブランディングは無敵な気がする。まさにおかしな腕を持ったダムパイプのキャラ。とにかくうまくいってる。

Wireguardとnetcatの違いってどれくらいあるんだろう。どちらもUDPで暗号化されたチャンネルを使ってるけど、なんか違うみたい。QUICはWireguardにない何を提供してるの?

QUICにはピアアドレス発見のための標準が含まれてるんだよね:https://www.ietf.org/archive/id/draft-ietf-quic-address-disc... Wireguardにはそれがないから、tailscaleがあんなに人気になったんだと思う。基本的にそれを核にしてるし、いろんな補助機能もついてるし。もし俺が間違ってたら、Wireguardの発見/リレーサーバーを見せてよ。それに、QUICは言語に依存しないんだ。Wireguardのユーザースペース実装はGoで書かれてるけど、CのFFIバインディングができないから、抽象化が「Wireguardデバイス」を扱うことに関しては難しいんだよね。「単一のダンプパイプ」じゃないから、Wireguardのユーザースペースライブラリは、tunデバイスやゲートウェイ、IPアドレス管理などの余計なものを持ち込まないと、このシンプルなことを実装するのが意外と難しい。もしすでにしっかりしたWireguardのセットアップがあるなら、もちろんこれを使う必要はないし、socatとかを使えばいいよね。

Wireguardはトンネリングプロトコルだよ。netcatはソケットを通じてデータを書き込むことができる。でも、netcatはUDPモードで全てのパケットが届くことを保証するメカニズムを実装してないから、信頼性のためにTCPをUDPでトンネリングする必要がある。QUICは全てUDPで、暗号化や失われたパケットの再送、順番が違って届いたパケットの再配置を処理する。QUICの目的は、ファイルを素早く転送できるようにすることなんだ。WireGuardは送信しているデータを知らないし、netcat+TCPは全てのパケットを順番に送信して確認するという制限に縛られてる。

Wireguardは接続内の独立したストリームについて不透明なんだ。だから、両者とも一つの接続で複数の同時ストリームをカプセル化できるけど、QUICはヘッドオブラインブロッキングを軽減したり、トランスポート層での暗号化を管理したりできる。さらに、これらのサブストリームには接続IDを使っていて、ネットワークの変更に対する移行をスムーズにしてるんだ。

どちらもUDP上で動作して、常にデータを暗号化するんだ。その表面的な類似性を超えて、全く異なるものだよ。QUICはストリーム抽象を提供するトランスポートプロトコル(TCPのようなもので)、TCPに対するいくつかの改善点(同じ接続上でのストリームの多重化をサポートして、ヘッドオブラインブロッキングの問題がない)を持ってる。WireguardはNICとして機能するネットワークインターフェースの抽象を提供するんだ。WireguardのNICの上でTCPを動かすこともできるし(QUICでも同様に)。

ちょっとお知らせ、リレーのドキュメントへのリンク(https://www.iroh.computer/docs/layers/connections)をクリックしたら404が出たよ。

https://www.iroh.computer/docs は動くよ。

これ、ありがたい!dumbpipe.devのリンクが今更新されてるよ!

教えてくれてありがとう!修正したよ: https://github.com/n0-computer/dumbpipe.dev/pull/11

irohは素晴らしい技術だよ。2週間前にベルリンのweb3サミットでRüdigerのワークショップに参加したんだけど、めっちゃ刺激を受けた。こんなものを作るためのコードはここにあるよ https://github.com/rklaehn/iroh-workshop-web3summit2025 それに、スライドもチェックすることをおすすめするよ :)

これ、ssh(とsocatやmkfifo)でもできるよ:

受信側

socat UNIX-RECV:/tmp/foobar - | my-command

送信側

my-command | ssh host socat - UNIX-SENDTO:/tmp/foobar ファイアウォールの背後にいるターゲットやNATの影響を受ける場合は、他のSSHサーバーを経由して中継できるよ(例えば、公共サービスのssh-j.com)。これはエンドツーエンドで暗号化されてる(SSHの中にSSH):

受信側

ssh top-secret@ssh-j.com -N -R ssh:22:localhost:22 socat UNIX-RECV:/tmp/foobar - | my command

送信側

my-command | ssh -J top-secret@ssh-j.com ssh socat - UNIX-SENDTO:/tmp/foobar (元々は「beam」のスレッドに投稿されたものだよ:https://news.ycombinator.com/item?id=42593135)

ssh-j.comのこと、知らなかった!面白いね。

https://github.com/anderspitman/awesome-tunneling - こんなトンネリングツールに興味がある人にはおすすめだよ。

これ、https://docs.pears.com/tools/hyperbeamを思い出すな。

すごく便利だね。うちでは、これを元にした産業用のバリアントをRelayKitで開発したんだ。スケールに合わせたフィールドデバイスのフリート向けで、AnycastやmTLS、単一トンネルを通じたサービスのマルチプレクシング、独自のPKIを持ち込める機能とか、他にもフリート管理機能があって、ちょっと賢いパイプになってるよ: https://farlight.io