Marcar los paquetes que pasan por el túnel OpenVPN y manejarlos de manera diferente en el lado del servidor


0

Necesitaría crear una configuración OpenVPN cliente-servidor tal que en el lado del cliente a cada paquete IP se le asignen algunos metadatos (por ejemplo, un ID o nombre) y en el otro lado, cada uno de ellos se maneja de manera diferente en función de los metadatos que tienen asignados. con. Para enviar los metadatos, se me ocurren dos maneras:

  • Usando el campo ToS, aunque es pequeño.
  • Anexando a la carga útil y, por lo tanto, cambiando la longitud / suma de comprobación / ...

¿Hay una mejor manera de marcar cada paquete? ¿OpenVPN proporciona una solución para este requisito?

En el lado del servidor (es decir, en el lado del servidor OpenVPN), ¿hay alguna forma de aprovechar el mecanismo existente para el tipo de MITM de cada paquete? Para ser más exactos, necesito leer cada metadato (con el que viene cada paquete IP) y registrar algunas estadísticas de clasificación o firewall.

¿OpenVPN proporciona una solución limpia para esto? De lo contrario, ¿debería tocar el código del lado del servidor OpenVPN y construirlos por mi cuenta?

+------+   + ----+   +--------+           +--------+   +-----+    +----------+
| apps |---| tun |---| socket | ========= | socket |---| tun | ---| Internet |
+------+   +-----+   +--------+           +--------+   +-----+    +----------+
                   ^                                 ^
                   |                                 |
here packets are marked by my custom OpenVPN client  |
                                                     |
                        here I'd need to firewall packets based on the "metadata"

Por favor, agregue una etiqueta del sistema operativo. P.ej. en Linux, usarías iptables o tc Manipular paquetes y crear estadísticas. Esto no tiene nada que ver con una VPN o OpenVPN específicamente. También tenga en cuenta que una forma más fácil de agregar "metadatos" es usar diferentes direcciones de origen IP (lo que es fácil de hacer).
dirkt

@dirkt Agregado etiqueta de Linux. Tienes razón, pero mi situación tiene que ver con OpenVPN. ¿Hay alguna manera de sentarme entre el deamon de OpenVPN y su tun Interfaz e interceptar paquetes allí? Quiero decir. Necesitaría filtrar algunos paquetes según sus "metadatos" y decidir cuáles deberían enviarse a tun y cuáles no deberían.
Hi I'm Frogatto

Eso es exactamente lo que iptables es para. Busque tutoriales en Google o agregue información específica sobre exactamente lo que desea hacer (qué tipo de "metadatos" agregar desde qué fuente / condiciones, qué decisiones tomar sobre esos "metadatos").
dirkt

@dirkt lo sé iptables y situaciones para las que se debe utilizar. Sin embargo mi situación es un poco diferente. iptables puede decidir según el TCP / IP conocido o cualquier otra característica, no mis "metadatos" personalizados incrustados en algún lugar del paquete IP. Ese metadato debería ser interpretado por mí, iptables no puede manejarlo. Así que necesitaría poner mi integración de firewall en algún lugar entre el puerto UDP de escucha OpenVPN y su asociado tun. Para solucionar el problema, puede pensar en esos "metadatos" como el PID que el cliente OpenVPN proporciona e integra en el paquete IP.
Hi I'm Frogatto

1
Que quieres decir con "manejado de manera diferente" ? Diferentes decisiones de enrutamiento, filtrado, ¿algo más?
sebasth

Respuestas:


1

Si tiene un cliente OpenVPN personalizado, deberá manejar la marca de la manera que decida hacerlo allí, escribiendo el código. Tenga en cuenta que el PID del proceso que originó el paquete no está disponible para el cliente OpenVPN y, de hecho, puede que no esté disponible como una propiedad del paquete. Deberá colocar los procesos en el cliente en espacios de nombres de red o similares para obtener dicha información.

Si desea otros tipos de "metadatos", especifique lo que desea.

