Я экспериментировал с Apache mod_proxy и mod_remoteip, чтобы подтвердить свое понимание обработки заголовков X-Forwarded-For, особенно о том, как внутренние IP-адреса (например, диапазоны 10.xxx или 192.168.xx).Что определяет, когда mod_proxy только иногда добавляет внутренние ip-адреса в заголовок X-Forwarded-For
Похоже, что mod_proxy не всегда добавляет внутренние IP-адреса в заголовок X-Forwarded-For, но мне не удалось найти документацию, объясняющую ожидаемое поведение для этого.
Насколько я могу судить, когда запрос инициируется с внутреннего IP-адреса, mod_proxy добавит внутренние IP-адреса в заголовок X-Forwarded-For, но когда исходный запрос поступает из общего IP-адреса, mod_proxy делает похоже, не добавляет никаких внутренних IP-адресов в X-Forwarded-For.
Вопрос
Мой вопрос: Каковы правила, которые регулируют, будет ли или не mod_proxy добавить вызывающему IP-адрес в заголовке X-Forwarded-For.
The documentation on mod_proxy говорит:
Действуя в обратном режиме прокси (с помощью директивы PROXYPASS, например), mod_proxy_http добавляет несколько заголовков запроса, чтобы передать информацию на сервер происхождения. Эти заголовки:
X-Forwarded-For - IP-адрес клиента.
X-Forwarded-Host - Исходный хост, запрошенный клиентом в заголовке запроса HTTP хоста.
X-Forwarded-Server - Имя хоста прокси-сервера.
Будьте осторожны при использовании этих заголовков на исходном сервере, так как они будут содержать более одного значения (с разделителями-запятыми), если исходный запрос уже содержит один из этих заголовков. Например, вы можете использовать% {X-Forwarded-For} i в строке формата журнала исходного сервера для регистрации IP-адреса первоначальных клиентов, но вы можете получить более одного адреса, если запрос проходит через несколько прокси.
Я читал это, говоря, что IP-адрес клиента всегда будет добавлен в заголовок X-Forwarded-For, но это не то поведение, которое я наблюдаю.
Остальная часть этого вопроса - это те тесты, которые я провел, и поведение, которое я наблюдал.
установки параметров
Я установить два сервера под управлением Apache с mod_proxy установлен. Я буду называть их «один и два».
- Один имеет (внутренний) IP-адрес 10.0.7.1
- Два имеет адрес 10.0.7 (внутренний) IP.2
One имеет следующую директиву PROXYPASS так, что запросы к югу от пути/proxyToTwo направляются к эквивалентному подпути под/proxyToOne на два
<Location "/proxyToTwo">
ProxyPass http://10.0.7.2/proxyToOne
</Location>
Два имеет следующую директиву PROXYPASS так что запросы на суб-пути/proxyToOne отправляются обратно в одном, но без префикса/proxyToOne
<Location "/proxyToOne">
ProxyPass http://10.0.7.1
</Location>
эффект этого является то, что, когда я выполняю запросы http://One/proxyToTwo/foo
это проксированном следующим
- Один получает запрос, выдает следующий запрос к двум
http://10.0.7.2/proxyToOne/foo
- Два получает запрос, выдает следующий запрос к одному
http://10.0.7.1/foo
- One получает запрос на
/foo
и фактически служит ресурс
Таким образом, каждый запрос отскакивает от одного до двух и обратно к одному, прежде чем отвечать на два.
Вызов с внутренней IP
Используя приведенные выше настройки, я называю один из двух, используя его внутренний IP-адрес:
curl http://10.0.7.1/proxyToTwo/foo
X-Forwarded-For и X-Forwarded-Host заголовки, полученные, когда один в конце концов получает запрос на /foo
ресурса является то, что я ожидаю ниже:
X-Forwarded-For: 10.0.7.2, 10.0.7.1
X-Forwarded-Host: 10.0.7.1, 10.0.7.2
Это то, что я ожидаю, что запрос был проксирован сначала через «Один» затем «Два», а запрашивающие IP-адреса сначала являются первоначальным запросом от «Два» (curl), а затем запрос от One (mod_proxy) и окончательный запрос (не в заголовке потому что это клиент IP-соединения составляет от двух (mod_proxy)
Calling с внешним IP
неожиданное поведение является то, что mod_proxy, кажется, ведут себя по-разному, когда вызывается из публичного IP. Таким образом, вместо вызова Один из двух, я называю один из моей локальной машине, используя публичный адрес
curl http://35.162.28.102/proxyToTwo/foo
X-Forwarded-Host еще то, что я ожидал:
X-Forwarded-Host: 35.162.28.102, 10.0.7.2
То есть, запрос был сначала проксирован через Один (используя его внешний адрес), затем через Два.
Но X-Forwarded-For заголовок показывается только мой (внешний) IP адрес:
X-Forwarded-For: 35.163.25.76
Это говорит мне о том, что первоначальное исполнение mod_proxy добавляет Х-Forwarded-For заголовок с клиентский IP-адрес. Но затем последующий прокси-сервер Two не добавляет адрес One.
Я думаю, что это поведение, вероятно, более полезно, чем слепое добавление внутренних IP-адресов в заголовок, но я не могу найти его документально нигде, поэтому я хотел бы полностью его понять.
Проведя проверку кода mod_proxy, я не вижу ничего, что могло бы привести к вышеуказанному поведению. Поэтому моя рабочая теория заключается в том, что это фактически вызвано взаимодействием между mod_proxy и mod_remoteip. – EdC