1 puan yazan GN⁺ 3 시간 전 | 1 yorum | WhatsApp'ta paylaş
  • Rayfish, sunucu veya hesap olmadan kullanıcı cihazları arasında P2P mesh VPN oluşturan ilk sürüm; ağ durumu, üyelerin sakladığı imzalı kayıtlarla korunuyor
  • Merkezi kontrol düzlemini ortadan kaldırarak, katılım sonrasında şirket hesabı, operatör veya sürekli açık kalması gereken bir koordinasyon sunucusu olmadan da ağ çalışmaya devam ediyor
  • Iroh v1; şifreli QUIC bağlantıları, NAT geçişi, hole punching ve doğrudan yol olmadığında relay fallback işlevlerini üstlenerek bu sürümün temelini oluşturuyor
  • Şu anda birden fazla yalıtılmış ağa aynı anda katılım, davet kodu ve onaya dayalı katılım, Magic DNS, cihaz başına güvenlik duvarı, deklaratif fleet provisioning, 1:1 bağlantılar ve dosya aktarımı sunuyor
  • Olgunluk ve throughput açısından Tailscale’e göre dezavantajlı olabilir ve bir SDK da değil; ancak odak noktası merkezi tarafı olmayan özel ağlar gerektiren kullanım senaryoları

Rayfish’in çözmeye çalıştığı sorun

  • Rayfish, cihazlar arasında özel ağ oluşturan bir P2P mesh VPN
  • Arada sunucu ya da sürekli çalışacağına güvenilmesi gereken bir şirket olmadan çalışıyor
  • Kullanıcılar anahtar alıyor, cihazlar bu anahtarlarla birbirini buluyor ve ortaya çıkan ağ içindeki insanlara ait oluyor

Merkezi kontrol düzlemini ortadan kaldıran tasarım

  • Pek çok modern VPN, bir şirketin işlettiği kontrol düzlemine dayanıyor
    • Şirket, ağ üyelerini ve politikaları belirliyor
    • Cihazlar iletişim kurarken bile şirket akışın içinde kalıyor
    • Şirket kapanırsa, fiyat artırırsa veya müşteri ilişkisini keserse özel ağın tamamen kullanıcıya ait kalması zorlaşıyor
  • Rayfish, hesapları ve merkezi operatörü ortadan kaldırıyor
    • Ağ durumu, herhangi bir üyenin başka bir üyeye iletebildiği imzalı bir kayıt
    • Rayfish geliştiricileri ortadan kaybolsa bile mevcut ağlar çalışmaya devam ediyor

Tek cihazda birden fazla ağın yönetimi

  • Rayfish, kullanıcıların yalnızca tek bir düz ağ kullanmadığı varsayımıyla tasarlanmış
  • Bir cihaz aynı anda arkadaşlar, yan projeler ve iş için farklı ağlara ait olabilir
  • Uygulama, tek bir süreç ve tek bir sanal arayüz arkasında çalışıyor
  • Her ağ birbirinden yalıtılmış durumda ve kullanıcı katıldığı tüm ağların tam üyesi oluyor

Iroh v1’in mümkün kıldığı sürüm

  • Rayfish, aktarım katmanındaki zor işleri Iroh’a bırakıyor
    • Eşler arasında şifreli QUIC bağlantıları
    • NAT geçişi
    • Hole punching
    • Doğrudan yol olmadığında relay fallback
  • Iroh v1, geliştirme sırasında aktarım katmanının sallanmadan kalmasını sağlayan istikrarı sunarak bu sürümü mümkün kıldı
  • Sıradaki görev, ilk araçları üretimde rahatça çalıştırılabilecek araçlara dönüştürmek

