Мой брандмауэр работает нормально: соединение из Интернета перенаправляется на сервер 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.