En el lado del servidor, iptables puede hacer todo lo que quiera sin la necesidad de modificar el servidor OpenVPN. Puede coincidir en ToS con --tos, puedes igualar en TTL con --ttl-*, puedes hacer coincidir en cualquiera de los cuatro bytes con --u32, o puede ejecutar un programa de filtro BPF completo con --bytecode Usted decide agregar extensiones de encabezados o lo que sea. Para paquetes coincidentes, puede colocarlos en la interfaz de salida deseada, puede marcarlos internamente y enrutarlos, o cualquier otra cosa que desee. Ver man iptables-extensions para detalles.

Así que esa parte es fácil, la parte difícil es averiguar qué tipo de metadatos desea además del PID en primer lugar, y luego encontrar una manera de agregarlos a los paquetes si el cliente OpenVPN no tiene realmente una manera de obtener este metadata.

Editar

Para una máxima flexibilidad, puede definir su propio Opción IP y agréguelo a cada paquete IPv4 después del encabezado del paquete. Esto agregará una sobrecarga notablemente, y también puede causar más fragmentación (no sé cómo OpenVPN maneja la fragmentación dentro del túnel VPN).

En principio, también puede devolver el paquete al espacio de usuario con el NFQUEUE objetivo. Si haces eso para cada paquete, será glacialmente lento, por lo que te recomiendo encarecidamente que no lo hagas.

Si realmente desea "ejecutar su propio script" (espero que no sea un script de shell) para cada paquete, lo mejor sería modificar el servidor OpenVPN, también.

Todavía no conozco el caso de uso que tiene para esto, pero por su descripción hasta ahora de sus planes, estoy bastante seguro de que esto no va a funcionar, porque todo se reducirá a un rastreo. Por favor, reconsidere lo que está tratando de hacer, especifique el caso de uso (¿qué quiere lograr?) Y encuentre alguna solución en el espacio del kernel usando iptables, y posiblemente varios clientes y servidores OpenVPN si desea alguna segregación.

Generalmente tiene clases de usuarios / procesos, donde desea permitir que algunos de ellos hagan algo y manejar a otros de manera diferente. Asigne los usuarios / procesos a las clases y maneje las clases en el espacio del kernel. No intente manejar la asignación a clases agregando esta información a cada paquete.

Buena suerte, la vas a necesitar.

Editar

Debo añadir que uno suele pensar en la colección de todos. iptables reglas tanto como el "lenguaje de scripting" (las reglas en una cadena se procesan paso a paso, uno puede saltar a otras cadenas) y la "base de datos" para la mayoría de los propósitos Por supuesto, la "base de datos" no debería ser demasiado grande. Si desea cambiar la "base de datos", agregue o elimine reglas en una cadena creada para ese propósito.

La velocidad es importante cuando se manejan paquetes (el kernel obtiene una mucho de paquetes por segundo), y la conmutación entre el espacio de usuario y el espacio del núcleo es costosa en términos de velocidad. Está bien hacerlo una vez, como en la interfaz tun / tap de OpenVPN, que tiene su propio búfer, pero más de una vez no debería ser necesario.


Hace iptables ¿Me permite ejecutar mi propio script para tomar la decisión de cada paquete IP? De hecho, en el script debería poder leer todo lo que necesito del paquete, consultar alguna base de datos y finalmente informar. iptables de mi decisión para el paquete IP que se está pasando actualmente.
Hi I'm Frogatto

1

SELinux etiquetado de redes le permite escribir un tráfico de etiquetado de políticas hasta el proceso que lo genera. La política en el host remoto realiza decisiones de acceso / filtrado en función del etiquetado. Sin embargo, Labeled Networking solo es compatible con las etiquetas IPSec y CIPSO, no directamente en OpenVPN.

Si está reenviando el tráfico, probablemente debería considerar extender OpenVPN con su propia lógica, en lugar de intentar tomar las decisiones de control de acceso en otro lugar. Si todo el tráfico entrante es para su aplicación, debería considerar tomar todas las decisiones de control de acceso allí.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.