Temos um requisito comercial de canalizar todas as conexões de saída de vários servidores de processamento por meio de um único endereço IP.
Nossa configuração é a seguinte:
Temos um servidor nginx que funciona como balanceador de carga para solicitações HTTP recebidas. Temos então vários servidores web, que se conectam a servidores de processamento que, por sua vez, se conectam aos bancos de dados de nossos clientes.
Cliente -> Loadbalancer -> Servidores Web -> Servidores de Processo -> Banco de Dados
Cliente <- Loadbalancer <-- Servidores Web <-- Servidores de processos <- Banco de dados
Atualmente, fornecemos aos nossos clientes uma lista de endereços IP que eles devem adicionar à lista de permissões de seu banco de dados. No entanto, à medida que escalamos, esta lista de permissões se tornará mais longa e nossos clientes, por sua vez, precisarão atualizar novamente sua lista de permissões, respectivamente.
Configuração desejada
Para contornar isso, gostaríamos de canalizar todas as conexões de saída através de outro servidor nginx, o que mascararia os endereços IP dos nossos servidores de processamento. Por sua vez, teríamos agora apenas um endereço IP que nossos clientes colocariam na lista de permissões.
Cliente -> Balanceador de carga -> Servidores Web -> Servidores de processo -> Mascaramento de IP -> Banco de dados
Cliente <-- Loadbalancer <-- Servidores Web <-- Servidores de processos <-- Mascaramento de IP <-- Banco de dados
Isso é possível apenas com o nginx? Em caso afirmativo, que etapas precisaríamos tomar para conseguir isso?
Responder1
Outra solução possível é usar NAT. Neste caso, o servidor de mascaramento será o seu roteador com tradução de endereço de rede configurada. Neste caso, você não precisa alterar o IP do banco de dados do cliente na configuração do node.js, mas deve alterar a rede, possivelmente a configuração de roteamento em todos os servidores de processo e ter um gateway com NAT configurado
Responder2
O que você pergunta é possível com o nginx a partir da versão 1.9.0. Eles adicionaram suporte a proxy tcp (não http). A partir de 1.9.13 eles também adicionaram proxy udp. Lerhttps://www.nginx.com/resources/admin-guide/tcp-load-balancing/#upstream ehttps://nginx.ru/en/docs/stream/ngx_stream_proxy_module.html
A parte complicada seria diferenciar as conexões de entrada (máscara IP nginx) para decidir a qual banco de dados conectar. No proxy HTTP você pode usar o nome do host. No proxy tcp você deve escutar em portas diferentes ou em endereços IP diferentes. 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;
}
}