Рассмотрим сценарий / поток:
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>