Field Technologies’ten çıkan spin-off

  • Rayfish, yüksek frekanslı işlem şirketi Field Technologies’ten ayrılan bir proje
  • Temelinde, içeride dağıtık sistemlerle uğraşırken cihaz keşfi, paylaşılan durum üzerinde uzlaşma ve hızlı, özel iletişim için defalarca altyapı kurmuş olma deneyimi var
  • Bu iç altyapılar çoğunlukla başka şirketlerin kontrol düzlemine bağımlı olmamak için geliştirildi
  • Rayfish, 4 yıldan uzun süredir var olan bir fikirdi; ancak merkezi operatör olmaması nedeniyle net bir faturalandırma noktası bulunmadığından ürünleşmesi gecikti
  • Gelecekte fleet yönetimi veya denetim gibi kurumsal sorunlara genişleyebilir, ancak bu tür özellikler henüz yok

Mevcut özellikler

  • Noktadan noktaya yapı

    • Rayfish, hub-and-spoke değil noktadan noktaya bir yapı
    • Tüm üyeler diğer tüm üyelerle doğrudan bağlanıyor
    • Üyelik, sunucuya sorulan bir değer değil; her üyenin yanında taşıdığı imzalı bir kayıt
    • Ağı oluşturan koordinatör yalnızca yeni üyeleri kabul ederken gerekli; katılım sonrasında ağ, merkezde birine ihtiyaç duymadan çalışıyor
  • Kapalı ağlar ve katılım yöntemleri

    • Ağlar varsayılan olarak kapalı durumda
    • Koordinatör yeni üyeleri iki şekilde alabiliyor
      • Tek kullanımlık davet kodu
      • Katılım isteğine gerçek zamanlı onay
    • Açık ağ gerekiyorsa kapı ray create --open ile açılabiliyor; bu durumda yalnızca room id ile katılım mümkün
    • Katılan üyeler, kararlı IP’ler ve tanıdık Magic DNS adlarıyla erişilebilir oluyor
    • Varsayılan ana makine adı ray up --hostname dario gibi ayarlanabiliyor ve ağ bazında --hostname ile üzerine yazılabiliyor
    ray up --hostname dario
    ray create --name prod
    ray invite prod --hostname web
    ray join <code>
    
  • Cihaz başına güvenlik duvarı

    • Her cihaz kendi güvenlik duvarına sahip ve neyi kimden alacağına kendisi karar veriyor
    • Koordinatör, ağ bazında önerilen güvenlik duvarı kuralları yayımlayabiliyor
    • Her host kuralları kabul edebiliyor veya otomatik kurulumu seçebiliyor
    • Bu yaklaşım, herkesin uyması gereken merkezi bir politika sunucusu olmadan paylaşılan varsayılanlar sağlıyor
  • Fleet provisioning

    • Birden fazla cihaz için ağlar ve güvenlik duvarı kuralları deklaratif bir dosyada tanımlanıp uygulanabiliyor
    • Şema, networks: haritası; her ağ altında host bazında izin verilen peer’ler ve portlar belirtiliyor
    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 için her kutuya ayrı kod vermek yerine yeniden kullanılabilir anahtarlar oluşturulabiliyor
    ray invite prod --reusable
    ray join <key> --hostname web01 --auto-accept-firewall
    
    • Bir anahtar iptal edildiğinde yalnızca yeni katılımlar engelleniyor, daha önce katılmış sunucular etkilenmiyor
    • ray apply idempotent çalışıyor; böylece şema dosyası fleet’in referans durumu olarak kalıyor
  • 1:1 bağlantılar ve dosya aktarımı

    • Ayrı bir ağ oluşturmaya gerek olmadığında ray connect, kişi ID’si tabanlı 1:1 bağlantı kurabiliyor
    ray contact id
    ray connect <their-contact-id>
    ray connections approve <id>
    
    • Onay verildiğinde özel 2-peer ağı otomatik olarak oluşturuluyor
    • Magic DNS, güvenlik duvarı ve mesh işlevleri aynı şekilde çalışıyor; ray status içinde [direct] olarak görünüyor
    • Kişi ID’si döndürülebiliyor ve daha önce kurulmuş bağlantılar çalışmaya devam ediyor
    • Üyeler arasında kimliği doğrulanmış ve şifreli bir yol zaten bulunduğu için ek bir servis olmadan dosya gönderilebiliyor
    ray send ./build.tar.gz web01
    ray files accept 1
    

