Su cliente está configurado para UDP, el servidor Nginx tiene un bloque location que apunta al puerto de la VPN y no llega nada. Es de esperar: un location de HTTP no puede transportar un datagrama UDP, por mucho que se llame distinto el front end. Nginx necesita un listener de stream para esto, y una vez que mueva allí la configuración, un segundo conjunto de detalles decide si una sesión sobrevive.

La capa de proxy va antes que la dirección

El módulo stream de Nginx hace proxy de TCP y UDP sin analizar HTTP. Su módulo HTTP espera una línea de petición, cabeceras y una respuesta, y nada de eso existe en un datagrama OpenVPN nativo. Elegir la capa es, por tanto, la primera decisión, y es independiente de que el listener sea IPv4 o IPv6.

Una configuración que parece funcionar con OpenVPN TCP no dice nada del caso UDP. Aquí el transporte forma parte del protocolo, no es un detalle del despliegue.

El listener y el backend

nginx -V 2>&1 | tr ' ' '\n' | grep stream

stream {
    server {
        listen [::]:1194 udp reuseport;
        proxy_pass [2001:db8::20]:1194;
    }
}

Confirme que la compilación incluye el módulo stream antes de editar nada; un paquete de distribución puede separarlo en un módulo aparte, y un módulo ausente produce un error de configuración en lugar de un túnel. Coloque el bloque en el contexto principal de configuración, no dentro de http, y sustituya la dirección de documentación por el backend real.

Tanto las dos rutas como los dos cortafuegos tienen que permitir los datagramas: el camino hasta el listener y el camino del proxy al backend. Un listener IPv6 tampoco crea un camino IPv4, así que si algunos clientes siguen usando IPv4, ese listener es una entrada aparte con sus propias pruebas. Compruebe el cortafuegos del propio backend desde la dirección del proxy, no desde su portátil.

Los tiempos de espera de sesión no son los de petición

El proxy stream guarda estado para una sesión UDP y lo descarta según su tiempo de espera y su configuración de respuestas. Un tiempo de espera corto copiado de un relé DNS encaja mal en una VPN que espera intercambiar datagramas durante horas, y el fallo aparece como una conexión que muere en silencio en lugar de una que se niega a arrancar.

Lea el proxy_timeout efectivo del despliegue y cualquier ajuste de recuento de respuestas, y luego compárelos con el comportamiento keepalive que la VPN usa realmente. Dos números escritos en archivos distintos por personas distintas es el estado normal de un sistema que funciona. Dos números que nunca se compararon es el estado normal de un sistema intermitente. Escriba ambos en el registro del servicio para que la comparación ocurra una vez, a la luz del día.

Qué cambia el relé y qué no

El proxy stream no termina el canal de control TLS de OpenVPN ni lo convierte en HTTPS. El backend sigue siendo el servicio VPN, y la relación del certificado sigue entre el cliente y ese servicio. Preservar la identidad de backend prevista sigue siendo tarea del cliente y del servidor.

El proxy ordinario también cambia la dirección de origen que ve el backend. Los registros mostrarán el proxy, y cualquier regla de acceso basada en IP en el servidor VPN evaluará esa dirección en lugar de la del cliente. Preservar el origen de forma transparente es un diseño aparte de enrutamiento y privilegios, no algo que se derive de añadir udp a un listener. Planifíquelo antes de escribir una política que dependa de la dirección del cliente.

Verifique desde el cliente, no desde el puerto

Una comprobación local de que el puerto UDP está abierto demuestra que el listener existe. No demuestra que un cliente pueda autenticarse a través de él ni seguir intercambiando tráfico. Complete una conexión real desde un cliente aprobado y luego confirme que la sesión se mantiene el tiempo suficiente para importar.

Cuando alguien informa de que Nginx no puede hacer UDP porque una herramienta de relé sencilla funcionó en su lugar, los dos hechos no tienen relación. La herramienta demostró que el backend responde; no dijo nada sobre lo que admite el front end. Ambas cosas pueden ser ciertas, y solo una de ellas es una configuración para este despliegue.

Artículos relacionados