martes, 30 de junio de 2020

Permitir conexiones UDP a través de NGINX



Permitir tráfico por un puerto UDP a través de un reverse proxy NGINX.



NGINX usado como reverse proxy permite configurar conexiones TCP más allá de HTTP y HTTPS usando políticas stream; permite, por ejemplo, abrir el puerto 25 (TCP) de la máquina donde corre NGINX y redirigirilo hacia el puerto 25 de nuestro servidor de correo.

Aparte de redirigir puertos TCP, NGINX también permite redirigir tráfico de puertos UDP hacia un servidor final usando el mismo recurso que se usa para la pila TCP, es decir, stream. Recordemos que UDP (User Datagram Protocol) es el protocolo usado por aplicaciones no transaccionales como DNS, SNMP, syslog, RADIUS, etc. las cuales podemos pasar a través de NGINX sin ningún problema.

Para poder redigir puertos UDP a través de NGINX necesitamos que este esté compilado con el flag --with-stream (o disponer de NGINX Plus, el cual ya está compilado con este módulo).

Además de compilar NGINX con --with-stream, debemos incluir esta línea en nginx.conf y reiniciar nginx:

load_module lib64/nginx/modules/ngx_stream_module.so;

Esto activa el módulo stream en NGINX.

Una vez hecho esto, ya podemos aceptar peticiones hacia puertos UDP.

Por ejemplo, si queremos mandar tráfico hacia dos servidores DNS ubicados tras un proxy inverso NGINX, debemos crear un bloque stream y usar una configuración tipo:

stream { upstream dns_servers { server 192.168.1.1:53; server 192.168.1.2:53; } server { listen 53 udp; # enviamos el tráfico del puerto 53 UDP hacia el grupo "dns_servers" proxy_pass dns_servers; } }

En el código anterior, vemos un bloque "server" dentro de stream. En él, NGINX acepta peticiones hacia su puerto 53 UDP, que a su vez, se envían al grupo de servidores llamado "dns_servers".

Al mismo tiempo, vemos que el grupo "dns_servers" está formado por 2 servidores "finales" (los servidores DNS) a los cuales se envía tráfico destinado a su puerto 53 (en el bloque upstream no hace falta indicar TCP o UDP). De este modo, el tráfico UDP se enviará a ambos servidores por round robin.

A partir de este momento, al enviar tráfico hacia el puerto 53 UDP de la IP de NGINX, este se enviará por detrás mediante round robin (balanceo equitativo) hacia los servidores finales que hayamos designado, en este caso, a dos servidores DNS.


Fuentes:

https://docs.nginx.com/nginx/admin-guide/load-balancer/tcp-udp-load-balancer/#upstream
0

0 comentarios:

Publicar un comentario