2016-11-03 11 views
0

Я экспериментировал с 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 это проксированном следующим

  1. Один получает запрос, выдает следующий запрос к двум http://10.0.7.2/proxyToOne/foo
  2. Два получает запрос, выдает следующий запрос к одному http://10.0.7.1/foo
  3. 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-адресов в заголовок, но я не могу найти его документально нигде, поэтому я хотел бы полностью его понять.

+0

Проведя проверку кода mod_proxy, я не вижу ничего, что могло бы привести к вышеуказанному поведению. Поэтому моя рабочая теория заключается в том, что это фактически вызвано взаимодействием между mod_proxy и mod_remoteip. – EdC

ответ

0

Ответ на этот вопрос, поэтому он доступен в других случаях, совершая аналогичную ошибку.

Вкратце: mod_proxy всегда добавляет IP-адрес клиента в заголовок X-Forwarded-For (или добавляет заголовок X-Forwarded-For, если нет существующего заголовка).

Но другие модули Apache могут манипулировать заголовком X-Forwarded-For перед обработкой mod_proxy. Mod_proxy добавит клиентский IP к тому, что он видит в качестве заголовка X-Forwarded-For, который может быть выходом других модулей Apache.

В моих тестах другой модуль, влияющий на результат, был mod_remoteip. Причина разницы в результате этого поведения заключалась в том, что я использовал директиву RemoteIpTrustedProxy для указания доверенных прокси, и это позволит доверять частным IP-адресам в качестве первого соединения, но не будет обрабатывать частные IP-адреса в заголовке X-Forwarded-For.

В результате для случая внешнего IP существует следующее обращение:

  1. Моя машина (35.163.25.76) подключается к одному с не X-Forwarded-For
  2. One отправляет этот запрос на двоих с моим IP в заголовке X-Forwarded-For (X-Forwarded-For: 35.163.25.76)
  3. 2 получает этот запрос, mod_remoteip обрабатывает заголовок X-Forwarded-For, потому что одному доверяют, IP-адрес клиента фактически равен 35.163.25.76, и фактически нет X-Forward-For заголовок передан в mod_proxy
  4. Два отправляет этот запрос на один с моим IP в заголовке X-Forwarded-For (X-Forwarded-For: 35.163.25.76)

Это то, что представляет как «не прилагая частный IP-адреса» но на самом деле обработки заголовка Х-Forward-For и производство идентичного.

Закрытый идентификационный код ведет себя по-другому, потому что mod_remoteip не принимает частный IP-адрес в X-Forward for. Так оно обрабатывается:

  1. Два (10.0.7.2) подключается к одному с не X-Forwarded-For
  2. One отправляет этот запрос на двоих с IP Two в заголовке X-Forwarded-For (X-Forwarded-For: 10.0.7.2)
  3. Two получает этот запрос, mod_remoteip обрабатывает заголовок X-Forwarded-For, но не доверяет этому значению, поэтому оставляет его как есть. Таким образом, IP-адрес клиента остается одним из IP-адресов (10.0.7.1), а заголовок X-Forward-For, переданный в mod_proxy, не изменен
  4. Два посылают этот запрос на одно добавление IP-адреса клиента в заголовок X-Forwarded-For, что приводит к X-Forwarded-For: 10.0.7.2, 10.0.7.1

Я проверил это, фактически отправив некоторые заголовки X-Forwarded-For из надежных хостов. Например.

curl http://10.0.7.1/proxyToTwo/foo --header "X-Forwarded-For: TrustedHost1, TrustedHost2" 

Это приводит в конечном X-Forward-Для заголовка, содержащего только TrustedHost1, указывающий, что заголовок действительно обрабатывается mod_remoteip и повторно выдан mod_proxy.

 Смежные вопросы

  • Нет связанных вопросов^_^