- Rayfish का पहला रिलीज़ ऐसा है जो बिना सर्वर या अकाउंट के यूज़र डिवाइसेज़ के बीच P2P mesh VPN बनाता है, और नेटवर्क स्टेट को मेंबर्स द्वारा रखे गए signed records के रूप में बनाए रखता है
- central control plane को हटाकर, कंपनी अकाउंट, ऑपरेटर, या हमेशा चालू रहने वाले coordination server के बिना भी join होने के बाद नेटवर्क चलता रहता है
- Iroh v1 encrypted QUIC connections, NAT traversal, hole punching, और direct path न होने पर relay fallback संभालता है, जिससे यह रिलीज़ संभव हुई
- अभी यह एक साथ कई isolated networks में शामिल होना, invite code और approval-based joining, Magic DNS, per-device firewall, declarative fleet provisioning, 1:1 connections, और file transfer देता है
- maturity और throughput में यह Tailscale से पीछे हो सकता है और यह SDK भी नहीं है, लेकिन इसका फोकस उन मामलों पर है जहाँ central party के बिना private network चाहिए
Rayfish जिस समस्या को हल करना चाहता है
- Rayfish डिवाइसेज़ के बीच private network बनाने वाला P2P mesh VPN है
- यह बिना किसी बीच के सर्वर या लगातार भरोसा करने लायक कंपनी के काम करता है
- यूज़र्स को keys मिलती हैं, डिवाइसेज़ उन्हीं keys से एक-दूसरे को खोजते हैं, और बना हुआ नेटवर्क उसके अंदर के लोगों का होता है
central control plane हटाने वाली डिज़ाइन
- कई modern VPN किसी कंपनी द्वारा चलाए जाने वाले control plane पर निर्भर होते हैं
- कंपनी तय करती है कि नेटवर्क में कौन सदस्य होगा और कौन-सी policies लागू होंगी
- डिवाइसेज़ के communicate करते समय भी कंपनी flow के बीच बनी रहती है
- अगर कंपनी बंद हो जाए, दाम बढ़ा दे, या ग्राहक संबंध खत्म कर दे, तो private network को पूरी तरह यूज़र के स्वामित्व में बनाए रखना मुश्किल हो जाता है
- Rayfish accounts और central operator को हटाता है
- network state एक signed record है जिसे कोई भी member दूसरे member तक पहुँचा सकता है
- Rayfish बनाने वाले लोग गायब हो जाएँ तब भी मौजूदा networks चलते रहेंगे
एक डिवाइस पर कई networks को संभालने का तरीका
- Rayfish इस मान्यता से शुरू होता है कि यूज़र सिर्फ एक flat network इस्तेमाल नहीं करते
- एक डिवाइस एक साथ friends, side projects, और work networks का हिस्सा हो सकती है
- implementation एक process और एक virtual interface के पीछे काम करती है
- हर network एक-दूसरे से isolated रहता है, और यूज़र जिन सभी networks में शामिल हैं उनके औपचारिक member होते हैं
Iroh v1 ने यह रिलीज़ कैसे संभव बनाई
- Rayfish transport layer के कठिन हिस्से Iroh को सौंपता है
- peers के बीच encrypted QUIC connections
- NAT traversal
- hole punching
- direct path न होने पर relay fallback
- Iroh v1 ने build के दौरान transport layer के हिलने-डुलने से बचाने वाली वह stability दी जिसने यह रिलीज़ संभव की
- अगला काम शुरुआती tools को इस स्तर तक निखारना है कि उन्हें production में बिना झिझक चलाया जा सके
Field Technologies से निकला spin-off
- Rayfish high-frequency trading कंपनी Field Technologies से निकला एक spin-off project है
- distributed systems के साथ अंदरूनी काम के दौरान device discovery, shared state agreement, और fast, private communication कई बार बनाने का अनुभव इसकी नींव है
- ऐसा internal infrastructure मुख्य रूप से दूसरी कंपनियों के control plane पर निर्भर न रहने के लिए बनाया गया था
- Rayfish चार साल से ज़्यादा पुराना विचार था, लेकिन central operator न होने की वजह से इसमें कोई साफ billing point नहीं था, इसलिए इसे product बनने में देर हुई
- आगे चलकर यह fleet management या audit जैसे enterprise समस्याओं तक बढ़ सकता है, लेकिन ऐसे features अभी मौजूद नहीं हैं
अभी उपलब्ध features
-
point-to-point संरचना
- Rayfish hub-and-spoke नहीं बल्कि point-to-point संरचना है
- हर member सीधे हर दूसरे member से जुड़ता है
- membership कोई server से पूछी जाने वाली value नहीं, बल्कि हर member के पास रहने वाला signed record है
- network बनाने वाला coordinator सिर्फ नए members को स्वीकार करते समय चाहिए; join होने के बाद network बिना किसी central व्यक्ति के चलता है
-
बंद networks और join करने के तरीके
- networks डिफ़ॉल्ट रूप से closed होते हैं
- coordinator दो तरीकों से नए members जोड़ सकता है
- one-time invite code
- join request पर real-time approval
- अगर public network चाहिए तो
ray create --open से gate खोला जा सकता है, और तब सिर्फ room id से join किया जा सकता है
- join किए हुए members तक stable IP और आसान Magic DNS names से पहुँचा जा सकता है
- default hostname
ray up --hostname dario की तरह सेट किया जा सकता है, और --hostname को network के हिसाब से override भी किया जा सकता है
ray up --hostname dario
ray create --name prod
ray invite prod --hostname web
ray join <code>
-
per-device firewall
- हर डिवाइस का अपना firewall होता है और वह खुद तय करती है कि किससे क्या स्वीकार करना है
- coordinator हर network के लिए recommended firewall rules publish कर सकता है
- हर host उन rules को स्वीकार कर सकता है या auto-install चुन सकता है
- यह ऐसा तरीका है जो central policy server के बिना shared defaults देता है, जिसे सबको मानना ज़रूरी नहीं
-
fleet provisioning
- कई डिवाइसेज़ के लिए declarative file से networks और firewall rules define और apply किए जा सकते हैं
- spec एक
networks: map है, और हर network के नीचे host-wise allowed peers और ports लिखे जाते हैं
networks:
prod:
web:
allows:
"*": "tcp:443"
db:
allows:
web: "tcp:5432"
game:
"*":
allows:
"*": "tcp:6969"
ray apply deploy.yaml --dry-run
ray apply deploy.yaml --invite-missing
- fleet के लिए हर box पर अलग code जारी किए बिना reusable key बनाई जा सकती है
ray invite prod --reusable
ray join <key> --hostname web01 --auto-accept-firewall
- key को revoke करने पर सिर्फ नए joins रुकते हैं, पहले से जुड़े servers प्रभावित नहीं होते
ray apply idempotent तरीके से काम करता है, इसलिए spec file fleet की baseline state बनी रहती है
-
1:1 connections और file transfer
- जब अलग network बनाने की ज़रूरत न हो, तब
ray connect से contact ID आधारित 1:1 connection बनाया जा सकता है
ray contact id
ray connect <their-contact-id>
ray connections approve <id>
- approval के बाद private 2-peer network अपने-आप बन जाता है
- Magic DNS, firewall, और mesh features वैसे ही काम करते हैं, और
ray status में [direct] के रूप में दिखते हैं
- contact ID rotate हो सकती है, और पहले से बने connections चलते रहते हैं
- members के बीच authenticated और encrypted path पहले से मौजूद होता है, इसलिए बिना किसी अलग service के files भेजी जा सकती हैं
ray send ./build.tar.gz web01
ray files accept 1
Tailscale से अंतर
- Tailscale और Rayfish दोनों stable IP, Magic DNS, NAT traversal, और P2P data plane देते हैं
- सबसे बड़ा अंतर control कहाँ है इसमें है
- Tailscale, Tailscale coordination server या self-hosted Headscale जैसे control plane का उपयोग करता है
- Rayfish बिना central control plane के, network state को P2P के ज़रिए फैलने वाले signed records के रूप में रखता है
- data plane भी अलग है
- Tailscale kernel में चलने वाला WireGuard इस्तेमाल करता है
- Rayfish user space में Iroh/QUIC datagrams इस्तेमाल करता है
- speed में आमतौर पर Tailscale आगे रहता है
- WireGuard kernel में चलने की वजह से fast links पर बड़े transfer में फ़र्क साफ़ दिख सकता है
- Rayfish थोड़े raw throughput के बदले central party रहित संरचना देता है
- Rayfish account या SSO के बजाय disk पर मौजूद key pair को identity बनाता है
- Rayfish नया है और minimum features पर केंद्रित है, जबकि Tailscale mature है और feature set भी काफ़ी बड़ा है
Yggdrasil से अंतर
- Yggdrasil बिना central authority के end-to-end encrypted IPv6 network देता है
- अंतर उस आख़िरी चरण में आता है जिसे यूज़र को सीधे संभालना पड़ता है
- Yggdrasil एक global network और IPv6 addresses देता है
- Rayfish अलग private networks देता है जिन्हें यूज़र खुद बनाते हैं और members जोड़ते हैं
- Rayfish invite codes, आसान DNS names, network-wise firewall, और join approval prompts जैसी convenience features शामिल करता है
- Yggdrasil उन engineers के लिए उपयुक्त है जिन्हें networking की समझ है, जबकि Rayfish उन यूज़र्स तक को लक्ष्य करता है जो कुछ लोगों के लिए private network आसानी से बनाना चाहते हैं
क्या बनाया जा सकता है और क्या नहीं
- Rayfish किसी library की जगह एक complete tool है
- इसे application के अंदर SDK की तरह embed नहीं किया जा सकता
- यह उन मामलों के लिए है जहाँ Rayfish-installed डिवाइसेज़ को आपस में private communication करनी हो
- friends के लिए name-based access वाला P2P game server
- internal API जो public internet तक न पहुँचता हो
- backup targets
- network members के बीच chat या call app
- shared database जिसे दो टीमें इस्तेमाल करें लेकिन एक-दूसरे को न देख सकें
- applications
name.network.ray के ज़रिए peers तक पहुँच सकती हैं
- जिन बाहरी लोगों के पास Rayfish नहीं है वे network तक नहीं पहुँच सकते, और outsiders के लिए कोई gateway नहीं है
वास्तविक configuration के उदाहरण
-
जब दो विभाग एक database share करते हों
payments और analytics को अलग networks रखने पर दोनों विभाग एक-दूसरे को नहीं देख पाएँगे
- सिर्फ database box दोनों networks में शामिल होगा
- हर network में सिर्फ ज़रूरी ports खोलने के लिए recommended firewall सेट किया जा सकता है
networks:
payments:
db:
allows:
"*": "tcp:8123,tcp:9000"
analytics:
db:
allows:
"*": "tcp:8123,tcp:9000"
- हर टीम
db.payments.ray या db.analytics.ray से access करेगी
- दोनों networks एक-दूसरे के अस्तित्व से अनजान रहते हैं, और central ACL audit के बिना network separation तथा shared host के ज़रिए access control बनता है
-
दोस्तों के लिए Minecraft server
- एक closed network बनाकर दोस्तों को invite करें, फिर IP address, port forwarding, या dynamic DNS के बिना नाम से connect किया जा सकता है
ray create --name mc
ray invite mc
- clients
mc-host.mc.ray:25565 पर connect करते हैं
-
ऐसा closed group जहाँ सभी ports खोलें
- अगर सभी members को TCP 6969 खोलना है, तो admin एक बार rule suggest कर सकता है
ray firewall suggest mc --subject '*' --allow '*:tcp:6969'
- हर member suggested rules की समीक्षा करके उन्हें accept या reject कर सकता है
ray firewall pending mc
ray firewall accept mc
- firewall suggestions forced rules नहीं हैं; member चाहें तो उन्हें अस्वीकार कर सकते हैं
security और addressing
- IP addresses किसी server द्वारा assign नहीं किए जाते, बल्कि हर peer की cryptographic identity से derive होते हैं
- address collisions लगभग न के बराबर हैं, लेकिन अगर collision हो जाए तो coordinator दूसरे peer को अगले खाली slot में रख देता है
- सभी peers बिना किसी central allocator के एक ही address assignment पर deterministically converge करते हैं
- Rayfish central ACL की जगह दो चीज़ों से security बनाता है
- segmentation जहाँ सिर्फ वही peers communicate कर सकते हैं जो एक ही network share करते हैं
- हर डिवाइस का network-wise firewall
prod और dev को isolate करना हो तो उन्हें दो अलग networks बनाना पर्याप्त है
- कई networks में शामिल hosts हर network में अपना firewall साथ रखते हैं
क्या server या port opening ज़रूरी है?
- अलग control server host करने की ज़रूरत नहीं है
- network बनाने वाला coordinator सभी members के join हो जाने के बाद offline भी हो सकता है
- Iroh NAT traversal और hole punching संभालता है, और direct path संभव न होने पर encrypted relay fallback का उपयोग करता है
- अगर आप router control करते हैं और किसी खास box के लिए guaranteed direct path चाहते हैं, तो Rayfish के fixed UDP port को forward कर सकते हैं, लेकिन यह optional है
आगे की योजना और कब यह उपयुक्त नहीं है
- अभी desktop और server पर यह command-line tool के रूप में उपलब्ध है
- अगला काम इसे उन डिवाइसेज़ तक बढ़ाना है जिन्हें यूज़र वास्तव में अपने साथ रखते हैं
- Android client
- iOS client
- एक proper desktop app
- साथ ही मौजूदा features को इतना मजबूत बनाया जा रहा है कि वे production में बिना बोझ के इस्तेमाल हो सकें
- अगर Tailscale, कंपनी VPN, या खुद बनाया हुआ WireGuard mesh पहले से अच्छे से काम कर रहा है, तो Rayfish पर जाने की बहुत बड़ी वजह नहीं है
- Rayfish नया है, इसमें features कम हैं, और कई चीज़ें मौजूदा tools ज़्यादा smooth तरीके से देती हैं
- Rayfish एक चीज़ हटाता है
- account
- वह कंपनी जो network बंद कर सकती है
- हमेशा चालू रहने वाला control server
- किसी और द्वारा चलाया जाने वाला policy database
शुरू करने का तरीका
- installation एक one-line command से शुरू होती है
curl -fsSL https://rayfish.xyz/install.sh | sh
- पहला network बनाने और invite करने की प्रक्रिया docs में आगे समझाई गई है
1 टिप्पणियां
Lobste.rs की राय
मुझे यह बात बहुत पसंद है कि Rayfish शुरुआत से ही एक साथ एक से ज़्यादा नेटवर्क संभालने को मानकर चलता है
Tailscale में यह प्राथमिकता नहीं लगती, इसलिए यह काफी बड़ा फायदा हो सकता है
यह हिस्सा अप्रत्याशित था कि यह किसी high-frequency trading कंपनी से निकला है, और यह कहना कि Tailscale speed में इसलिए जीतता है क्योंकि “WireGuard data plane kernel में चलता है”, गलत है। Tailscale kernel WireGuard इस्तेमाल नहीं करता, फिर भी लोग लगातार यही गलतफहमी रखते हैं
उन्होंने कहा था “ideas, product, prose are mine”, लेकिन repository में
CLAUDE.mdहोना थोड़ा निराशाजनक है। हालांकि contribution summary देखें तो clod ने 1,017++ / 383-- lines की हैं और author ने 104,786++ / 47,064-- lines, इसलिए लगता है कि ज़्यादातर code AI से जल्दबाज़ी में नहीं बनवाया गया। फिर भी समझ नहीं आता कि कुल काम के 1/100 हिस्से के लिए repository में ऐसा निशान छोड़ने की क्या ज़रूरत थीअब तक मैंने Iroh को ज़्यादातर cute लेकिन बहुत उपयोगी न लगने वाले तरीकों में इस्तेमाल होते देखा है, लेकिन शायद यही वह app हो सकता है
यह भी Tailscale में प्राथमिकता नहीं लगती
Product खुद वाकई शानदार दिखता है, और मेरे Tailscale mesh को बदलने से रोकने वाली इकलौती चीज़ Android client की कमी है
हालांकि लेख कम से कम कुछ हिस्सों में AI से लिखा हुआ लगता है, जिससे थोड़ा खटका हुआ
और लगता है nightly tag में debug APK build भी release किया जाता है: https://github.com/rayfish/rayfish/…
मैंने भी यह पोस्ट 5 मिनट पहले ही देखी है, इसलिए उन links से आगे यह सच में चलता है या नहीं, मुझे नहीं पता
Yggdrasil से comparison कमजोर है और facts भी गलत हैं। Yggdrasil testnet global network के रूप में चलता जरूर है, लेकिन वह Yggdrasil के topology structure से convenience के तौर पर निकला नतीजा भर है
अलग-अलग दो key sets के बीच कोई भी connection dynamically accept किया जा सकता है, और दो अलग-अलग Yggdrasil networks और एक बड़े network में फर्क सिर्फ इतना है कि वे एक-दूसरे को messages भेज-पा रहे हैं या नहीं। कोई भी private Yggdrasil network बना सकता है
Keys cryptographically unguessable हैं, लेकिन मैं इसे hidden services तक फैला हुआ नहीं मानता। Domain names arbitrary होते हैं, पर कई लोग global DNS से Yggdrasil address space की ओर point भी करते हैं
अगर नजरिया यह है कि “तीन दोस्तों और game server के लिए सिर्फ एक network चाहिए तो Yggdrasil में जोड़-तोड़ ज्यादा है”, तो तीन दोस्तों और game server के लिए लगभग standard माने जाने वाले tinc से comparison न होना ज्यादा हैरान करता है
अलग private network बनाने और लोगों को accept करने का concept नहीं है, और invite codes, friendly DNS names, per-network firewalls, तथा किसी के join करने की कोशिश पर approval prompt जैसी सुविधा features भी नहीं हैं — explanation का मतलब यही है। Network engineer के लिए शायद यह समस्या न हो
Yggdrasil comparison में छूटी एक और बात यह है कि Rayfish Iroh के NAT hole punching का इस्तेमाल करता है, जिससे दो peers तब भी communicate कर सकते हैं जब उनमें से कोई भी publicly reachable न हो