Mejoras de WireGuard en Fly.io
- Fly.io convierte contenedores en VM y los ejecuta globalmente en hardware aprovechando la potencia de Firecracker.
- Usa mucho WireGuard, y ahora forma parte de la API para clientes.
- Cada vez que se ejecuta la CLI
flyctl, crea un stack TCP/IP y se comunica directamente con Fly Machines usando una dirección IPv6 única.
- Este enfoque tiene ventajas y desventajas, y hay varias mejoras.
Situación anterior
- Los servidores "gateway" distribuidos por todo el mundo aceptaban conexiones WireGuard y se encargaban de conectarlas a la red privada adecuada.
- Cada vez que se ejecutaba
flyctl, se creaba o conectaba un proceso de agente en segundo plano.
- El agente generaba una nueva configuración de peer de WireGuard en la API GraphQL.
- La API enviaba la configuración del peer al gateway correspondiente a través del sistema de mensajería NATS.
- En el gateway, el servicio
wggwd recibía la configuración, la guardaba en una base de datos SQLite y la agregaba al kernel.
- La API respondía a la solicitud GraphQL entregando la configuración, y
flyctl se conectaba al peer de WireGuard.
- NATS es rápido, pero no garantiza la entrega ni limpia los peers antiguos que quedan en los gateways.
Una mejor manera
- Almacenar peers de WireGuard no requiere una base de datos compleja.
- Se cambió para que el gateway obtenga la configuración desde la API cada vez que la necesite.
- Los peers se pueden agregar al kernel solo cuando un cliente quiere conectarse, y eliminarse cuando ya no hagan falta.
Hacer posibles los peers JIT de WireGuard
- La interfaz de configuración de WireGuard en el kernel de Linux usa Netlink.
- Los paquetes de solicitud de conexión de WireGuard pueden identificarse e interceptarse con filtros BPF y sockets de paquetes.
- WireGuard no tiene los conceptos de "cliente" y "servidor"; es un protocolo punto a punto.
- Cuando
flyctl envía un paquete UDP al gateway, eso es un handshake initiation.
- Se pueden capturar conexiones entrantes usando filtros BPF.
- Como se basa en el framework del protocolo Noise, hay que descifrar para identificar la solicitud.
- Es posible crear un feed de eventos para obtener las claves públicas de todos los usuarios que intentan conectarse al gateway.
- Cada vez que se detecta un peer nuevo, se obtiene e instala su información mediante una solicitud a una API HTTP interna.
Lanzar apps por minuto
- En Fly.io se pueden desplegar apps rápidamente y obtener su propio peer JIT de WireGuard.
Revisando las gráficas
- Tras operar este sistema durante varias semanas, se redujo notablemente la cantidad de peers antiguos de WireGuard que quedaban en los gateways.
- Los gateways mantienen menos estado y la configuración de peers es más rápida.
- Se comparten gráficos de Grafana para mostrar los buenos resultados del día de la transición.
Opinión de GN⁺
- La mejora de WireGuard en Fly.io es un buen ejemplo de cómo elevar significativamente el rendimiento y la estabilidad de la red.
- Este enfoque puede ser especialmente útil para reforzar la gestión del tráfico de red y la seguridad en servicios basados en la nube.
- Otros proyectos con funciones similares incluyen Tailscale y ZeroTier, que también ofrecen alternativas de VPN para usuarios individuales y empresas.
- Al adoptar WireGuard, hay que considerar la configuración de red, las políticas de seguridad y la compatibilidad.
- Las ventajas de elegir esta tecnología son su alto rendimiento y su configuración sencilla, aunque puede presentar retos en la integración con la infraestructura existente o en su administración.
1 comentarios
Comentarios en Hacker News