Как записать исходное значение $ remote_addr при использовании Real-IP

9

Моя среда имеет пользовательские запросы, проходящие через несколько систем:

[Клиент] -> [ELB] ---> [nginx] -> [web]

(ELB = AWS Elastic Load Balancer)

Благодаря этому ответу , я Nginx определения и передачи правильный IP - адрес клиента на потоковые сервера (Web) с X-Forwarded-Forи X-Real_IPзаголовками. Соответствующий конфиг nginx:

    real_ip_header      X-Forwarded-For;
    set_real_ip_from        10.0.0.0/8;
    real_ip_recursive   on;
    proxy_set_header X-Real-IP $remote_addr;

Моя проблема в том, что модуль Real IP в nginx заменяет существующую $remote_addrпеременную результатом своих X-Forwarded-Forвычислений. Это дает мне исходный IP-адрес клиента, но я теряю IP-адрес системы, которая фактически отправила запрос прокси-серверу (т. Е. ELB).

В целом, наличие IP-адреса клиента для меня важнее, но я бы хотел иметь возможность регистрировать всю цепочку запросов, чтобы понять (и отладить), как проходит трафик. В настоящее время я могу только зарегистрировать IP-адрес клиента nginx, собственный IP-адрес и IP-адрес вышестоящего сервера. Я также хотел бы иметь возможность регистрировать IP ELB.

Я вижу, X-Istence задал тот же вопрос в 2013 году, но без особой удачи. С тех пор что-нибудь изменилось или улучшилось?

michaelg
источник

Ответы:

8

Вы можете получить исходный клиентский адрес соединяющего ELB в переменной$realip_remote_addr , но имейте в виду , что эта переменная была добавлена ​​только в nginx 1.9.7, поэтому вам нужно будет запустить самую последнюю версию nginx.

Майкл Хэмптон
источник
Спасибо @Майкл Хэмптон ♦! Я возвращался, чтобы ответить на свой собственный вопрос, потому что, следуя альтернативной стратегии, я наконец наткнулся на $realip_remote_addr. Работает прекрасно. На самом деле пытался заставить proxy_protocol работать и наткнулся на примечания к
патчу