Рейтинг:0

Получить реальный IP-адрес запрашивающей стороны в обратном прокси-сервере NGINX в контейнере

флаг ro

У меня есть стек Docker Swarm с nginx в качестве обратного прокси-сервера, настроенного на OVH vps. Я пытался использовать директивы разрешения/запрета в местоположении, но если я установил запретить все; это не сработает даже для IP-адресов, добавленных с разрешающей директивой. Посмотрев логи доступа выяснил, что все запросы якобы идут с IP 10.0.0.2. Теперь я попытался сначала получить фактический IP-адрес, чтобы он хотя бы отображался в журналах, но безуспешно. Вот мой nginx.conf:

События{}

http {

  карта $http_upgrade $connection_upgrade {
    обновление по умолчанию;
    ''      близко;
  }
  error_log /dev/stdout информация;
  log_format json_combined escape=json
    '{'
      '"время":"$time_local",'
      '"httpRequest":{'
        '"requestMethod":"$request_method",'
        '"URL-адрес запроса":"$схема://$host$request_uri",'
        '"размер_запроса":$request_length,'
        '"статус":"$статус",'
        '"responseSize":$bytes_sent,'
        '"userAgent":"$http_user_agent",'
        '"remoteIp":"$remote_addr",'
        '"serverIp":"$server_addr",'
        '"реферер":"$http_referer",'
        '"задержка":"${request_time} с",'
        '"протокол":"$server_protocol"'
      '}'
    '}';

  преобразователь 127.0.0.11 действительный = 30 с;

  включить /etc/nginx/mime.types;
  включить /etc/nginx/sites-enabled/*.*;
}

прокси.конф:

set_real_ip_from 10.0.0.0/8;
real_ip_header X-Forwarded-For;
real_ip_recursive на;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Хост $http_host;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $ схема;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header Обновить $http_upgrade;
proxy_set_header Соединение $connection_upgrade;
proxy_set_header X-NginX-Proxy true;
proxy_cache_bypass $http_upgrade;
прокси_http_версия 1.1;
proxy_read_timeout 20 дней;
прокси_буферизация выключена;
proxy_request_buffering выключен;
proxy_intercept_errors включен;
http2_push_preload включен;

и мое местоположение:

  расположение /API/ {
     разрешить XXX.XX.XX.X;
     отрицать все;
     включить /etc/nginx/proxy-options/proxy.conf;
     установить сервис $ocelot ocelot;
     proxy_pass http://$ocelot$uri$is_args$args;
     proxy_ssl_session_reuse выключено;
     прокси_перенаправление выключено;
     client_max_body_size 5M;
  }

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

флаг us
Вы проверили, правильно ли подключающийся сервер устанавливает заголовок X-Forwarded-For?
Pepsko avatar
флаг ro
Честно говоря, я не знаю, как я могу это проверить
флаг us
Вам нужно выяснить это тогда. Проверьте, какое программное обеспечение подключается к этому nginx, и проверьте его конфигурацию.
Pepsko avatar
флаг ro
Просто чтобы быть уверенным - вы имеете в виду программное обеспечение, которое отправляет запрос на прокси, а не на сервер, скрытый за прокси, верно?
Pepsko avatar
флаг ro
При дальнейших исследованиях я обнаружил, что проблема связана с nginx, работающим внутри контейнера в рое докеров. Я предполагаю, что это балансировщик нагрузки docker swarm, который устанавливает IP-адрес 10.0.0.2. До сих пор не выяснил, как решить эту проблему, поскольку кажется, что балансировщик нагрузки swarm не устанавливает заголовок X-Forwarded-For.
флаг us
IP-адрес не "установлен". При открытии TCP-соединения исходный IP-адрес — это тот, который имеет подключающийся объект. В этом случае вам нужно посмотреть, может ли Docker swarm установить заголовок.
Pepsko avatar
флаг ro
Да, это был просто мысленный ярлык. В любом случае мне удалось решить проблему - это было из-за оверлейной сети от Docker Swarm, мне нужно было запустить службу nginx в режиме хоста, чтобы решить проблему. В любом случае спасибо за ваше время
Рейтинг:0
флаг ro

Проблема возникла из-за дополнительной «оверлейной» сети в рое докеров; Я обошел это, используя сеть «хост».

Сервисы:
  нгинкс:
    ...
    порты:
      - цель: 80
        опубликовано: 80
        протокол: TCP
        режим: хост
      - цель: 443
        опубликовано: 443
        протокол: TCP
        режим: хост

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.