- Rayfish adalah rilis pertama yang membuat VPN mesh P2P antarperangkat pengguna tanpa server atau akun, dengan status jaringan dipertahankan sebagai catatan bertanda tangan yang disimpan oleh para anggota
- Dengan menghilangkan control plane terpusat, jaringan tetap berjalan setelah bergabung tanpa akun perusahaan, operator, atau server koordinasi yang harus selalu aktif
- Iroh v1 menjadi fondasi rilis ini dengan menangani koneksi QUIC terenkripsi, traversal NAT, hole punching, dan fallback relay saat tidak ada jalur langsung
- Saat ini menyediakan keanggotaan simultan di beberapa jaringan terisolasi, bergabung berbasis kode undangan dan persetujuan, Magic DNS, firewall per perangkat, provisioning fleet deklaratif, koneksi 1:1, dan transfer file
- Dibanding Tailscale, Rayfish mungkin tertinggal dalam kematangan dan throughput, dan bukan SDK, tetapi berfokus pada kebutuhan akan jaringan privat tanpa pihak pusat
Masalah yang ingin diselesaikan Rayfish
- Rayfish adalah VPN mesh P2P yang membuat jaringan privat antarperangkat
- Berjalan tanpa server perantara atau perusahaan yang operasional berkelanjutannya harus dipercaya
- Pengguna menerima kunci, perangkat saling menemukan dengan kunci itu, dan jaringan yang terbentuk menjadi milik orang-orang di dalamnya
Desain yang menghilangkan control plane terpusat
- Banyak VPN modern bergantung pada control plane yang dioperasikan perusahaan
- Perusahaan menentukan anggota dan kebijakan jaringan
- Perusahaan tetap berada dalam alur saat perangkat berkomunikasi
- Jika perusahaan berhenti, menaikkan harga, atau memutus hubungan dengan pelanggan, jaringan privat sulit tetap sepenuhnya dimiliki pengguna
- Rayfish menghapus akun dan operator pusat
- Status jaringan adalah catatan bertanda tangan yang dapat diteruskan oleh anggota mana pun ke anggota lain
- Bahkan jika pembuat Rayfish menghilang, jaringan yang sudah ada tetap berjalan
Cara menangani beberapa jaringan dari satu perangkat
- Rayfish berangkat dari asumsi bahwa pengguna tidak hanya memakai satu jaringan datar
- Satu perangkat dapat sekaligus menjadi bagian dari jaringan untuk teman, side project, dan pekerjaan
- Implementasinya berjalan di balik satu proses dan satu antarmuka virtual
- Setiap jaringan terisolasi satu sama lain, dan pengguna menjadi anggota resmi dari semua jaringan yang diikutinya
Rilis yang dimungkinkan oleh Iroh v1
- Rayfish menyerahkan bagian sulit pada lapisan transport ke Iroh
- Koneksi QUIC terenkripsi antar-peer
- Traversal NAT
- Hole punching
- Fallback relay saat tidak ada jalur langsung
- Iroh v1 memberikan stabilitas agar lapisan transport tidak goyah selama build, sehingga rilis ini menjadi mungkin
- Tantangan berikutnya adalah memoles alat awal ini menjadi alat yang dapat dijalankan di produksi tanpa beban
Spin-off dari Field Technologies
- Rayfish adalah proyek yang dipisahkan dari perusahaan high-frequency trading Field Technologies
- Landasannya adalah pengalaman internal membangun penemuan perangkat, konsensus status bersama, serta komunikasi cepat dan privat berkali-kali saat menangani sistem terdistribusi
- Infrastruktur internal semacam ini terutama dibuat agar tidak bergantung pada control plane perusahaan lain
- Rayfish adalah ide yang telah berlanjut lebih dari 4 tahun, tetapi karena sifatnya tanpa operator pusat, tidak ada titik penagihan yang jelas sehingga produkisasinya tertunda
- Ke depan dapat diperluas ke masalah enterprise seperti manajemen fleet atau audit, tetapi fitur seperti itu belum ada
Fitur yang tersedia saat ini
-
Struktur point-to-point
- Rayfish bukan hub-and-spoke, melainkan struktur point-to-point
- Semua anggota terhubung langsung dengan semua anggota lain
- Keanggotaan bukan nilai yang ditanyakan ke server, melainkan catatan bertanda tangan yang dibawa oleh masing-masing anggota
- Koordinator yang membuat jaringan hanya diperlukan saat menerima anggota baru, dan setelah bergabung jaringan berjalan tanpa seseorang di pusat
-
Jaringan tertutup dan cara bergabung
- Secara default jaringan dalam keadaan tertutup
- Koordinator dapat memasukkan anggota baru dengan dua cara
- Kode undangan sekali pakai
- Persetujuan real-time atas permintaan bergabung
- Jika membutuhkan jaringan publik, gate dapat dibuka dengan
ray create --open, dan dalam kasus ini pengguna dapat bergabung hanya dengan room id
- Anggota yang bergabung dapat diakses melalui IP stabil dan nama Magic DNS yang akrab
- Hostname default dapat diatur seperti
ray up --hostname dario, dan --hostname dapat dioverride per jaringan
ray up --hostname dario
ray create --name prod
ray invite prod --hostname web
ray join <code>
-
Firewall per perangkat
- Setiap perangkat memiliki firewall sendiri, dan menentukan sendiri apa yang akan diterima serta dari siapa
- Koordinator dapat memublikasikan aturan firewall yang direkomendasikan per jaringan
- Setiap host dapat menerima aturan atau memilih instalasi otomatis
- Ini adalah cara menyediakan default bersama tanpa server kebijakan pusat yang wajib diikuti semua orang
-
Provisioning fleet
- Beberapa perangkat dapat mendefinisikan dan menerapkan jaringan serta aturan firewall melalui file deklaratif
- Spesifikasinya adalah map
networks:, dan di bawah setiap jaringan ditulis peer dan port yang diizinkan untuk tiap host
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
- Untuk fleet, dapat dibuat kunci reusable tanpa menerbitkan kode untuk setiap box
ray invite prod --reusable
ray join <key> --hostname web01 --auto-accept-firewall
- Mencabut kunci hanya mencegah anggota baru bergabung dan tidak mengganggu server yang sudah masuk
ray apply bekerja secara idempotent sehingga file spesifikasi tetap menjadi state acuan fleet
-
Koneksi 1:1 dan transfer file
- Saat tidak perlu membuat jaringan terpisah, koneksi 1:1 berbasis ID kontak dapat dibuat dengan
ray connect
ray contact id
ray connect <their-contact-id>
ray connections approve <id>
- Setelah disetujui, jaringan privat 2 peer dibuat secara otomatis
- Magic DNS, firewall, dan fitur mesh bekerja dengan cara yang sama, dan di
ray status ditampilkan sebagai [direct]
- ID kontak dapat dirotasi, dan koneksi yang sudah dibuat tetap berfungsi
- Karena sudah ada jalur terautentikasi dan terenkripsi antaranggota, file dapat dikirim tanpa layanan terpisah
ray send ./build.tar.gz web01
ray files accept 1
Perbedaan dengan Tailscale
- Tailscale dan Rayfish sama-sama menyediakan IP stabil, Magic DNS, traversal NAT, dan data plane P2P
- Perbedaan terbesar adalah lokasi kontrol
- Tailscale menggunakan control plane seperti server koordinasi Tailscale atau Headscale yang di-host sendiri
- Rayfish tidak memiliki control plane terpusat, dan menempatkan status jaringan sebagai catatan bertanda tangan yang diteruskan secara P2P
- Data plane-nya juga berbeda
- Tailscale menggunakan WireGuard yang berjalan di kernel
- Rayfish menggunakan datagram Iroh/QUIC di user space
- Dari sisi kecepatan, Tailscale biasanya unggul
- Karena WireGuard berjalan di kernel, perbedaannya dapat terlihat jelas saat transfer besar di link cepat
- Rayfish pada dasarnya menukar sedikit throughput mentah dengan arsitektur tanpa pihak pusat
- Rayfish menggunakan pasangan kunci di disk sebagai identitas, bukan akun atau SSO
- Rayfish masih muda dan berfokus pada fitur minimum, sedangkan Tailscale matang dan memiliki cakupan fitur luas
Perbedaan dengan Yggdrasil
- Yggdrasil menyediakan jaringan IPv6 terenkripsi end-to-end tanpa otoritas pusat
- Perbedaannya muncul pada tahap terakhir yang harus ditangani langsung oleh pengguna
- Yggdrasil menyediakan satu jaringan global dan alamat IPv6
- Rayfish menyediakan jaringan privat terpisah yang dibuat pengguna dan diisi dengan anggota
- Rayfish menyertakan fitur kenyamanan seperti kode undangan, nama DNS yang akrab, firewall per jaringan, dan prompt persetujuan bergabung
- Yggdrasil cocok untuk engineer yang memiliki pengetahuan jaringan, sedangkan Rayfish juga menargetkan pengguna yang ingin dengan mudah membuat jaringan privat untuk beberapa orang
Apa yang bisa dan tidak bisa dibuat
- Rayfish bukan library, melainkan alat lengkap
- Tidak dapat di-embed ke dalam aplikasi seperti SDK
- Cocok untuk kebutuhan komunikasi privat antarperangkat yang sudah memasang Rayfish
- Server game P2P yang diakses teman dengan nama
- API internal yang tidak tersentuh internet publik
- Target backup
- Aplikasi chat atau panggilan antaranggota jaringan
- Database yang dibagi oleh dua tim yang seharusnya tidak saling melihat
- Aplikasi dapat mengakses peer melalui
name.network.ray
- Orang luar yang tidak memasang Rayfish tidak dapat mengakses jaringan, dan tidak ada gateway untuk pihak eksternal
Contoh konfigurasi nyata
-
Saat dua departemen berbagi database
- Jika
payments dan analytics dibuat sebagai jaringan terpisah, kedua departemen tidak dapat saling melihat
- Hanya box database yang bergabung ke kedua jaringan
- Firewall yang direkomendasikan diatur agar hanya membuka port yang diperlukan di tiap jaringan
networks:
payments:
db:
allows:
"*": "tcp:8123,tcp:9000"
analytics:
db:
allows:
"*": "tcp:8123,tcp:9000"
- Setiap tim mengakses melalui
db.payments.ray atau db.analytics.ray
- Kedua jaringan tidak mengetahui keberadaan satu sama lain, dan kontrol akses dikonfigurasi melalui pemisahan jaringan serta host bersama tanpa audit ACL pusat
-
Server Minecraft untuk teman
- Jika membuat jaringan tertutup dan mengundang teman, mereka dapat terhubung dengan nama tanpa alamat IP, port forwarding, atau DNS dinamis
ray create --name mc
ray invite mc
- Klien terhubung ke
mc-host.mc.ray:25565
-
Grup tertutup tempat semua orang membuka port
- Jika semua anggota harus membuka TCP 6969, admin dapat mengusulkan aturan satu kali
ray firewall suggest mc --subject '*' --allow '*:tcp:6969'
- Setiap anggota meninjau aturan yang diusulkan lalu menerima atau menolaknya
ray firewall pending mc
ray firewall accept mc
- Usulan firewall bukan aturan paksa, dan anggota dapat menolaknya jika tidak menginginkannya
Keamanan dan penanganan alamat
- Alamat IP tidak dialokasikan oleh server, tetapi diturunkan dari identitas kriptografis setiap peer
- Benturan alamat hampir tidak terjadi, tetapi jika terjadi benturan, koordinator menempatkan peer kedua di slot kosong berikutnya
- Semua peer secara deterministik konvergen ke alokasi alamat yang sama tanpa pengalokasi pusat
- Rayfish menyusun keamanan dengan dua hal, bukan ACL pusat
- Segmentasi yang hanya memungkinkan komunikasi antar-peer yang berbagi jaringan yang sama
- Firewall per jaringan pada setiap perangkat
- Untuk mengisolasi
prod dan dev, cukup buat keduanya sebagai dua jaringan
- Host yang menjadi bagian dari beberapa jaringan membawa firewallnya sendiri di setiap jaringan
Perlu tidaknya server dan port terbuka
- Tidak perlu meng-host server kontrol terpisah
- Koordinator yang membuat jaringan boleh offline setelah semua anggota bergabung
- Iroh menangani traversal NAT dan hole punching, lalu menggunakan fallback relay terenkripsi jika jalur langsung tidak memungkinkan
- Jika Anda mengontrol router dan menginginkan jalur langsung yang terjamin ke box tertentu, Anda dapat meneruskan port UDP tetap milik Rayfish, tetapi ini opsional
Rencana ke depan dan kasus yang tidak cocok
- Saat ini tersedia sebagai alat command-line untuk desktop dan server
- Pekerjaan berikutnya adalah memperluasnya ke perangkat yang benar-benar dibawa pengguna
- Klien Android
- Klien iOS
- Aplikasi desktop yang layak
- Pada saat yang sama, pekerjaan juga dilakukan untuk memperkuat fitur yang ada agar dapat dipakai di produksi tanpa beban
- Jika Tailscale, VPN perusahaan, atau mesh WireGuard yang dikonfigurasi sendiri sudah berjalan baik, tidak ada alasan besar untuk beralih ke Rayfish
- Rayfish lebih muda dan fiturnya lebih sedikit, dan banyak fitur disediakan lebih mulus oleh alat yang sudah ada
- Yang dihapus Rayfish adalah satu hal
- Akun
- Perusahaan yang dapat menghentikan jaringan
- Server kontrol yang harus terus aktif
- Database kebijakan yang dioperasikan orang lain
Cara memulai
- Instalasi dimulai dengan perintah satu baris
curl -fsSL https://rayfish.xyz/install.sh | sh
- Proses pembuatan jaringan pertama dan undangan dilanjutkan di dokumentasi
1 komentar
Komentar Lobste.rs
Sangat bagus bahwa Rayfish sejak awal memang mengasumsikan akan menangani lebih dari satu jaringan secara bersamaan
Di Tailscale, ini tampaknya bukan prioritas, jadi ini bisa menjadi keunggulan yang cukup besar
Fakta bahwa proyek ini di-spin off dari perusahaan high-frequency trading cukup tak terduga, dan pernyataan bahwa Tailscale unggul dalam kecepatan karena “data plane WireGuard berjalan di kernel” itu salah. Tailscale tidak memakai kernel WireGuard, tetapi orang-orang terus salah paham soal itu
Mereka bilang “ide, produk, dan kalimat adalah milik saya”, tetapi tetap disayangkan ada
CLAUDE.mddi repositorinya. Meski begitu, melihat ringkasan kontribusinya, clod hanya 1,017++ / 383-- baris sementara penulisnya 104,786++ / 47,064-- baris, jadi tampaknya sebagian besar kode tidak dibuat asal-asalan oleh AI. Tetap saja, saya tidak yakin apakah jejak seperti itu perlu ditinggalkan di repositori hanya untuk 1/100 dari total pekerjaanSelama ini saya lebih sering melihat Iroh dipakai dengan cara yang lucu tapi kurang berguna, dan ini mungkin saja aplikasi yang tepat untuknya
Ini juga tampaknya bukan prioritas di Tailscale
Produknya sendiri terlihat sangat keren, dan satu-satunya hal yang mencegah saya mengganti mesh Tailscale saya adalah tidak adanya klien Android
Hanya saja, tulisannya terasa seperti setidaknya sebagian ditulis oleh AI, jadi agak mengganggu
Dan tampaknya mereka juga mendistribusikan build APK debug di tag nightly: https://github.com/rayfish/rayfish/…
Saya juga baru melihat tulisan ini 5 menit lalu, jadi saya tidak tahu lebih jauh dari tautan itu apakah memang benar berfungsi
Perbandingannya dengan Yggdrasil lemah dan bahkan keliru secara faktual. Testnet Yggdrasil memang dijalankan sebagai jaringan global, tetapi itu hanya konsekuensi praktis dari struktur topologi Yggdrasil
Koneksi apa pun antara dua himpunan kunci yang terpisah bisa diterima secara dinamis, dan perbedaan antara dua jaringan Yggdrasil yang terpisah dan satu jaringan besar hanyalah apakah mereka saling bertukar pesan atau tidak. Siapa pun bisa membuat jaringan Yggdrasil privat
Kuncinya memang tidak bisa ditebak secara kriptografis, tetapi saya tidak menganggap itu otomatis berarti layanannya tersembunyi. Nama domain memang arbitrer, tetapi banyak orang tetap menunjuk ruang alamat Yggdrasil lewat DNS global
Jika sudut pandangnya adalah “kalau saya hanya ingin jaringan untuk tiga teman dan server game, Yggdrasil terlalu banyak yang harus dirakit”, justru lebih aneh lagi karena tidak ada perbandingan dengan tinc yang bisa dibilang standar untuk tiga teman dan server game
Maksud dari penjelasan itu adalah bahwa tidak ada konsep membuat jaringan privat terpisah lalu menerima orang ke dalamnya, juga tidak ada fitur kenyamanan seperti kode undangan, nama DNS yang mudah diingat, firewall per jaringan, atau prompt persetujuan saat seseorang mencoba bergabung. Bagi network engineer, ini mungkin bukan masalah
Hal lain yang terlewat dalam perbandingan dengan Yggdrasil adalah bahwa Rayfish memanfaatkan NAT hole punching dari Iroh, sehingga dua peer tetap bisa berkomunikasi meski tidak ada satu pun yang dapat diakses secara publik