Использование nginx для маскировки IP-адреса исходящих соединений
У нас есть бизнес-требование направлять все исходящие соединения с нескольких серверов обработки через один IP-адрес.
Наша установка выглядит следующим образом:
У нас есть сервер nginx, который работает как балансировщик нагрузки для входящих http-запросов. Затем у нас есть несколько веб-серверов, которые подключаются к серверам обработки, которые, в свою очередь, подключаются к базам данных наших клиентов.
Клиент -> Loadbalancer -> Веб-серверы -> Серверы процессов -> База данных
Клиент <- Loadbalancer <- Веб-серверы <- Серверы процесса <- База данных
В настоящее время мы предоставляем нашим клиентам список IP-адресов, которые они должны добавить в свой белый список базы данных. Однако, по мере того, как мы масштабируем этот белый список, он становится длиннее, и нашим клиентам, в свою очередь, необходимо будет соответственно обновить свой белый список.
Требуемая настройка
Чтобы обойти это, мы хотели бы направить все исходящие соединения через другой сервер nginx, который бы маскировал IP-адреса наших серверов обработки. В свою очередь, теперь у нас будет только один IP-адрес, который наши клиенты будут в белом списке.
Клиент -> Loadbalancer -> Веб-серверы -> Серверы процессов -> Маскировка IP -> База данных
Клиент <- Loadbalancer <- Веб-серверы <- Серверы процессов <- Маскировка IP <- База данных
Возможно ли это исключительно с помощью nginx, и если да, то какие шаги нам нужно предпринять для этого?
2 ответа
Другим возможным решением является использование NAT. В этом случае маскирующий сервер будет вашим маршрутизатором с настроенной трансляцией сетевых адресов. В этом случае вам не нужно менять IP базы данных клиентов в конфигурации node.js, но вы должны изменить сеть, возможно, конфигурацию маршрутизации на всех серверах процессов и иметь один шлюз с настроенным NAT
То, что вы спрашиваете, возможно с nginx, начиная с версии 1.9.0. Они добавили поддержку прокси tcp (не http). Начиная с 1.9.13 они также добавили проксирование udp. Прочитайте https://www.nginx.com/resources/admin-guide/tcp-load-balancing/ и https://nginx.ru/en/docs/stream/ngx_stream_proxy_module.html
Сложнее было бы дифференцировать входящие соединения (IP-маска nginx), чтобы решить, к какой базе данных подключаться. В HTTP прокси вы можете использовать имя хоста. В tcp proxy вы должны либо прослушивать разные порты, либо разные 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;
}
}