Nginx и XFF: X-Forwarded-For

Nginx

предисловие

Сегодня великий бог в группе снова проверил меня: «Недавно вы смотрите Nginx, поэтому позвольте мне задать вам вопрос…»; другой великий бог: «Я думаю, что этот вопрос… XFF…». В то время я помнил только ключевое слово XFF. , действительно не понимаю. Отсюда и эта статья.

XFF

  • Как обычно, Википедия перефразирует:

X-Forwarded-For (XFF) — это поле заголовка HTTP-запроса, используемое для идентификации исходного IP-адреса клиента, подключающегося к веб-серверу через прокси-сервер HTTP или метод балансировки нагрузки.

  • Общий формат:

X-Forwarded-For: client1, proxy1, proxy2

Зачем использовать XFF

  • Когда клиент обращается к ресурсам вышестоящего сервера через обратный прокси-сервер, IP-адрес клиента, то есть IP-адрес источника, не полностью виден вышестоящему серверу, что принесет следующие болевые точки:

Не только для бизнеса, но и для сбора журналов исходный IP-адрес обычно требуется в качестве фиксированного поля.

  • Использование полей заголовка запроса XFF может решить эту проблему.

Связанные концепции

remote_addr: представляет IP-адрес клиента, но его значение не предоставляется клиентом, но указано на сервере в соответствии с IP-адресом клиента. Когда ваш браузер обращается к веб-сайту, при условии, что нет прокси-сервера, затем веб-сервер сайта отсутствует (NGINX, Apache и т. Д.) Установит Remote_addr на свой IP-файл, если вы используете прокси, то ваш браузер впервые будет получать доступ к прокси, а затем переслать на веб-сервер по этому прокси, чтобы веб-сервер установил Remote_addr в IP этого прокси-аппарата.

настоящий бой

тестовая среда

  • предыдущий постизwww.zacpark.comобратный прокси.
  • СлужитьControllerВыводить релевантную информацию заголовка, автор ленивый, прямойsout, Но вы можете обойтись.
System.out.println("x-forwarded-for: " + httpServletRequest.getHeader("x-forwarded-for"));
        System.out.println("remote-addr: " + httpServletRequest.getRemoteAddr());
        System.out.println("x-real-ip: " + httpServletRequest.getHeader("x-real-ip"));
  • использоватьcurlкоманда, подделывающая информацию заголовка HTTP-запроса, например:
curl http://www.zacpark.com/index -H 'X-Forwarded-For: 1.1.1.1' -H 'X-Real-Ip: 2.2.2.2'

Случай 1: без прокси nginx

  • Увеличивать:8080Я не пойду на nginx~
curl http://www.zacpark.com:8080/index -H 'X-Forwarded-For: 1.1.1.1' -H 'X-Real-Ip: 2.2.2.2'
  • вывод:
x-forwarded-for: 1.1.1.1
remote-addr: 127.0.0.1
x-real-ip: 2.2.2.2

Case2: Обратный прокси через nginx

  • Напрямуюwww.zacpark.comНет порта ~
curl http://www.zacpark.com/index -H 'X-Forwarded-For: 1.1.1.1' -H 'X-Real-Ip: 2.2.2.2'
  • вывод:
x-forwarded-for: 1.1.1.1
remote-addr: 127.0.0.1
x-real-ip: 2.2.2.2

Случай 3: получить x-forwarded-for через конфигурацию nginx

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  • Разобратьproxy_add_x_forwarded_for

Переменная proxy_add_x_forwarded_for содержит «X-Forwarded-For» в заголовке клиентского запроса, отделенного от remote_addr запятой. Если заголовок «X-Forwarded-For» отсутствует, proxy_add_x_forwarded_for равен remote_addr. Значение переменной $remote_addr — это IP-адрес клиента.

  • вывод
x-forwarded-for: 1.1.1.1, 127.0.0.1
remote-addr: 127.0.0.1
x-real-ip: 2.2.2.2

Случай 4: информация в заголовке подделана

Как видно из приведенного выше случая,x-real-ip,x-forwarded-forИнформация в заголовке может быть поддельной, тогда получите ееIP-адрес клиентаБудут проблемы, тогда улучшайте конфигурацию nginx!

  • Добавьте еще одну строку конфигурации~
proxy_set_header X-Real-IP $remote_addr;
  • Разобрать:

Назначьте $remote_addr дляx-real-ipголова.

  • вывод
x-forwarded-for: 1.1.1.1, 127.0.0.1
remote-addr: 127.0.0.1
x-real-ip: 127.0.0.1

Суммировать

Эта статья через реальный бойx-forwarded-forРазобравшись, я написал его ранним утром, а краткое содержание наспех, прошу меня простить~.

использованная литература

This.Wikipedia.org/wiki/X-for это… ООО, ООО. Блокировать ее lancer.org/blog/nginx -... Блог Woohoo.cn на.com/depressed777/afraid/64…