Rendimiento de OpenVPN: ¿cuántos clientes simultáneos son posibles?

37

Estoy evaluando un sistema para un cliente donde muchos clientes OpenVPN se conectan a un servidor OpenVPN. "Muchos" significa 50000-1000000.

¿Por qué hago eso? Los clientes son sistemas integrados distribuidos, cada uno sentado detrás del enrutador dsl de los propietarios del sistema. El servidor debe poder enviar comandos a los clientes. Mi primer enfoque ingenuo es hacer que los clientes se conecten al servidor a través de una red openvpn. De esta manera, el túnel de comunicación seguro se puede utilizar en ambas direcciones.

Esto significa que todos los clientes siempre están conectados al servidor. Hay muchos clientes que resumen a lo largo de los años.

La pregunta es: ¿explota el servidor OpenVPN cuando llega a un cierto número de clientes? Ya conozco un límite máximo de número de conexión TCP, por lo tanto (y por otras razones) la VPN tendría que usar el transporte UDP.

Gurús de OpenVPN, ¿cuál es su opinión?

Steffen Müller
fuente
¿Podría compartir sus conclusiones finales sobre esto con nosotros? ¿Has podido hacer pruebas con más de 5.000 usuarios?
Philipp
Hola Philipp, abandonamos el plan OpenVPN ya que estaba claro que tocaríamos terreno que nadie ha tocado antes. Optamos por una conexión de socket TCP normal basada en SSL a un servidor de gestión de conexión Node.js.
Steffen Müller

Respuestas:

25

Dudo que alguna vez se haya intentado una configuración tan grande, por lo que probablemente superará los límites al intentarlo. Pude encontrar un artículo sobre una implementación de VPN para 400 clientes, pero a juzgar por el texto, el autor se basó en estimaciones aproximadas sobre cuántos clientes podrían ejecutarse por CPU y no entendió cómo funcionaría su configuración.

Principalmente deberías considerar estos dos puntos:

  1. El ancho de banda que usarán sus transferencias de datos necesitaría cifrado / descifrado en el lado del servidor VPN, consumiendo recursos de la CPU

  2. Las conexiones de cliente OpenVPN consumen recursos de memoria y CPU en el servidor incluso cuando no se transfieren datos

Cualquier hardware de PC decente disponible hoy debería saturar fácilmente un enlace Gigabit con Blowfish o AES-128, incluso los dispositivos integrados de $ 100 son capaces de alcanzar velocidades cercanas a los 100 Mbps , por lo que los cuellos de botella de la CPU debido a la intensidad del ancho de banda no deberían ser motivo de preocupación.

Dado el intervalo de reescritura predeterminado de 3600 segundos, un número de 1,000,000 de clientes significaría que el servidor necesitaría poder completar 278 intercambios de claves por segundo en promedio. Si bien un intercambio de claves es una tarea bastante intensiva de la CPU, podría descargarlo en hardware dedicado si es necesario: las tarjetas de aceleración criptográficas disponibles cumplen y superan fácilmente este número de apretones de manos TLS. Y las restricciones de memoria no deberían molestar demasiado también: un binario de 64 bits debería encargarse de cualquier restricción de memoria virtual que de lo contrario podría afectar.

Pero la verdadera belleza de OpenVPN es que puede escalarlo con bastante facilidad: simplemente configure un número arbitrario de servidores OpenVPN y asegúrese de que sus clientes los estén utilizando (por ejemplo, mediante DNS round-robin), configure un protocolo de enrutamiento dinámico de su elección (normalmente esto sería RIP debido a su simplicidad) y su infraestructura sería capaz de soportar un número arbitrario de clientes siempre que tenga suficiente hardware.

