Прочитать «исходный IP» из перенаправленного соединения

Прочитать «исходный IP» из перенаправленного соединения

Мой брандмауэр работает нормально: соединение из Интернета перенаправляется на сервер NGINX, который затем распределяет его соответствующим образом, и сервер приложений работает корректно, за исключением внутренних журналов.

Проблема, с которой я столкнулся, касается IP-адреса, получаемого нашим сервером приложений: это не «клиентский IP-адрес», а IP-адрес NGINX.

Рассмотрим следующую сеть: клиентский IP-адрес 1, брандмауэрный IP-адрес 2, NGINX IP-адрес 3, веб-серверный IP-адрес 4.

На брандмауэре мы видим, что пакеты пересылаются на NGINX, но на NGINX tcpdumpмы видим входящие соединения с собственного IP-адреса NGINX 3 вместо исходного IP-адреса источника 1.

Дело в том, что в журналах веб-сервера мы видим наши входящие соединения как IP 3, тогда как ожидаемый IP 1.

Это неправильная настройка брандмауэра или NGINX? Есть идеи, как это решить?

Текущая конфигурация ( /etc/nginx/sites-enabled/app.domain.com):

...
location ^~ / {
proxy_pass      http://10.0.0.11;
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;
}
...

решение1

Это нормальная работа. Когда nginx является обратным прокси, он открывает соединение с конечным пунктом назначения и проксирует от клиента к серверу приложений. Исходный IP не может быть ничем иным, кроме IP-адреса nginx, иначе TCP-соединение не будет работать.

Вам необходимо настроить сервер приложений на использование IP-адреса, указанного в X-Real-IPзаголовке, вместо IP-адреса из TCP-соединения.

решение2

Решением для этого случая было изменить код C#, как показано ниже. Никаких изменений в брандмауэре или nginx не производилось.

var userIP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

Предыдущие неудачные попытки:

var userIP = Request.ServerVariables["X_FORWARDED_FOR"];
var userIP = Request.ServerVariables["X-REAL-IP"];
var userIP = Request.ServerVariables["REMOTE_ADDR"];
var userIP = Request.UserHostAddress;

Спасибо всем участникам, которые помогли прояснить, что проблема была не в брандмауэре или конфигурации nginx.

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