- Rayfish es su primera versión para crear una VPN mesh P2P entre dispositivos de usuarios, sin servidores ni cuentas, manteniendo el estado de la red como registros firmados conservados por sus miembros
- Al eliminar el plano de control central, la red sigue funcionando después de unirse incluso sin cuentas corporativas, operadores ni un servidor de coordinación que deba estar siempre encendido
- Iroh v1 se encarga de las conexiones QUIC cifradas, la travesía de NAT, el hole punching y el fallback a relay cuando no hay una ruta directa, y sirve como base del lanzamiento
- Actualmente ofrece pertenencia simultánea a varias redes aisladas, ingreso mediante códigos de invitación y aprobación, Magic DNS, firewall por dispositivo, aprovisionamiento declarativo de flotas, conexiones 1:1 y transferencia de archivos
- Puede estar en desventaja frente a Tailscale en madurez y throughput, y tampoco es un SDK, pero se enfoca en casos donde se necesita una red privada sin una parte central
El problema que Rayfish busca resolver
- Rayfish es una VPN mesh P2P que crea redes privadas entre dispositivos
- Funciona sin servidores intermedios ni una empresa cuya operación continua haya que confiar
- El usuario recibe claves, los dispositivos se encuentran entre sí con esas claves, y la red creada pertenece a las personas dentro de ella
Diseño sin plano de control central
- Muchas VPN modernas dependen de un plano de control operado por una empresa
- La empresa decide los miembros y las políticas de la red
- La empresa permanece dentro del flujo incluso mientras los dispositivos se comunican
- Si la empresa se cae, sube los precios o corta la relación con el cliente, es difícil que la red privada siga siendo completamente propiedad del usuario
- Rayfish elimina las cuentas y el operador central
- El estado de la red es un registro firmado que cualquier miembro puede transmitir a otros miembros
- Aunque los creadores de Rayfish desaparezcan, las redes existentes siguen funcionando
Cómo maneja varias redes en un dispositivo
- Rayfish parte de la premisa de que los usuarios no usan una sola red plana
- Un dispositivo puede pertenecer al mismo tiempo a redes de amigos, de proyectos paralelos y de trabajo
- La implementación funciona detrás de un único proceso y una única interfaz virtual
- Cada red está aislada de las demás, y el usuario se convierte en miembro pleno de todas las redes a las que se une
El lanzamiento que hizo posible Iroh v1
- Rayfish delega en Iroh las partes difíciles de la capa de transporte
- Conexiones QUIC cifradas entre peers
- Travesía de NAT
- Hole punching
- Fallback a relay cuando no hay ruta directa
- Iroh v1 aportó la estabilidad necesaria para que la capa de transporte no se tambaleara durante el desarrollo, lo que hizo posible esta versión
- El siguiente desafío es pulir las herramientas iniciales hasta convertirlas en herramientas que se puedan ejecutar en producción sin preocupaciones
Un spin-off de Field Technologies
- Rayfish es un proyecto separado de Field Technologies, una empresa de trading de alta frecuencia
- Se basa en la experiencia interna de trabajar con sistemas distribuidos y de haber construido varias veces descubrimiento de dispositivos, consenso sobre estado compartido y comunicación rápida y privada
- Esa infraestructura interna se creó principalmente para no depender de los planos de control de otras empresas
- Rayfish fue una idea que se mantuvo durante más de cuatro años, pero su falta de operador central retrasó su conversión en producto porque no había un punto claro de cobro
- En el futuro podría expandirse hacia problemas empresariales como gestión de flotas o auditoría, pero esas funciones aún no existen
Funciones disponibles actualmente
-
Estructura punto a punto
- Rayfish no usa una arquitectura hub-and-spoke, sino una estructura punto a punto
- Todos los miembros se conectan directamente con todos los demás miembros
- La membresía no es un valor que se consulta a un servidor, sino un registro firmado que cada miembro lleva consigo
- El coordinador que creó la red solo es necesario al aceptar nuevos miembros; después de unirse, la red funciona sin alguien central
-
Redes cerradas y formas de unirse
- Las redes están cerradas por defecto
- El coordinador puede admitir nuevos miembros de dos maneras
- Código de invitación de un solo uso
- Aprobación en tiempo real de una solicitud de ingreso
- Si se necesita una red pública, se puede abrir la puerta con
ray create --open; en ese caso, basta con el room id para unirse
- Los miembros unidos son accesibles mediante una IP estable y un nombre Magic DNS amigable
- El hostname predeterminado se puede configurar como
ray up --hostname dario, y --hostname puede sobrescribirse por red
ray up --hostname dario
ray create --name prod
ray invite prod --hostname web
ray join <code>
-
Firewall por dispositivo
- Cada dispositivo tiene su propio firewall y decide por sí mismo qué aceptar y de quién
- El coordinador puede publicar reglas de firewall recomendadas por red
- Cada host puede aceptar las reglas o elegir instalarlas automáticamente
- Es una forma de ofrecer valores predeterminados compartidos sin un servidor central de políticas que todos deban obedecer obligatoriamente
-
Aprovisionamiento de flotas
- Para varios dispositivos, se pueden definir y aplicar redes y reglas de firewall con un archivo declarativo
- La especificación es un mapa
networks:, y bajo cada red se indican los peers y puertos permitidos por 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
- Para una flota se pueden crear claves reutilizables sin emitir un código para cada máquina
ray invite prod --reusable
ray join <key> --hostname web01 --auto-accept-firewall
- Revocar una clave solo bloquea nuevos ingresos y no interfiere con los servidores que ya entraron
ray apply funciona de forma idempotente, de modo que el archivo de especificación queda como el estado de referencia de la flota
-
Conexiones 1:1 y transferencia de archivos
- Cuando no hace falta crear una red aparte,
ray connect permite crear una conexión 1:1 basada en un ID de contacto
ray contact id
ray connect <their-contact-id>
ray connections approve <id>
- Una vez aprobada, se crea automáticamente una red privada de 2 peers
- Magic DNS, firewall y funciones mesh operan igual, y en
ray status aparece como [direct]
- Los ID de contacto pueden rotarse, y las conexiones ya creadas siguen funcionando
- Como ya existe una ruta autenticada y cifrada entre miembros, se pueden enviar archivos sin un servicio separado
ray send ./build.tar.gz web01
ray files accept 1
Diferencias con Tailscale
- Tanto Tailscale como Rayfish ofrecen IP estables, Magic DNS, travesía de NAT y un plano de datos P2P
- La mayor diferencia es la ubicación del control
- Tailscale usa un plano de control como los servidores de coordinación de Tailscale o Headscale autohospedado
- Rayfish no tiene plano de control central; mantiene el estado de la red como registros firmados transmitidos por P2P
- El plano de datos también es distinto
- Tailscale usa WireGuard, que opera en el kernel
- Rayfish usa datagramas Iroh/QUIC en espacio de usuario
- En velocidad, Tailscale suele tener ventaja
- Como WireGuard corre en el kernel, la diferencia puede ser evidente al transferir grandes volúmenes por enlaces rápidos
- Rayfish intercambia algo de throughput bruto por una arquitectura sin parte central
- Rayfish usa como identidad un par de claves en disco, no una cuenta ni SSO
- Rayfish es joven y se centra en funciones mínimas, mientras que Tailscale es maduro y tiene una amplitud funcional mayor
Diferencias con Yggdrasil
- Yggdrasil ofrece una red IPv6 cifrada de extremo a extremo sin autoridad central
- La diferencia aparece en el último tramo que el usuario debe manejar directamente
- Yggdrasil ofrece una única red global y direcciones IPv6
- Rayfish ofrece redes privadas separadas que el usuario crea y a las que admite miembros
- Rayfish incluye comodidades como códigos de invitación, nombres DNS amigables, firewall por red y prompts de aprobación de ingreso
- Yggdrasil es adecuado para ingenieros con conocimientos de redes, mientras que Rayfish también apunta a usuarios que quieren crear fácilmente una red privada para unas pocas personas
Lo que se puede y no se puede crear
- Rayfish no es una biblioteca, sino una herramienta completa
- No se puede embeber como un SDK dentro de una aplicación
- Es adecuado para casos en los que dispositivos con Rayfish instalado necesitan comunicarse de forma privada
- Un servidor de juegos P2P al que amigos se conectan por nombre
- APIs internas que no estén expuestas a Internet público
- Destinos de backup
- Apps de chat o llamadas entre miembros de la red
- Una base de datos compartida por dos equipos que no deberían verse entre sí
- Las aplicaciones pueden acceder a peers mediante
name.network.ray
- Quienes estén fuera y no tengan Rayfish instalado no pueden acceder a la red, y no hay gateway para externos
Ejemplos de configuración reales
-
Dos departamentos que comparten una base de datos
- Si
payments y analytics se mantienen como redes separadas, los dos departamentos no pueden verse entre sí
- Solo la máquina de la base de datos se une a ambas redes
- En cada red se configura el firewall recomendado para abrir únicamente los puertos necesarios
networks:
payments:
db:
allows:
"*": "tcp:8123,tcp:9000"
analytics:
db:
allows:
"*": "tcp:8123,tcp:9000"
- Cada equipo accede mediante
db.payments.ray o db.analytics.ray
- Las dos redes no saben de la existencia de la otra, y el control de acceso se configura con separación de redes y un host compartido, sin auditoría central de ACL
-
Servidor de Minecraft para amigos
- Si se crea una red cerrada y se invita a los amigos, pueden conectarse por nombre sin direcciones IP, port forwarding ni DNS dinámico
ray create --name mc
ray invite mc
- Los clientes se conectan a
mc-host.mc.ray:25565
-
Grupo cerrado donde todos abren un puerto
- Si todos los miembros deben abrir TCP 6969, el administrador puede proponer la regla una sola vez
ray firewall suggest mc --subject '*' --allow '*:tcp:6969'
- Cada miembro revisa la regla propuesta y la acepta o la rechaza
ray firewall pending mc
ray firewall accept mc
- Las sugerencias de firewall no son reglas obligatorias; si un miembro no quiere aceptarlas, puede rechazarlas
Seguridad y manejo de direcciones
- Las direcciones IP no las asigna un servidor, sino que se derivan de la identidad criptográfica de cada peer
- Las colisiones de direcciones son muy raras, pero si ocurren, el coordinador ubica al segundo peer en el siguiente slot libre
- Todos los peers convergen de forma determinista en la misma asignación de direcciones sin un asignador central
- Rayfish construye la seguridad con dos elementos, en lugar de una ACL central
- Segmentación, para que solo puedan comunicarse peers que comparten la misma red
- Firewall por red en cada dispositivo
- Para aislar
prod y dev, basta con crear dos redes
- Los hosts que pertenecen a varias redes llevan su propio firewall en cada una
Necesidad de servidores y puertos abiertos
- No hace falta alojar un servidor de control separado
- El coordinador que creó la red puede estar offline después de que todos los miembros se hayan unido
- Iroh maneja la travesía de NAT y el hole punching, y si una ruta directa no es posible, usa un fallback a relay cifrado
- Si se controla el router y se quiere una ruta directa garantizada hacia una máquina específica, se puede hacer port forwarding del puerto UDP fijo de Rayfish, pero es opcional
Planes futuros y casos donde no encaja
- Actualmente se ofrece como herramienta de línea de comandos para escritorios y servidores
- El próximo trabajo es expandirse a los dispositivos que los usuarios realmente llevan consigo
- Cliente para Android
- Cliente para iOS
- Una app de escritorio en serio
- Al mismo tiempo, se trabaja en fortalecer las funciones existentes para que puedan usarse en producción sin preocupaciones
- Si Tailscale, la VPN corporativa o una mesh WireGuard configurada directamente ya funcionan bien, no hay muchos motivos para cambiarse a Rayfish
- Rayfish es más joven y tiene menos funciones, y las herramientas existentes ofrecen muchas funciones con mayor pulido
- Rayfish elimina una sola cosa
- Cuentas
- Una empresa que pueda apagar la red
- Un servidor de control que deba permanecer encendido
- Una base de datos de políticas operada por otra persona
Cómo empezar
- La instalación comienza con un comando de una línea
curl -fsSL https://rayfish.xyz/install.sh | sh
- La creación de la primera red y el proceso de invitación continúan en la documentación
1 comentarios
Opiniones en Lobste.rs
Me gusta mucho que Rayfish asuma desde el inicio que va a manejar más de una red al mismo tiempo.
En Tailscale, esto parece no ser una prioridad, así que podría ser una ventaja bastante grande.
Me sorprendió la parte de que nació como spin-off de una empresa de trading de alta frecuencia, y es incorrecto decir que Tailscale gana en velocidad porque “el plano de datos de WireGuard corre en el kernel”. Tailscale no usa WireGuard en el kernel, pero la gente sigue creyendo eso.
Dijo que “las ideas, el producto y las frases son míos”, pero es una lástima que el repositorio tenga un
CLAUDE.md. Aun así, si uno mira el resumen de contribuciones, clod tiene 1,017++ / 383-- líneas y el autor 104,786++ / 47,064-- líneas, así que no parece que la mayor parte del código haya sido hecho a la ligera con IA. De todos modos, no sé si por 1/100 del trabajo valía la pena dejar ese rastro en el repositorio.Hasta ahora, he visto que Iroh se usa sobre todo de formas simpáticas pero no muy útiles; quizá esta sea justo esa app.
Esto también parece no ser una prioridad en Tailscale.
El producto en sí se ve realmente genial, y lo único que me impide reemplazar mi mesh de Tailscale es la falta de un cliente para Android.
Dicho eso, el texto me molestó un poco porque se lee como si al menos una parte hubiera sido escrita por IA.
Y parece que también publican una build APK de depuración en la etiqueta nightly: https://github.com/rayfish/rayfish/…
Yo también vi este artículo hace 5 minutos, así que no sé más allá de esos enlaces si realmente funciona.
La comparación con Yggdrasil es pobre y además tiene errores de hecho. Aunque la testnet de Yggdrasil opera como una red global, eso es solo un resultado práctico de la topología de Yggdrasil.
Puede aceptar dinámicamente cualquier conexión entre dos conjuntos de claves separados, y la única diferencia entre dos redes Yggdrasil separadas y una red grande es si están intercambiando mensajes entre sí. Cualquiera puede crear una red Yggdrasil privada.
Las claves son criptográficamente imposibles de adivinar, pero no creo que eso implique servicios ocultos. Los nombres de dominio son arbitrarios, aunque mucha gente apunta el DNS global al espacio de direcciones de Yggdrasil.
Si el punto es que “si solo quieres una red con tres amigos para un servidor de juegos, con Yggdrasil hay mucho que ensamblar”, entonces sorprende más bien que no haya comparación con tinc, que es casi el estándar para tres amigos y un servidor de juegos.
A eso se refiere la explicación de que no existe el concepto de crear una red privada separada y admitir personas, ni funciones de conveniencia como códigos de invitación, nombres DNS amigables, firewalls por red o prompts de aprobación cuando alguien intenta entrar. Si eres ingeniero de redes, quizá no sea un problema.
Otro punto que falta en la comparación con Yggdrasil es que Rayfish aprovecha el NAT hole punching de Iroh, de modo que dos peers pueden comunicarse aunque ninguno de los dos sea accesible públicamente.