O teu cliente está configurado para UDP, o servidor Nginx ten un bloque location que apunta ao porto da VPN e non chega nada. É de esperar: un location de HTTP non pode transportar un datagrama UDP, por moito que reciba outro nome a interface. Nginx necesita un listener de stream para isto, e unha vez que movas alí a configuración, un segundo conxunto de detalles decide se unha sesión sobrevive.

A capa de proxy vai antes ca o enderezo

O módulo stream de Nginx fai proxy de TCP e UDP sen analizar HTTP. O seu módulo HTTP espera unha liña de petición, cabeceiras e unha resposta, e nada diso existe nun datagrama OpenVPN nativo. Escoller a capa é, polo tanto, a primeira decisión, e é independente de que o listener sexa IPv4 ou IPv6.

Unha configuración que parece funcionar con OpenVPN en TCP non di nada do caso UDP. Aquí o transporte forma parte do protocolo, non é un detalle do despregamento.

O listener e o backend

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

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

Confirma que a compilación inclúe o módulo stream antes de editar nada; un paquete de distribución pode separalo nun módulo á parte, e un módulo ausente produce un erro de configuración en lugar dun túnel. Pon o bloque no contexto principal de configuración, non dentro de http, e substitúe o enderezo de documentación polo backend real.

Tanto as dúas rutas como os dous cortafogos teñen que permitir os datagramas: o camiño ata o listener e o camiño do proxy ata o backend. Un listener IPv6 tampouco crea un camiño IPv4, así que se algúns clientes aínda usan IPv4, ese listener é unha entrada aparte coas súas propias probas. Comproba o cortafogo do propio backend desde o enderezo do proxy, non desde o teu portátil.

Os tempos de espera de sesión non son os de petición

O proxy stream garda estado para unha sesión UDP e descártao segundo o seu tempo de espera e a súa configuración de respostas. Un tempo de espera curto copiado dun relé DNS encaixa mal nunha VPN que espera intercambiar datagramas durante horas, e o fallo aparece como unha conexión que morre en silencio en vez de unha que se nega a arrancar.

Le o proxy_timeout efectivo do despregamento e calquera axuste de reconto de respostas, e despois compáraos co comportamento keepalive que a VPN usa realmente. Dous números escritos en ficheiros distintos por persoas distintas é o estado normal dun sistema que funciona. Dous números que nunca se compararon é o estado normal dun sistema intermitente. Escribe ambos no rexistro do servizo para que a comparación ocorra unha vez, á luz do día.

Que cambia o relé e que non

O proxy stream non remata a canle de control TLS de OpenVPN nin a converte en HTTPS. O backend segue sendo o servizo VPN, e a relación do certificado segue entre o cliente e ese servizo. Preservar a identidade de backend prevista segue sendo traballo do cliente e do servidor.

O proxy ordinario tamén cambia o enderezo de orixe que ve o backend. Os rexistros amosarán o proxy, e calquera regra de acceso baseada en IP no servidor VPN avaliará ese enderezo en vez do do cliente. Preservar a orixe de forma transparente é un deseño á parte de enrutamento e privilexios, non algo que derive de engadir udp a un listener. Planifícao antes de escribir unha política que dependa do enderezo do cliente.

Verifica desde o cliente, non desde o porto

Unha comprobación local de que o porto UDP está aberto demostra que o listener existe. Non demostra que un cliente poida autenticarse a través del ou seguir intercambiando tráfico. Completa unha conexión real desde un cliente aprobado e despois confirma que a sesión se mantén o tempo suficiente para importar.

Cando alguén informa de que Nginx non pode facer UDP porque unha ferramenta de relé sinxela funcionou no seu lugar, os dous feitos non teñen relación. A ferramenta demostrou que o backend responde; non dixo nada sobre o que admite a interface. Ambas as dúas cousas poden ser certas, e só unha delas é unha configuración para este despregamento.

Artigos relacionados