el wabbit
fuente
Gracias por la respuesta concisa. ¿Ves alternativas al uso de openvpn? El objetivo principal es simplemente que la comunicación bidireccional pase por el enrutador.
Steffen Müller
2
@ SteffenMüller Si no necesita una pila completa sino solo un canal de control, ¿por qué no usar algo similar a las botnets ? Las implementaciones están disponibles y el SANS ofrece convenientemente un documento sobre cómo configurarlas
the-wabbit
Gracias por el interesante enlace. Desafortunadamente, el bot está utilizando encuestas simples para consultar si el servidor tiene información. Aunque este podría ser el camino a seguir, estoy buscando una manera de establecer y mantener una conexión bidireccional. El sondeo constante provoca demoras en la ejecución del comando o un alto volumen de datos para solicitudes de sondeo inútiles. ¿Quizás una conexión TCP permanente es el camino a seguir?
Steffen Müller el
1
@ SteffenMüller Las redes de bots han demostrado manejar bien a miles de clientes, por lo tanto, mi sugerencia es investigarlo. No tiene que ir con la implementación específica insinuada por SANS; realmente hay muchos otros. Aparte de eso, sin conocer sus requisitos exactos, es realmente difícil saberlo. Una conexión TCP que envía keepalives seguramente podría asegurarse de que la relación de estado en la puerta de enlace NAT no caduque. Pero necesitaría ocuparse de todo lo demás (autenticación, cifrado, manejo de errores) por su cuenta.
the-wabbit
2
Por cierto, no hay ninguna razón por la que no pueda reducir el intervalo de rekeying (hay una compensación de seguridad, ya que una clave comprometida revelará el texto sin formato hasta la última rekeying). Además, estaría mucho más preocupado por el enrutamiento u otro error de búsqueda de conexión primero. Quiero decir, si OpenVPN está destinado a tener <100 conexiones activas, ¿cuál es la posibilidad de que haya una búsqueda O (n) de una conexión en alguna parte?
derobert
26

De hecho, he hecho esto, aunque con "solo" unos pocos cientos de conexiones remotas de manera similar detrás de los enrutadores DSL. No puedo comentar demasiado sobre los problemas de rekekeing, pero aprendí algunas cosas prácticas en el camino:

1) Al implementar clientes, asegúrese de especificar varios servidores VPN en la configuración del cliente, vpn1.example.com, vpn2.example.com, vpn3 ..... Incluso si solo proporciona uno o dos de estos ahora, usted da usted mismo espacio para la cabeza. Configurados correctamente, los clientes seguirán reintentándolos al azar hasta que encuentren uno que funcione.

2) Utilizamos una imagen personalizada del servidor VPN de AWS, y podemos aumentar la capacidad adicional bajo demanda, y Amazon DNS (R53) maneja el lado DNS de las cosas. Está completamente separado del resto de nuestra infraestructura.

3) Al final del servidor (s), haga un uso cuidadoso de la máscara de red para restringir el número de clientes potenciales. Eso debería forzar a los clientes a un servidor alternativo, mitigando los problemas de la CPU. Creo que limitamos nuestros servidores a aproximadamente 300 clientes. Esta elección fue algo arbitraria de nuestra parte: "instinto" si lo desea.

4) También en el extremo del servidor, debe hacer un uso cuidadoso de los firewalls. En términos simples, tenemos el nuestro configurado de tal manera que los clientes pueden conectarse mediante VPN, pero los servidores no permiten estrictamente todas las conexiones ssh entrantes, excepto desde una dirección IP conocida. Podemos enviar SSH a los clientes si ocasionalmente lo necesitamos, ellos no pueden enviarnos SSH.

5) No confíe en que OpenVPN realice la reconexión por usted en el extremo del cliente. 9 de cada 10 veces lo hará, pero a veces se atasca. Tenga un proceso separado para restablecer / reiniciar openVPN en el extremo del cliente regularmente.

6) Necesita una forma de generar claves únicas para los clientes para que pueda rechazarlas a veces. Los generamos internamente con nuestro proceso de compilación del servidor (PXEboot). Nunca nos sucedió, pero sabemos que podemos hacerlo.

7) Necesitará algunas herramientas de administración, scripts para monitorear las conexiones de su servidor VPN de manera efectiva.

Desafortunadamente, no hay mucho material sobre cómo hacer esto, pero es posible, con una configuración cuidadosa.

Aitch
fuente
Muchas gracias por las ideas. Me sorprende que los problemas de reingreso ya te hayan afectado con 300 clientes ...
Steffen Müller
Para aclarar, no lo han hecho, pero tampoco lo he estado rastreando ...: - / El número "300" parecía razonable. Si tenemos problemas, simplemente aumentaríamos la imagen de AWS a una instancia más grande. Nunca antes había tenido tantas conexiones en un servidor, probablemente solo alrededor de 100 máx., Pero ejecutamos varios servidores y se equilibran aproximadamente en línea con openvpn que elige aleatoriamente un destino de una lista conocida.
Aitch
¿Puede compartir más detalles sobre cómo hacer esto: "5) No confíe en que OpenVPN se vuelva a conectar por usted en el extremo del cliente. 9 de cada 10 veces lo hará, pero a veces se atasca. Tenga un proceso separado para restablecer / reiniciar openVPN en el cliente final regularmente ".
Doug
Lo siento, dejó ese trabajo hace 4.5 años (!), No puedo recordar, pero casi con seguridad algún tipo de lista de procesos, elimine y luego reinicie el servicio.
Aitch
(Hago una configuración similar con actualmente alrededor de 400 dispositivos en un servidor VPN) necesita tomar una decisión sobre qué hacer cuando no se puede alcanzar vpn, se agota el tiempo de espera o se rechaza. el intervalo de reintento aleatorio no lo ayudará para siempre y solo generará tráfico. Dependiendo del problema, debe hacer algo en el cliente, en el firewall / DSL, que generalmente no puede hacer, y por lo tanto enviar el sistema a una fase de suspensión "meh, transferir datos más tarde", o si el problema es el servidor VPN en sí . Puede estimar eso a través de los registros y decidir en base a eso. Rekeing no es (todavía) un problema para nosotros.
Dennis Nolte
3

