Tenemos el requisito comercial de canalizar todas las conexiones salientes desde múltiples servidores de procesamiento a través de una única dirección IP.
Nuestra configuración es la siguiente:
Tenemos un servidor nginx que funciona como equilibrador de carga para solicitudes http entrantes. Luego tenemos múltiples servidores web, que se conectan a servidores de procesamiento que a su vez se conectan a las bases de datos de nuestros clientes.
Cliente --> Loadbalancer --> Servidores web --> Servidores de procesos --> Base de datos
Cliente <-- Loadbalancer <-- Servidores web <-- Servidores de procesos <-- Base de datos
Actualmente, proporcionamos a nuestros clientes una lista de direcciones IP que deben agregar a la lista blanca de su base de datos. Sin embargo, a medida que ampliemos, esta lista blanca se hará más larga y nuestros clientes, a su vez, necesitarán volver a actualizar su lista blanca, respectivamente.
Configuración deseada
Para solucionar este problema, nos gustaría canalizar todas las conexiones salientes a través de otro servidor nginx, lo que enmascararía las direcciones IP de nuestros servidores de procesamiento. A su vez, ahora solo tendríamos una dirección IP que nuestros clientes incluirían en la lista blanca.
Cliente --> Equilibrador de carga --> Servidores web --> Servidores de procesos --> Enmascaramiento de IP --> Base de datos
Cliente <-- Equilibrador de carga <-- Servidores web <-- Servidores de procesos <-- Enmascaramiento de IP <-- Base de datos
¿Es esto posible únicamente con nginx? De ser así, ¿qué pasos deberíamos seguir para lograrlo?
Respuesta1
Otra posible solución es utilizar NAT. En este caso, el servidor de enmascaramiento será su enrutador con la traducción de direcciones de red configurada. En este caso, no necesita cambiar la IP de la base de datos del cliente en la configuración de node.js, pero debe cambiar la red, posiblemente la configuración de enrutamiento en todos los servidores de procesos y tener una puerta de enlace con NAT configurada.
Respuesta2
Lo que pides es posible con nginx a partir de la versión 1.9.0. Agregaron soporte para proxy tcp (no http). A partir del 1.9.13, también agregaron proxy udp. Leerhttps://www.nginx.com/resources/admin-guide/tcp-load-balancing/#upstream yhttps://nginx.ru/en/docs/stream/ngx_stream_proxy_module.html
La parte complicada sería diferenciar las conexiones entrantes en (máscara IP nginx) para decidir a qué base de datos conectarse. En el proxy HTTP puede utilizar el nombre de host. En el proxy tcp debes escuchar en diferentes puertos o diferentes direcciones IP. nginx.conf:
worker_processes 4;
error_log /var/log/nginx/error.log;
events { worker_connections 1024; }
stream {
server {
listen 3307;
proxy_pass client2.db.dev:3306;
proxy_buffer_size 16k;
}
server {
listen 3308;
proxy_pass client1.db.dev:3306;
proxy_buffer_size 16k;
}
}