предисловие
Сегодня великий бог в группе снова проверил меня: «Недавно вы смотрите 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
- мы в
nginx.conf
(Конкретный формат см. в предыдущем блоге.) в файлеlocation
Добавьте строку конфигурации в раздел.
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…