Actualización 2018

No estoy seguro de qué ha cambiado todo desde 2012. Solo quería dar una actualización de mi experiencia en 2018. Hemos implementado una red openvpn muy similar a la configuración de OP. Nuestros puntos finales son PC Linux completos en lugar de dispositivos integrados. Cada punto final tiene un monitor que se utiliza para mostrar información y alarmas para ese sitio y nuestro servidor nos permite un único punto remoto en todos los puntos finales. La red no está demasiado activa, pero a veces tiene de 5 a 10 sesiones remotas simultáneamente.

Usando una compilación actual de openvpn en alrededor de 100 clientes en una imagen azul con un solo núcleo y 2 gb de ram, usamos alrededor del 0.7% de memoria en promedio y el uso de la CPU es casi siempre del 0%. Según lo que encontré para esta prueba más pequeña, imagino que un solo servidor con especificaciones decentes manejaría fácilmente 50000 concurrentes si tuviera el RAM para soportarlo. Si el uso de RAM se escalara linealmente, entonces 16 gb podría manejar 50000 usuarios con suficiente extra en una máquina dedicada openvpn.

No estamos a una escala lo suficientemente grande como para decir eso con una confianza significativa, pero solo quería dar una actualización reciente ya que cuando desplegué originalmente nuestra red encontré esto y esperaba mucho más uso de recursos a esta escala. Ahora, creo que la CPU que ejecuta esto tiene cifrado de hardware y no estoy seguro de en qué punto se sobrecargaría el tráfico, pero para los puntos finales que no se comunican mucho, esto no debería ser un problema.

En 1000000 necesitaría 200 gb de ram en una sola máquina (si se escala linealmente con extra), mientras que esto es posible, creo que en ese momento desearía tener 5 máquinas cada una con 64 gb de ram para que no tenga un solo punto de fracaso Esto debería permitir el mantenimiento, reinicios y reemplazos de 1 o incluso 2 máquinas sin problemas importantes.

Es probable que mis estimaciones de ram sean excesivas ya que estoy dividiendo todo el uso de openvpn por el número de clientes donde solo una parte de ese ram se debe a los clientes.

Hemos agregado 74 puntos finales en un año desde su implementación inicial. Espero seguir aumentando significativamente ese número y haré una nueva actualización si llegamos a una escala decente.

CraigZ
fuente
¿Puede compartir más detalles sobre cómo hacer esto: "5) No confíe en que no me dejará comentar sobre el hilo anterior, pero quería responder esto: OpenVPN hace la reconexión por usted en el extremo del cliente. 9 de cada 10 veces lo hará, pero a veces se atasca. Tenga un proceso separado para restablecer / reiniciar openVPN en el cliente regularmente ". - Doug 18 de mayo de 17 a las 17:12
CraigZ
Llega a un límite de personaje. Use el supervisor para hacer esto. Haz que se reinicie automáticamente cada 6-12h
CraigZ
1

Estoy investigando un problema similar, aunque el número de clientes sería de cientos, tal vez de un par de miles.

Pensé que no puedo mantener a todos los clientes conectados todo el tiempo.

Estoy pensando en iniciar el demonio OpenVPN en clientes a intervalos de tiempo aleatorios para que puedan verificar si fueron encuestados. Si lo fueran, deben enviar un correo electrónico o algo que están en línea y enviar paquetes de mantener vivo durante un período de tiempo para que pueda conectarme con ellos.

Si no hay tráfico durante algún tiempo, se detendría el demonio.

El problema que estoy enfrentando en este momento es que parece imposible obtener una lista de los clientes VPN actualmente conectados ...

Davor Dundovic
fuente
1
Puede obtener una lista actual de clientes conectados a través del registro de estado de openvpn. Allí verá todos los ips conectados al servidor actual.
Fa11enAngel