Использование nginx для маскировки IP-адреса исходящих соединений

Использование nginx для маскировки IP-адреса исходящих соединений

У нас есть бизнес-требование направлять все исходящие соединения с нескольких серверов обработки через один IP-адрес.

Наша установка выглядит следующим образом:

У нас есть сервер nginx, который работает как балансировщик нагрузки для входящих http-запросов. Затем у нас есть несколько веб-серверов, которые подключаются к серверам обработки, которые в свою очередь подключаются к базам данных наших клиентов.

Клиент --> Балансировщик нагрузки --> Веб-серверы --> Серверы процессов --> База данных

Клиент <-- Балансировщик нагрузки <-- Веб-серверы <-- Серверы процессов <-- База данных

В настоящее время мы предоставляем нашим клиентам список IP-адресов, которые они должны добавить в свой белый список базы данных. Однако по мере того, как мы масштабируемся, этот белый список станет длиннее, и нашим клиентам в свою очередь придется снова обновить свой белый список соответственно.

Желаемая настройка

Чтобы обойти это, мы хотели бы направить все исходящие соединения через другой сервер nginx, который будет маскировать IP-адреса наших серверов обработки. В свою очередь, теперь у нас будет только один IP-адрес, который наши клиенты внесут в белый список.

Клиент --> Балансировщик нагрузки --> Веб-серверы --> Серверы процессов --> Маскировка IP-адресов --> База данных

Клиент <-- Балансировщик нагрузки <-- Веб-серверы <-- Серверы процессов <-- Маскировка IP <-- База данных

Возможно ли это исключительно с помощью nginx? Если да, то какие шаги нам необходимо предпринять для этого?

решение1

Другое возможное решение — использование NAT. В этом случае маскирующий сервер будет вашим маршрутизатором с настроенной трансляцией сетевых адресов. В этом случае вам не нужно менять IP-адрес клиентской базы данных в конфигурации node.js, но вам следует изменить сеть, возможно, конфигурацию маршрутизации на всех серверах процесса и иметь один шлюз с настроенной NAT

решение2

То, что вы спрашиваете, возможно с nginx, начиная с версии 1.9.0. Они добавили поддержку tcp (не http) proxy. Начиная с 1.9.13 они также добавили udp proxying. Читатьhttps://www.nginx.com/resources/admin-guide/tcp-load-balancing/#upstream иhttps://nginx.ru/en/docs/stream/ngx_stream_proxy_module.html

Сложность будет заключаться в дифференциации входящих подключений (IP-маска nginx), чтобы решить, к какой базе данных подключаться. В HTTP-прокси можно использовать имя хоста. В TCP-прокси следует либо прослушивать разные порты, либо разные 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;
        }
}

Связанный контент