Post-Image

Rendimiento de Wireguard e IPSec usando Mikrotik Hex y OPNsense

En la actualidad uno de los tuneles VPN más usados por las empresas para el enlace entre diferentes localizaciones es IPsec, este sistema ha sido el más utilizado por su estabilidad y cifrado. Actualmente yo estoy utilizando este sistema para conectar dos localizaciones diferentes usando el siguiente esquema:

Mikrotik Hex (https://mikrotik.com/product/RB750Gr3) <–> OPNsense (en una VM - 8 vCPU - 2GB RAM)

Tras conocer que existe una nueva implementación que permite realizar tuneles VPN y que se incluye directamente en el Kernel de GNU/Linux he empezado a investigar para probar si me convenía cambiar mi sistema actual por uno más moderno, seguro y rápido.

Tras leer en varios sitios que Wireguard mejora en todos los aspectos a IPsec me propuse intentar crear un enlace de prueba para testear estas características. En primer lugar tuve que comprobar si ambos equipos soportaban este nuevo sistema, para mi sorpresa para OPNsense existe un plugin que lo habilita y en Mikrotik en la versión de desarrollo parece que también existe la posibilidad de utilizarlo (en el momento de escribir este articulo se trata de una características todavía en proceso de desarrollo)

Para las pruebas he puesto en modo servidor una máquina virtual alojada en la subred del nodo de OPNsense con el comando “iperf -s” y desde un nodo alojado en la subred del Mikrotik he ejecutado “iperf -c <server_ip>

Grafico velocidades IPERF Tener en cuenta que los datos mostrados son obtenidos con iperf-2

Los datos obtenidos son los siguientes:

Wireguard

MTU: 1280 - ChaCha20 - 24.3 Mbits/sec

MTU: 1384 - ChaCha20 - 37.1 Mbits/sec

MTU: 1387 - ChaCha20 - 41.1 Mbits/sec

MTU:1420 - ChaCha20 - 36.1 Mbits/sec

IPsec

MTU: 1490 - SHA1 - AES 128 CBC - modp1024 - 108 Mbits/sec

MTU: 1490 - SHA256 - AES 256 CBC - modp2048 - 97.5 Mbits/sec

Como se puede comprobar en Wireguard parece que oscilan entre valores similares con un MTU superior a 1300 entre 36 Mbits/s y 41 Mbit/s, en lo referente a IPsec vemos que los valores son más elevados y con mejoras en cuanto el cifrado es menor. Cabe decir, que los cambios en el MTU los hice para comprobar si realmente afectaba tal y como se indica en la web https://gist.github.com/nitred/f16850ca48c48c79bf422e90ee5b9d95 en mis pruebas los cambios son son tan destacados como se muestran ahí

En ambos túneles obtenemos unos resultado de latencia bastante similares ya que siempre obtengo los mismo valores, en torno a los 30ms.

En un intento de obtener una tasa de transferencia real he realizado unas pruebas de transferencia de un fichero de 4GB utilizando rsync y los datos obtenidos reflejan un resultado similar.

Grafico velocidades RSYNC

Wireguard

MTU: 1384 - ChaCha20 - 4.72MB/s

MTU: 1384 - ChaCha20 - 6.68MB/s

MTU: 1387 - ChaCha20 - 4.68MB/s

MTU: 1420 - ChaCha20 - 6MB/s

IPsec

MTU: 1490 - SHA1 - AES 128 CBC - modp1024 - 17MB/sec

MTU: 1490 - SHA256 - AES 256 CBC - modp2048 - 10MB/s

En lo referente a Wireguard se obtienen unas oscilaciones entre 3MB/s y 6MB/s en todas las pruebas, sin embargo, con el tunel IPsec obtenemos más del doble de tasa de transferencia.

En resumen, en el escenario que planteamos, a mi no me favorece cambiar el sistema que estoy usando hasta la actualidad ya que la perdida en tasa de transferencia sería más que evidente, seguramente la bajada de rendimiento en lo que respecta a Wireguard venga dada por que el Mikrotik tiene una CPU bastante limitada como para soportar cifrados potentes, y dado que el nuevo sistema utiliza cifrados más complejos cabe esperar que la diferencia venga dada por este motivo. Por otro lado, hay que destacar que tanto en Mikrotik como en OPNsense el servicio de Wireguard se encuentra en un estado de desarrollo lo que puede indicar que no está todavía al completo para poder utilizarlo con todo su potencia (esta premisa hay que tenerla en cuenta a dia 4/11/2021)

Actualización - 5/11/2021

Desde Twitter @javierprovecho me comenta algo muy interesante acerca de Wireguard y OPNsense:

OPNsense está basado en BSD.

Wireguard dispone de dos tipos de implementaciones, kernel module y user space.

La primera tiene el mejor rendimiento pero creo que solo existen módulos para Linux.

La segunda es más flexible a costa de rendimiento, una de las implementaciones está hecha en Go, y se puede compilar a todos los targets que soporte.

El plugin de Wireguard de OPNsense utiliza wireguard-go

Por ello IPSec resulta ganador en este escenario, porque está comparándose un módulo del kernel con un proceso user space normal.