Dumb Pipeの正体!NATを突破し接続を維持するシンプルすぎるネットワーク術
引用元:https://news.ycombinator.com/item?id=44701555
これ、ssh
(socat
かmkfifo
を使って)でもできるぜ。
レシーバーではsocat UNIX-RECV:/tmp/foobar - | my-command
、
セーダーではmy-command | ssh host socat - UNIX-SENDTO:/tmp/foobar
って感じ。
ターゲットがファイアウォールやNAT
の裏にいても、ssh-j.com
みたいなパブリックなSSH
サービス経由でリレーできるんだ。これ、SSH
の中にSSH
だからエンドツーエンドで暗号化されてるぜ。
元の投稿は「beam」のスレッドhttps://news.ycombinator.com/item?id=42593135
だよ。
これ、「Dumb Pipe」が謳ってることのほとんどできてないね。QUIC
使ってないし、可能な時にリレーを使わないこともないし、自分でリレーを選んでくれないし、ネットワーク接続が変わってもデバイスの接続を維持しないし。
あと、ssh
のキー管理はアウトオブバンドでやらないといけないけど、「Dumb Pipe」はキーをランダムなASCII文字列に入れるみたいだね。WireGuard
の方が近いよ。
WireGuard
もほとんどそういうことできないよ。
確かに、いくつかだけだね。
このトピックのリンクを辿ったら、最初の文にこうあったぜ。「Dumb Pipeはオンザフライのノード識別子を使ってNAT
を突破するぜ。ネットワークの状況が変わっても、マシンを接続し続けるんだ。」
もっとシンプルにするなら、https://www.tarsnap.com/spiped.html
でspiped
を動かす手もあるぜ。これ、ssh
すら前提としてないんだ。
iroh
も似たような感じだね。
WireGuard
サーバーを立てて、両方のクライアントをそこに接続させて、2つのIP
間でデータを渡すこともできるぜ。NAT
があってもなくても、結局は中央のリレーがデータをやり取りすることになるけどね。
最近WireGuard
で何度か痛い目見たから、もう使う気になれないんだ。もっと魔法みたいなことはいらない、Linuxだと特に、難解なip table
のルールセットはごめんだね。
OpenVPNやIPSec、WireGuardを運用した経験から言うと、WireGuardってすごく普通なんだよね。IPSecの設定なんて、電話で呪文みたいな設定を何度も唱えないといけないからゾッとするよ。違う実装のIPSec同士だと、動かないこともしょっちゅうで、結局どっちかのパラメータが間違ってるってわかるんだ。VPNのトラフィックをIPTablesやnftablesで手動ファイアウォールするのは嫌だけど(ダサいよね)、最近ufwやfirewalldにルーティング管理機能が追加されたのは嬉しいね。
うん、IPSecの初期設定とトラブルシューティングはマジで悪夢だよね。僕もみんなと何時間も格闘したよ。WireGuardは本当にシンプルで新鮮だね。設定項目も少なくて間違いにくいし。「すべてのエンドポイントがピア」っていうメンタルモデルを理解するのに少し時間かかったけど、それさえわかれば超簡単だったよ。
WireGuardって他の選択肢よりずっとシンプルだよね。IPSecはもうサイアク。
WireGuardでどんな目に遭ったのか興味あるね。何が期待外れで、WireGuardのせいで失敗したことってある?俺は何年も使ってるけど安定してるし、OpenVPNより管理が楽だったよ。UDPポート1つしか使わないのに、IPtablesのルールが複雑になるってコメントには疑問だね。(OpenVPNは当時もすごかったよ。2000年代初め頃、会社の営業担当が外出先から仕事できるって喜んでたな)
「WireGuardでどんな目に遭ったのか興味ある?」
俺の場合だけど、Tailscaleと同じくらい簡単にセットアップできると期待してた。同じ技術じゃないのはわかるけど、難易度が近いと思ってたんだ。
でも、WireGuardは何日も格闘してもシンプルなケースですら動かなくて、Tailscaleは5分で動いたよ。
これってLinuxのネットワーキングに何十年もつきまとってるパターンだと思う。ネットには「この人の設定ファイルは昔動いたらしい」みたいな情報ばっかで、みんな理解せずにそれをコピペしてるんだ。検索エンジンはもう、そういう古い情報の海に沈んでて、たとえ完璧なガイドがあったとしても見つけられないくらいだよ。あと、こういうネットワーク技術ってエラーメッセージや診断が最悪なんだ。たった1文字の間違いで動かないのか、それとも根本的にアプローチが間違ってて全然動く見込みがないのか、誰も教えてくれない。結局、全部黙って動かないだけなんだからさ。
あ、間違えた。WireGuardじゃなくてTailscaleのことだった。TailscaleはDNSルックアップを変えたり、大量のiptablesルールを追加したり、あと残念なことに変更ログなしで機能をぶっ壊したこともあるんだ(セキュリティ上の理由らしいけど)。
WireGuardは公開鍵や秘密鍵、IPアドレスの管理にちょっと手間がかかるけど、余計な「魔法」が少ないんだよね。最近は本当に、ただ動いてくれるシンプルなものがいいって思うよ。
君が説明する方法だと、ホストにアクセスできるSSHポートが開いてなきゃダメだよね。QUICとNATホールパンチングなら、これを回避できるんだよ。
SSHサーバーとオープンポートが必要になるし、プロトコルも違うんだよね。
あのHNコメントを持ち出す人、ちゃんと調べてくれよ。あれはHN全体の反応じゃなくて、特定の丁寧なコメント主の話だ。返信後には譲歩もしてたし、コミュニケーションの良い例なんだ。けなすより褒めるべきだぜ。
まだあのコメントにリンク貼ってる奴は、ただの荒らしだよ。
でも、俺が最初に思い出したのは、やっぱりあのHNコメントだったよ。
“modicum of research”だって?冗談だろ。あのコメントが持ち出されるのは、それがHNコミュニティをステレオタイプ化してるからさ。彼は失礼じゃなかったんだ。落ち着けって。
このプロジェクトが役立たずだなんて言ってない。君が持ってるツールでできる別の方法を提案しただけだ。落ち着いてくれよ。Irohは本当にクールなんだぜ。
“このプロジェクトは役立たずだなんて言ってない”
BrandonMもそうだよ: https://news.ycombinator.com/item?id=42394739
ちょっと関係あるけど、AからBにファイルを送る(ほとんどブラウザベース+一部はセットアップ不要なCLI)ツールのリストを持ってるんだ。[1]こういう話題が出ると、もっとツールを探すためにこのリストをシェアしてるんだよ。
[1]: https://gist.github.com/SMUsamaShah/fd6e275e44009b72f64d0570…
自分のデバイス間でサクッと送れるLocalSendがめっちゃ好きだね。どのOSでもちゃんと動くんだ。
https://github.com/localsend/localsend
iOSはBluetoothで画像や動画ファイルをWindowsみたいな受信機に送れないってAppleが言ってるんだけど、もしLocalSendがiOSとWindowsで動くなら、LocalSendで写真が送れるのかな?https://support.apple.com/en-ca/120267
動くはずだよ、まだ試してないけどね。それはiOSの制限じゃなくて、Apple自身の同期アプリやプロトコルの制限だよ。LocalSendは、俺が知る限り、ネットワークデバイス発見機能付きのHTTPクライアント/サーバーだからさ。
うん、いつも使ってるよ。でも、両方のデバイスが同じネットワーク(LAN/WiFi)にいる必要があるね。LocalSendはBluetoothは使わないんだ。
最近、俺の注意を引いたプロジェクトがあるんだ。色々なプロトコルに対応してて、色々なウェブブラウザ(IE6も!)で動くって言ってるし、セットアップも超簡単(Pythonファイル一つだけ)らしいよ。まだ試してないけど、共有したいな。https://github.com/9001/copyparty
Dumb Pipeの裏にいる同じチームが作ってるsendmeってやつ、このユースケースにもっと近いんだよ!https://github.com/n0-computer/sendme
もっとコメントを表示(1)
誰かが製品を”Dumb”って呼ぶたびに、俺はちょっとワクワクするんだ。たいていそれは実は賢いってことだからね。インターネットは君を監視して靴下を売ろうとする”Smart”なもので溢れてる。たまには、説明通りのことだけするパイプが欲しいんだよ。俺のデータを運んで、黙ってて、母親の旧姓なんて聞かないでくれ。
”Dumb”は今や「君のデータは盗まない」って意味だね。
今日、生のPOSIXネットコードを書いてたんだけど、多くの変数が”socket”を”sock”に短縮してるんだ。そしたら脳が「やばい!これは俺たちに特別な”sock(et)”を売りつけようとしてるぞ!」ってなったよ。
同じ理由で、すごく面白いダジャレだと思ったよ。
でも、彼らが君のデータで学習できるようなエンタープライズ対応のAI機能はどうなの?
USBケーブルでPC同士を直接つないでファイル転送できないのってなんでだろうな?標準になってほしいよ。USB-A同士は無理でも、USB-Cならできるはずだし。AndroidとPCならできるのに、PC同士じゃできないのは不思議だよな。
TCP/IPが標準になってから、イーサネットクロスオーバーケーブルでPC間のファイル転送をしてたんだ。USBメモリがなかった頃の話ね。最近はイーサネットポートがないPCも増えて、クラウド利用を促してるみたいだけど、クロスオーバーケーブルは今でも使えるよ。USB-to-EthernetアダプタがあればポートがなくてもOK。TCP/IPさえあれば、特別なソフトやルーター、ネットも不要なんだ。
「今、イーサネットポートが多くのPCからなくなってる」って話だけど、Wi-Fiでアドホックネットワークを組めばいいんじゃないかな。
君が言ってる技術って、Nintendo DSですら無線でできたんだぜ。この問題は40年間で何百通りも解決されてきたのに、一部の奴らはクラウドサービス抜きじゃ解決したがらないのさ。「Dumb Pipe」も同じ問題にぶつかるだろうね。Windowsユーザーに50MBのファイルを送る時、Linuxユーザーが送れる方法じゃ、Windowsユーザーは特別なソフト入れないと受け取れないんだから。
アドホックはできるけど、ゼロからやるのはほぼ無理だよ。ネットに繋いでやり方をダウンロードしないといけないから、それじゃ意味ないだろ?それに、Wi-Fiの電波が届く範囲じゃないとダメだしな。
USB-C (USB4 / Thunderbolt) を使えば、PC同士を繋いでネットワーク接続できるんだぜ。デフォルトはLink-Localアドレスだから、SSHとかだとちょっと面倒だけど、ネットワーク探索を使うならスムーズに動くはずだ。詳しくはここを見てくれ: https://christian.kellner.me/2018/05/24/thunderbolt-networki… または https://superuser.com/a/1784608
「40年間で何百通りも解決された」って言うけど、E2EEとGoogleに依存しないって条件を加えたら、WebRTCのP2Pファイル転送のほとんどは対象外になるぜ。WebRTCってGoogleのSTUN/TURNサーバーをコピペしてるだけだからな。ISPがIPv6でNATを廃止するはずなのに、俺のISP (Verizon Fios) はIPv6ファイアウォールをデフォルトで有効にしてて、受信パケットをブロックするんだ。これじゃ実用的じゃないだろ。
昔はパラレルポートでPC同士を繋げたんだぜ。俺、Windows 95をラップトップに再インストールするのに一回やったことある。すっげー遅かったけど、ちゃんと動いたよ。
Starlinkってルーターを回避しないと公開IPv6がもらえないんだ。接続が時々切れるから、pfsenseとかopnsenseみたいなののインストール中に失敗すると最初からやり直しになっちゃう。ipcopやmonowallはIPv6に対応してないみたいだし、自分でルーター組む時も、どのOSもIPv6ルーティングを簡単にしてくれないんだよな。Debianでも無理だったし、IPv6はマジで謎だわ。
店でOS入りのPCを2台買って、一度もネットに繋いだことないってか?完全にエアギャップされてて、ネットで調べることもできないって言うのか?そんなの信じられないね。
デフォルトだとリンクローカルアドレスしか割り振られないよ。
USB4のネットワーク機能って、イーサネットでPC同士を繋ぐのと一緒だね。ソフトからはイーサネットNICみたいに見えるけど、下のレイヤーのプロトコルが違うってことらしい。
Starlinkはルーター回避しないとIPv6を公開してくれないって。公開IPないとマジでインターネットに繋がってると言えんの?
IPv6の管理、自作ルーターとかDebianで試したけど、マジで難しすぎる。VMでIPCopのガイド書いた俺でもIPv6はわかんねえ。たぶんv6フォワーディング有効にするだけでしょ。RAやDHCPはいらないと思うし、それは上流任せでしょ。
クロスケーブル、ここに売ってるよ!
なんか言い方が紛らわしいけど、そうなんだよな。PCが繋がってない間は実質エアギャップ状態だね。macOSでアドホックWi-Fiの設定を探したけど見つからん。ネット検索してみたけど、「Create Network」なんてオプションは幻だったわ。結局、Macじゃアドホックネットワーク作るのって超難しいし、ネットがない状況で必要になっても無理っぽい。
これってLaplinkが先駆けなんじゃないかな。
https://en.wikipedia.org/wiki/Laplink
Starlinkで公開IPv6使うには、割り振られた/56を/64に細かく管理しないとダメなんだって。市販ルーターで試したら、DHCPv6のPDができれば全部いけた。ルーター高かったから返品したけど、いつかVMでやろうと思ってる。
LinuxならMTPエンドポイントを作ればできるよ、スマホみたいにね。
https://github.com/viveris/uMTP-Responder
MicrosoftもWindows CE用に持ってたみたい。
https://www.microsoft.com/en-us/download/details.aspx?id=933…
「イーサネットポートが消えたのはクラウドを使わせる陰謀だ」って意見、それ陰謀じゃねーよ。
ここ10年使ったラップトップは全部イーサネットポートより薄いし、デスクトップには普通に付いてるだろ。みんな薄いPCの方が好きだし、俺のMacBook Airも薄くて最高。ほとんどの人にとってイーサネットポートなんていらねえんだよ。
USBはホストとデバイスがあって非対称だよ。デバイスはスレーブとして扱われるし。PC同士を繋ぐ有線接続なんて、USBよりずっと昔にイーサネットで解決済みだったじゃん。
LinuxだとNetworkManager使えばマジで楽勝だよ。他のOSにも簡単なホットスポット機能とかあるんじゃないの?
ネットワークの仕組みを分かってないね。インターネット接続があればマシンをネットワーク化できるって?話にならないよ。
もう終わりだ。
FireWireがそうだったと記憶してるな。新しいMacを買う時、ケーブル1本で繋いでデータ転送できたんだ。
AppleのMacはTarget Disk Modeにできるよね。ホストコンピュータがMacの中身をただのディスクドライブみたいに扱えるんだ。
クロスLANケーブルのこと?それともBluetooth?ローカルWi-Fi(直接接続かどうかも含めて)のこと言ってる?
最近のNICのほとんどは、”オートクロスオーバー”って機能があるんだって。状況を自動で検知して、NIC自身がクロスオーバー処理してくれるから普通のケーブルで大丈夫だよ。
もっとコメントを表示(2)
最近のオンラインヘルプの忘れられ具合に不満だったんだけど、macOSはオフラインドキュメントが全くないし、Wi-Fiオフだとユーザーガイドも使えない。
さらにアドホックWi-Fiの設定がGUIから消えてCLI必須になってる。現代のテック企業が高速ネット前提にしてるの、本当に嫌だわ。
Pairdrop.netがいいよ。何もインストールしなくていいし、同じLAN内にデバイスがあればローカルネットワーク経由で転送できるよ。
XmodemやZmodemとかは?
現代のテック企業が高速インターネット接続前提でいるのは、おそらく意図的だと思うな。特にその会社がクラウドサービスも売ってたらね。
https://www.xda-developers.com/reasons-wi-fi-never-better-th…
irohの世界ではNodeIdっていう鍵でノードを識別するけど、俺のネットワークスタックはTCP/IPしか話せないんだ。だから、その公開鍵を接続できるホストとポートに解決する必要があるわけだね。これってDNSとだいたい同じ用途じゃん?しかもDNSは人間にも分かりやすいドメイン名で、世界中のネットワークエンジニアが管理してる。このシステムは独自の解決システムを作ってるみたいだけど、作者は「好きなの使っていいよ!」って感じでその部分を軽く見てる気がする。でも、この手のシステムにとって、ノード発見って全部だよ!それが唯一の難しい問題なのに。そこを無視したら、そりゃコンテンツアドレスなP2Pネットワークなんて簡単に作れるよね。IPFSを見れば分かるじゃん。
ノード発見にはDNSも使うよ。でも、pkarr.orgを使う選択肢もあって、それはBittorrentのメインラインDHTを使ってるから完全に分散化されてるんだ。他の人が言ったように、チケットには直接IPアドレスも入ってるから、同じプライベートサブネット内や公開されてるノード同士なら発見の必要はないんだ。あと、リレーのURLも入ってるから、リスナーのIPが変わったりNATの裏にいても、同じ地域にいる限りDumbpipeはノード発見を使わなくて済むんだよ。
pkarr.org経由でBittorrentのメインラインDHTにアクセスするなら、それは明らかに分散化されてないでしょ?そのサーバーがクライアントが信頼を委ねる中心点になっちゃうんだから。
実際、Dumbpipeが提供する“チケット”には、君のマシンのIPとポート情報が入ってるんだ。だから、チケットを使う状況では、発見インフラなしでも2台のマシンは接続できると思うよ。(UPnPとかが有効になってればね。)irohのドキュメントも見てみて。https://www.iroh.computer/docs/concepts/discovery
./dumbpipe listen
ってやると出るnodeecsxraxj...
ってやつは、クライアントが接続するのに必要なIPアドレスとかが入ったデータ型をシリアル化したものなの?バカな質問かもしれないけど、もしそうなら、このサービスのウリって何?単にIPアドレスとか公開鍵を一つの識別子にまとめただけってこと?
チケットのウリは、チャットとかにコピペしやすい単一の文字列ってこと。それに、安定したテキストエンコーディングだから、しばらく互換性も保つようにする予定だよ。チケットの中身を正確に見られるツールもあるんだ。https://ticket.iroh.computer/
URLだってコピペしやすい単一の文字列じゃん。俺が知りたいのは、これらの文字列がどうやって接続できるものに解決されるかってことだよ。解決するためにリレーを通る必要があって、そのリレーがDNS名で指定されてるなら、普通のURLと大して変わらないよね。もし文字列に直接IPが埋め込まれてるなら素晴らしいけど、IPは一時的だから文字列は安定しないし、エンドユーザーにとっては識別子として役に立たないじゃん。もし文字列が時間とともに異なるIPに解決される値(DNSエントリみたいに)を表すけど、異なるチャネル(リレー、ブロックチェーン、mDNSなど)経由で解決できるなら、その文字列は解決された「方法」と「いつ」の文脈でしか意味を持たないよね。もし「abcd」をアリスとボブに共有して、アリスはあるリレーシステムで、ボブはmDNSで解決したら、全く違う結果になるでしょ?そしたらその文字列って何のためにあるの?
ウリは、Dumbpipeが暗号化、再接続、UPnP、ホールパンチング、リレーなんかを全部処理してくれることだよ。たとえばnetcatじゃ、こんなに簡単に複製できないよ。
ngrokやTailscaleとか、他の多くのサービスもこれらの機能を提供してるよね。このDumbpipeの唯一ユニークな点は、不透明な文字列識別子と“分散化”っていう概念みたいだけど、特に発見の仕組みがどうなってるのか知りたいんだ。
このプロジェクトとTailscaleってどれくらい再実装してんのかな?ニーズは共通してるみたいだしさ。NAT突破する低レベルライブラリって他にもあるはずだけど、もしかしてこれが初めてのやつとか?
もうそんなことどうでも良くね?Tailscale自体がNebulaとかTincみたいな先行例がある中で、同じアイデアの600番目の再実装だよ。WireGuardが流行り始めた良いタイミングで出てきて、VCマネーで広告に何百万もぶち込んだんだろ。コミュニティの競合にはできない芸当だね。
Tailscaleが発明したと勘違いしてる奴が多いけど、ZeroTierやHamachi、多くのFOSSや学術研究が先行してるんだぜ。オーバーレイネットワークもVPNもP2Pも暗号アドレスも新しくない。彼らは良いUXと簡単なオンボーディング、それに安価な時に調達した巨額のマーケティング予算で成功したんだ。最近10年で本当に新しいのはLLMだけだな。ちなみに俺はZeroTierの創設者。俺らは産業分野に移行したが、無料で使えるし今も成長中だよ。Tailscaleには悪感情はないよ。P2Pは誰も独占できないし、彼らとはUXやターゲットが違うからね。この記事の「Dumb Pipe」ツールはZTやTSとはまた違うクールなツールで、異なるユースケース向けだ。インターネットがクライアント-サーバーになったのは最悪だけど、いつか修正されるって楽観的に見てるよ。
TailscaleってWireGuardのラッパーに、ちょっとホールパンチング機能が付いてるだけじゃないの?
うん、WireGuardとWebRTCを使ってるよ。Tailscaleの本当の機能は、デバイスがどこにあるか気にせずに接続できることだね。
TailscaleにWebRTCはないよ。
これはirohを使って作られてるよ。irohは分散ソフトウェア向けの低レベルフレームワークを目指してて、ネットワーキングだけじゃなく、ネットワークノード間の複製や一貫性を可能にする色々なデータ構造も扱えるんだ。
Tailscaleってすごく宣伝されてるけど、調整サーバーをフルでセルフホストできるオプションがあるんだよね。そっち(iroh)にはそういう機能あるの?
irohはこういうライブラリになることを目指してるんだよ。でもirohより前からlibp2pっていうのもあるんだ。
DERPサーバーってWebRTCにちょっと変更加えただけじゃないの?