Apache httpd (mod_proxy), кажется, отбрасывает / игнорирует 3-й IP-адрес в цепочке X-Forwarded-For? - PullRequest
0 голосов
/ 26 марта 2020

Рассмотрим сценарий / поток:

remote user (client) > proxy1 > proxy2 > AWS ALB > httpd/reverse_proxy > my_application

Когда пользовательский запрос проходит из своей сети, заголовок X-Forwarded-For (XFF) имеет вид добавляется IP-адрес каждого последующего прокси. Например, когда он поступает в ALB, заголовок XFF содержит «192.168.1.100, 100.99.98.97». Затем ALB добавит ClientIP к этому заголовку, и в этом случае это IP-адрес proxy2. Наконец, когда запрос приходит к обратному прокси-серверу, расположенному перед моим приложением, заголовок XFF теперь: «192.168.1.100, 100.99.98.97, 95.94.93.92».

Проблема, которую я вижу : В reverse_proxy httpd, похоже, игнорирует или отбрасывает последний / самый правильный IP-адрес в цепочке заголовков X-Forwarded-For, особенно когда больше 2 адресов.

  • tcpdump на обратном прокси-сервере показывает, что заголовок содержит полную цепочку, поэтому AWS ALB делает то, что должен, и добавляет адрес прокси2.
  • при печати заголовка XFF в журнале доступа httpd, я вижу только первые 2 адреса в напечатанной цепочке.
  • , что более важно, при попытке выполнить действие с ожидаемым третьего адрес, этот тест не пройден, дальнейшее доказательство (я думаю), 3-й адрес удаляется. Под «действием» я подразумеваю попытку вызвать директиву Require (mod_authz_host) после установки RemoteIPHeader X-Forwarded-For в vhost.
  • Если я удаляю proxy1 из потока, то я вижу адрес для proxy2 в заголовке XFF на обратном прокси-сервере без проблем.

Я не уверен, что я пропустил в моей конфигурации или тестировании, и хотя это не стандарт, множественные адреса в заголовке XFF являются общими. Я сталкиваюсь с этой проблемой только в Apache httpd 2.4. В версии 2.2 это не было проблемой, и я могу повторить ту же настройку / поток, и я вижу все 3 адреса в цепочке. Заранее спасибо.

пример vhost:

<VirtualHost *:80>
  ProxyPreserveHost On
  ServerName myapp.mydomain.com
  Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;"
  RemoteIPHeader X-Forwarded-For


  ProxyPass / http://10.1.2.3:8080/  timeout=3600
  ProxyPassReverse "/" http://10.1.2.3:8080/

  SetEnv proxy-sendchunked

  ErrorLog /var/log/httpd/error_myapp
  LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined2
  CustomLog /var/log/httpd/access_myapp combined2
  </VirtualHost>

1 Ответ

0 голосов
/ 27 марта 2020

В Vhost отсутствует директива RemoteIPTrustedProxy.

"Когда в значении заголовка указаны несколько IP-адресов useragent, разделенных запятыми, они обрабатываются в порядке справа налево. Обработка останавливается, когда данному IP-адресу useragent не доверяют для представления предыдущего IP-адреса. . Поле заголовка обновляется до этого оставшегося списка неподтвержденных IP-адресов или, если все IP-адреса были доверенными, этот заголовок полностью удаляется из запроса. "

https://httpd.apache.org/docs/2.4/mod/mod_remoteip.html#remoteiptrustedproxy

Ответ был прямо передо мной, как обычно.

...