Tailscale’den farkı

  • Tailscale ve Rayfish, kararlı IP’ler, Magic DNS, NAT geçişi ve P2P veri düzlemi sunuyor
  • En büyük fark kontrolün nerede olduğu
    • Tailscale, Tailscale koordinasyon sunucularını veya self-hosted Headscale gibi bir kontrol düzlemini kullanıyor
    • Rayfish ise merkezi kontrol düzlemi olmadan, ağ durumunu P2P üzerinden aktarılan imzalı kayıtlar halinde tutuyor
  • Veri düzlemi de farklı
    • Tailscale, çekirdekte çalışan WireGuard kullanıyor
    • Rayfish, kullanıcı alanında çalışan Iroh/QUIC datagram’larını kullanıyor
  • Hız tarafında genelde Tailscale avantajlı
    • WireGuard çekirdekte çalıştığı için hızlı bağlantılarda büyük hacimli aktarımlarda fark belirgin olabilir
    • Rayfish, merkezi taraf olmayan yapıyı biraz ham throughput pahasına sunuyor
  • Rayfish, hesap veya SSO yerine disk üzerindeki anahtar çiftini kimlik olarak kullanıyor
  • Rayfish genç ve minimal özellik odaklı; Tailscale ise daha olgun ve daha geniş özellik yelpazesine sahip

Yggdrasil’den farkı

  • Yggdrasil, merkezi otorite olmadan uçtan uca şifreli bir IPv6 ağı sunuyor
  • Fark, kullanıcıların doğrudan temas ettiği son aşamada ortaya çıkıyor
    • Yggdrasil tek bir küresel ağ ve IPv6 adresleri sunuyor
    • Rayfish ise kullanıcıların oluşturup üye aldığı ayrı özel ağlar sunuyor
  • Rayfish; davet kodları, tanıdık DNS adları, ağ bazında güvenlik duvarı ve katılım onay istemleri gibi kullanım kolaylığı sağlayan özellikler içeriyor
  • Yggdrasil, ağ bilgisi olan mühendislere daha uygunken Rayfish, birkaç kişi için özel ağ kurmayı kolaylaştırmak isteyen kullanıcıları da hedefliyor

Neler yapılabilir, neler yapılamaz

  • Rayfish bir kütüphane değil, tamamlanmış bir araç
  • Uygulama içine SDK gibi gömülemiyor
  • Rayfish kurulu cihazların birbiriyle özel olarak iletişim kurması gereken kullanım senaryolarına uygun
    • Arkadaşların isimle bağlandığı P2P oyun sunucusu
    • Açık internete çıkmayan iç API’ler
    • Yedekleme hedefleri
    • Ağ üyeleri arasında sohbet veya arama uygulamaları
    • Birbirini görmemesi gereken iki ekibin paylaştığı veritabanı
  • Uygulamalar peer’lere name.network.ray ile erişebiliyor
  • Rayfish kurulu olmayan dış kullanıcılar ağa erişemiyor ve dış kullanıcılar için bir gateway yok

Gerçek yapılandırma örnekleri

  • İki departmanın aynı veritabanını paylaşması

    • payments ve analytics ayrı ağlar olduğunda iki departman birbirini göremiyor
    • Yalnızca veritabanı makinesi iki ağa birden katılıyor
    • Her ağda yalnızca gerekli portların açılması için önerilen güvenlik duvarı yapılandırılıyor
    networks:
      payments:
        db:
          allows:
            "*": "tcp:8123,tcp:9000"
      analytics:
        db:
          allows:
            "*": "tcp:8123,tcp:9000"
    
    • Her ekip db.payments.ray veya db.analytics.ray üzerinden erişiyor
    • İki ağ birbirinin varlığını bilmiyor; merkezi ACL denetimi olmadan ağ ayrımı ve paylaşılan host üzerinden erişim kontrolü sağlanıyor
  • Arkadaşlar için Minecraft sunucusu

    • Kapalı bir ağ oluşturup arkadaşları davet ettiğinizde IP adresi, port yönlendirme veya dinamik DNS olmadan isimle bağlanmak mümkün oluyor
    ray create --name mc
    ray invite mc
    
    • İstemciler mc-host.mc.ray:25565 adresine bağlanıyor
  • Herkesin port açtığı kapalı grup

    • Tüm üyelerin TCP 6969 açması gerekiyorsa yönetici kuralı bir kez önerebiliyor
    ray firewall suggest mc --subject '*' --allow '*:tcp:6969'
    
    • Her üye önerilen kuralları inceleyip kabul veya reddediyor
    ray firewall pending mc
    ray firewall accept mc
    
    • Güvenlik duvarı önerileri zorunlu kurallar değil; üyeler istemezse reddedebiliyor

