LaOtraRed vía Internet (VPN)

Hola,
Ahora mismo no hay muchos enlaces físicos dentro LaOtraRed, y mientras los miembros que mantenemos un nodo LOR vayamos conectándonos por Wi-Fi, estamos usando una VPN para estar en contacto, usar servicios y mantener una tabla de enrutamiento completa. En la actualidad son 4 miembros dentro el VPN: Mi nodo en Alto Sopocachi, el nodo Chersky de @strysg, el nodo r00thouse y el servidor Galileo, del Hacklab.

Tenemos planes para Meshnet: esperamos que más gente (en La Paz o quizás afuera) pueda unirse a LaOtraRed, y necesitamos arreglar todos los detalles.


El nombre en código del sistema VPN actual es Meshnet, utiliza el protocolo VPN de tinc, y dentro el túnel los nodos ejecutan sesiones Babel.

Ventajas actuales:

  • Puede agujerear NATs
  • Es un protocolo 100% mesh: si A, B, C se conectan inicialmente a Z, nodos no directos como A y B pueden hablar directamente.
  • Permite cifrado y verificación hash de los paquetes que circulan dentro la VPN.
  • El protocolo provee una red de capa 2, asi que protocolos como babeld, EIGRP y etc. pueden funcionar.

Desventajas

  • tinc funciona en el espacio de usuario, y utiliza tun/tap para comunicarse con el kernel. Eso es muy ineficiente y lastra el rendimiento dentro el túnel, además de utilizar mucho CPU. Los efectos son aún más notorios cuando el software se ejecuta en routers.
  • Al igual que en LOR via Wi-Fi, babeld no provee ninguna medida de seguridad ante una mala configuración accidental, o ataques muy básicos (suplantación o anuncio de rutas sin asignar). Antes un atacante necesita acercarse a un router y saber ciertas claves para atacar LOR, ahora podría hacerlo sin salir de su cuarto.
  • La versión 1.0 de tinc (super estable) tiene algunos problemas de seguridad propios del diseño (los creadores, en ese entonces hicieron sus propios métodos caseros de autenticación y negociación). La versión 1.1 (beta) mejora eso, pero tiene algunas características que lo hacen negativo para LOR (como forzar AES-256 y SHA256, en routers eso es catastrófico)

Recientemente he estado probando Wireguard, y tiene las siguientes ventajas:

  • La implementación principal es un módulo de kernel, y es muy eficiente. En mis pruebas, llega a 8192Kbps usando 35% de CPU de un router Atheros a 400MHz. Tinc solo llega a 6900Kbps al 100% de CPU en el mismo router.
  • Utiliza protocolos y estándares modernos, que van muy bien en sistemas embebidos.
  • La configuración es sencilla.
  • Wireguard te permite asociar un a clave pública a direcciones IPv4 e IPv6: no es posible suplantar direcciones dentro.
  • La red es de capa 3 – La configuración se simplifica, y no es necesario preocuparse de broadcast o algo así.

Desventajas:

  • La red de capa 3 no permite IPv6 multicast – es decir, babeld no funcionará. Quizás con anuncios unicast, pero eso le quitaría ventajas.
  • No es 100% mesh: si A,B,C están conectados a X, los paquetes de A a C pasarán por X.
  • Wireguard es sólo-UDP. Líneas de Internet desde red móvil (4G) o ISPs como Tigo (HFC) podrían tener mala conexión a Meshnet, o quizas ni se puedan unir.
  • Si usamos otro protocolo, entonces no podríamos tener roaming completo entre Meshnet y LOR. Es decir, un nodo Meshnet que se conecta a LOR físicamente, requeriría configuración adicional.

En la actualidad, no sabemos qué camino tomar. También acá se ha filtrado algo de la discusión sobre el routing en LOR (que quizás merezca otro hilo).

Este es un tema algo complejo, si bien Meshnet no es una necesidad primordial en LaOtraRed tiene grandes beneficios.

De las grandes ventajas que mencionas de tinc, resalto que es descentralizada y de la forma que combinas con Babel se crea realmente una VPN Mesh o red en malla VPN (buen trabajo :+1: ), tinc acepta peticiones de inclusión en la VPN y se utiliza Babel para descubrirse.

Sin embargo, por la misma vulnerabilidad de Babel a suplantación de identidad la VPN entera puede comprometerse, en todo caso sería necesario tinc 1.1 a pesar de su “pesadez”.

Me parecen muy interesante Wireguard y también muy explotable, sin embargo se depende de servidores para que otros nodos se comuniquen como describe wireguard. Si entendí bien; para que un nuevo nodo se una a la VPN hay que agregar entradas en los servidores wireguard para ese nuevo cliente, quizás se puede facilitar eso implementando un servicio web llenando un formulario y se agregue la entrada.

Babel se ha estado actualizando con una nueva especificación https://tools.ietf.org/html/draft-ietf-babel-rfc6126bis y la implementación esta siendo desarrollada rápidamente al parecer. En el nuevo Babel se introduce le concepto de Unicast Hello que son anuncios para que los nodos se descubran enviando mensajes vía unicast. ¿Podrías comentar un poco sobre las desventajas de anuncios unicast?

El asunto es complicado, por el momento no he pensado en proponer tinc1.1 (aunque la alternativa esta ahí), aún quiero conservar la libertad de qué cifrado elegir.

Podemos solucionar éso exigiendo a los nodos LOR que quieran participar en Meshnet, un aparato medianamente potente. Un Raspberry Pi Zero con ethernet-over-usb podría funcionar bien, también lo harían routers potentes como el Linksys del Hacklab (también ARM) o routers basados en Mediatek MT7621 (800MHz dual-core).

Viendo como la velocidad de Internet crece, esto dejaría sin soporte oficial Meshnet a 1) routers MIPS con menos de 700MHz, y a 2) todos los routers Atheros hasta la actualidad.
El experimento que yo hacia para llevar LOR a casas normales con routers A5-V11 (320MHz) o MR3020 v2 (400MHz) ya no sería factible.

El funcionamiento en Wireguard es similar al de tinc: no existen servidores o clientes VPN, sólo nodos. Si quieres conectarte a una VPN, hay que intercambiar claves públicas con cualquier otro par: eso ya los hace casi mesh a ambos.

(podemos nosotros diferenciar artificialmente “servidores VPN” y clientes, revisando quiénes tienen IP pública y quiénes no. Los últimos no pueden recibir conexiones entrantes, por lo tanto se quedarían como “clientes”, pero el software sería el mismo)

Dentro de una VPN, tinc ya puede intercambiar claves nuevas con otros nodos y conectarse directamente de forma automática: eso ya lo hace ideal para mesh. Wireguard no, solo puede conectarse a los pares explícitamente configurados.

No sé cómo se implementaría eso en babeld, pero la idea de multicast, en nuestro caso, es:

  • Ahorrar ancho de banda: un router envía UN paquete a la Red, y varios routers lo procesan.
  • Descubrir routers nuevos

En LOR es necesario ir descubriendo gente nueva dentro el túnel todo el tiempo. Además, hasta donde sé, babeld necesita descubrir por sí mismo vecinos para ajustar las métricas a otros routers (midiendo latencia, packet loss o ruido del canal Wi-Fi), no sé si los anuncios unicast de otros routers completen eso.

Quizás se pueda solucionar eso dentro Wireguard metiendo más túneles dentro (con VXLAN o GRE), pero por el momento creo que lo mejor es quedarnos con tinc.