nginx в качестве прокси с использованием определенного исходного IP

Вопрос или проблема

Я использую nginx для обслуживания статических файлов и проксирования других запросов к экземпляру Tomcat. Проблема в том, что я не знаю, какой IP-адрес будет использовать nginx для подключения к Tomcat.

Каждый экземпляр Tomcat принимает HTTP-соединения только от определенных IP-адресов. На моем сервере есть все эти IP-адреса. Я просто не могу выбрать, какой именно будет использовать nginx.

Это мой файл конфигурации:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

location /integracao/ {
    proxy_pass http://X.X.X.X:9080/integracao/;
}

location /solr/ {
    proxy_pass http://Y.Y.Y.Y:8080/solr/;
}

На моем сервере есть один интерфейс с двумя IP-адресами: A и B. Мне нужно использовать IP A для подключения к первому Tomcat и IP B для подключения к Solr.

Кто-нибудь знает, как это сделать?

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

https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_bind

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

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

location /integracao/ {
    proxy_bind A.A.A.A;
    proxy_pass http://X.X.X.X:9080/integracao/;
}

location /solr/ {
    proxy_bind B.B.B.B;
    proxy_pass http://Y.Y.Y.Y:8080/solr/;
}

Если nginx не может это сделать, вы всегда можете использовать netfilter и SNAT, чтобы создать видимость, что nginx использует определенный IP:

iptables -t nat -A POSTROUTING -p tcp --dport 9080 -d ip_of_your_backend -j SNAT --to one_of_ips_bound_to_nginx_server

Искал в вики nginx, особенно в разделе о ProxyModule, и не нашел ничего связанного.

Если у вас есть возможность немного поэкспериментировать, я бы предложил попробовать разные значения в директиве listen и проверить журналы доступа на вашем сервере, чтобы увидеть, с какого IP-адреса приходит nginx.

Ответ или решение

Для настройки Nginx в качестве прокси-сервера с использованием конкретного исходного IP-адреса для подключения к нескольким экземплярам Tomcat, необходимо воспользоваться директивой proxy_bind. Эта директива позволяет указать IP-адрес, который будет использоваться в качестве источника для исходящих соединений.

Конфигурация Nginx

Ваш текущий конфигурационный файл можно модифицировать следующим образом:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

location /integracao/ {
    proxy_bind A.A.A.A;
    proxy_pass http://X.X.X.X:9080/integracao/;
}

location /solr/ {
    proxy_bind B.B.B.B;
    proxy_pass http://Y.Y.Y.Y:8080/solr/;
}

Объяснение конфигурации

  1. proxy_bind: Каждое местоположение (location) теперь использует директиву proxy_bind, чтобы указать, какой IP-адрес (A или B) будет использоваться для подключения. Это важно, поскольку ваш Tomcat настроен на прием HTTP-запросов только от определенных IP-адресов.

  2. proxy_pass: Настройки proxy_pass указывают, куда будет направляться трафик. В данном случае, трафик, направленный к /integracao/, будет перенаправлен на указанный Tomcat с IP-адресом X, а запросы к /solr/ — на другой Tomcat с IP-адресом Y.

Дополнительные рекомендации

Если по какой-то причине ваша версия Nginx не поддерживает директиву proxy_bind, или если вам потребуется более сложная маршрутизация, вы можете использовать iptables (пакетный фильтр для Linux):

iptables -t nat -A POSTROUTING -p tcp --dport 9080 -d X.X.X.X -j SNAT --to-source A.A.A.A
iptables -t nat -A POSTROUTING -p tcp --dport 8080 -d Y.Y.Y.Y -j SNAT --to-source B.B.B.B

Этот подход позволит вам "маскировать" исходящий IP-адрес, чтобы он выглядел как ваш выделенный A или B при соединении с Tomcat.

Заключение

Используя директиву proxy_bind, вы можете гибко управлять исходящими IP-адресами в Nginx. Это позволяет обеспечить необходимую маршрутизацию запросов к различным экземплярам Tomcat, минимизируя проблемы с безопасностью и настройками брандмауэра. Если изменения не позволяют достичь желаемого результата, использование iptables может стать отличным резервным вариантом для решения задачи.

Оцените материал
Добавить комментарий

Капча загружается...