Güvenlik ve adresleme

  • IP adresleri bir sunucu tarafından atanmak yerine her peer’in kriptografik kimliğinden türetiliyor
  • Adres çakışması neredeyse hiç olmuyor; olursa koordinatör ikinci peer’i sıradaki boş slota yerleştiriyor
  • Tüm peer’ler merkezi bir atayıcı olmadan aynı adres atamasına deterministik olarak yakınsıyor
  • Rayfish, merkezi ACL yerine güvenliği iki mekanizmayla kuruyor
    • Yalnızca aynı ağı paylaşan peer’lerin iletişim kurabildiği bölümlendirme
    • Her cihazın ağ bazındaki güvenlik duvarı
  • prod ile dev ayrılmak isteniyorsa iki ayrı ağ oluşturmak yeterli
  • Birden fazla ağa ait host’lar her ağda kendi güvenlik duvarını taşıyor

Sunucu veya port açma gerekliliği

  • Ayrı bir kontrol sunucusu barındırmak gerekmiyor
  • Ağı oluşturan koordinatör, tüm üyeler katıldıktan sonra çevrimdışı olsa bile sorun olmuyor
  • Iroh, NAT geçişi ve hole punching’i yönetiyor; doğrudan yol mümkün değilse şifreli relay fallback kullanıyor
  • Router üzerinde kontrol varsa ve belirli bir makineye garantili doğrudan yol isteniyorsa Rayfish’in sabit UDP portu yönlendirilebiliyor, ancak bu isteğe bağlı

Gelecek planları ve uygun olmadığı durumlar

  • Şu anda masaüstü ve sunucularda komut satırı aracı olarak sunuluyor
  • Sıradaki adım, bunu kullanıcıların gerçekten yanında taşıdığı cihazlara genişletmek
    • Android istemcisi
    • iOS istemcisi
    • Düzgün bir masaüstü uygulaması
  • Aynı anda mevcut özellikleri üretimde gönül rahatlığıyla kullanılabilecek kadar sağlamlaştırma çalışmaları da sürüyor
  • Zaten Tailscale, şirket VPN’i veya elle kurulmuş WireGuard mesh sorunsuz çalışıyorsa Rayfish’e geçmek için çok büyük bir neden olmayabilir
  • Rayfish daha genç ve daha az özellikli; mevcut araçların daha akıcı sunduğu pek çok işlev var
  • Rayfish’in ortadan kaldırdığı şey ise şu
    • hesaplar
    • ağı durdurabilecek bir şirket
    • sürekli açık kalması gereken kontrol sunucusu
    • başkası tarafından işletilen politika veritabanı

Nasıl başlanır

  • Kurulum tek satırlık bir komutla başlıyor
curl -fsSL https://rayfish.xyz/install.sh | sh
  • İlk ağın oluşturulması ve davet süreci dokümanlarda devam ediyor

1 yorum

 
GN⁺ 3 시간 전
Lobste.rs yorumları
  • Rayfish’in en baştan aynı anda birden fazla ağı yönetmeyi varsayması gerçekten hoşuma gidiyor
    Tailscale’de bu öncelik değil gibi göründüğü için oldukça büyük bir avantaj olabilir
    Yüksek frekanslı alım satım şirketinden ayrılarak ortaya çıktığı kısmı beklenmedikti; Tailscale’in hızda kazanmasının sebebi olarak “WireGuard veri düzlemi çekirdekte çalışıyor” demek ise yanlış. Tailscale kernel WireGuard kullanmamasına rağmen insanlar bunu sürekli böyle sanıyor
    “Fikirler, ürün ve cümleler bana ait” denmiş ama depoda CLAUDE.md olması üzücü. Yine de katkı özetine bakınca clod 1.017++ / 383-- satır, yazar ise 104.786++ / 47.064-- satır; yani kodun çoğu yapay zekayla baştan savma yapılmış gibi durmuyor. Yine de iş yükünün 1/100’ü yüzünden depoda böyle bir iz bırakmaya gerek var mıydı, bilmiyorum

    • Yapay zeka desteği alınmış olsa bile çok dert etmem. Önemli olan gerçek kullanımda işe yararlılık; gerçekten merkeziyetsiz bir Tailscale alternatifi ise muazzam olabilir
      Şimdiye kadar Iroh’u daha çok sevimli ama pek işe yaramayan şekillerde kullanılırken gördüm; belki de aradığımız uygulama budur
    • Iroh tabanlı olduğu için QUIC var; bu yüzden mesh VPN’de sonunda kuantuma dayanıklı kriptografi kullanmak mümkün olabilir
      Bu da Tailscale’de öncelik değil gibi görünüyor
  • Ürünün kendisi gerçekten harika görünüyor; beni Tailscale mesh’imi değiştirmekten alıkoyan tek şey Android istemcisinin olmaması
    Ancak yazı en azından kısmen yapay zekayla yazılmış gibi okunuyor ve bu biraz gözüme battı

  • Yggdrasil ile karşılaştırma zayıf ve olgusal olarak da hatalı. Yggdrasil testnet’i küresel bir ağ olarak işletiliyor olabilir, ama bu yalnızca Yggdrasil’in topolojisinden kolaylık gereği çıkan bir sonuç
    Birbirinden ayrı iki anahtar kümesi arasındaki herhangi bir bağlantıyı dinamik olarak kabul edebilir; ayrı iki Yggdrasil ağı ile büyük tek bir ağ arasındaki fark, yalnızca birbirleriyle mesajlaşıp mesajlaşmadıklarıdır. Herkes özel bir Yggdrasil ağı kurabilir
    Anahtarlar kriptografik olarak tahmin edilemez, ama bunun gizli servis anlamına da geldiğini düşünmüyorum. Alan adları keyfidir; ancak birçok kişi küresel DNS’i Yggdrasil adres uzayına işaret ettiriyor
    “Üç arkadaş ve bir oyun sunucusu için yalnızca bir ağ istiyorsanız Yggdrasil’de birleştirilecek çok şey var” bakış açısıysa, üç arkadaş ve bir oyun sunucusu için neredeyse standart sayılabilecek tinc ile karşılaştırma olmaması asıl şaşırtıcı

    • Açık ID’nin kendisi tahmin edilemez olabilir, ancak paylaşılan loglarda veya hata raporlarında açık ID görünebilir. Bu yüzden onay istemi olan özel ağ bu sorunu ele alıyor
      Ayrı bir özel ağ oluşturup insanları kabul etme kavramının olmaması; davet kodları, tanıdık DNS adları, ağ bazlı güvenlik duvarı, biri katılmaya çalıştığında onay istemi gibi kolaylık özelliklerinin bulunmaması açıklaması da bu noktaya dair. Bir ağ mühendisiyseniz sorun olmayabilir
      Yggdrasil karşılaştırmasında eksik kalan bir diğer nokta da Rayfish’in Iroh’un NAT hole punching özelliğinden yararlanarak, iki eşten hiçbiri herkese açık şekilde erişilebilir olmasa bile bu iki eşin iletişim kurabilmesini sağlaması