#amazon-web-services #apache #apache2 #amazon-elb #x-forwarded-for
#amazon-web-services #apache #apache2 #amazon-elb #x-forwarded-для
Вопрос:
Из документов apache (https://httpd.apace.org/docs/2.4/mod/mod_remoteip.html ) мы реализовали следующее назначение на нашем сервере:
RemoteIPHeader X-Forwarded-For
чтобы получить IP-адрес клиента, а не IP-адрес ELB. Однако мы не заметили, что ELB также добавляет все остальные X-Forwarded-For
значения слева от этой строки. Таким образом, это небезопасный способ получения IP-адреса клиента.
Мы использовали LogFormat
with "%{X-Forwarded-For}i"
для проверки того, что передаваемые значения соответствуют задокументированным.
192.168.0.0, 10.0.0.0
это то, что произошло бы, если 192.168.0.0
бы передавался заголовок и 10.0.0.0
был запрашивающим компьютером клиента. Стандартный запрос без заголовка будет:
10.0.0.0
Есть ли способ извлечь самый правый IP-адрес? Я думал о чем-то вроде,
RemoteIPHeader ('(?:d{1,3}[.]){3}d{1,3}
но не могу найти функцию в apache для настройки этого. Я мог бы сделать это на PHP, но тогда во всех моих журналах будут записаны неправильные IP-адреса.
Я пробовал:
SetEnvIf X-Forwarded-For '((?:d{1,3}[.]){3}d{1,3})
но это не повлияло.
Обновить:
Конфигурация Apache выполняется с:
LogFormat "%{%Y-%m-%d %H:%M:%S}t %a %u %A %p %m %U %q %>s "%{User-agent}i" %T/%D "%{X-Forwarded-For}i"" w3c_extended
CustomLog /var/log/httpd/example.com/access.log w3c_extended
В настоящее время я получаю либо:
2021-02-27 14:29:06 10.0.21.150 - 10.0.20.222 443 GET /IPtest.php ?v=1 200 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" 0/2822 "73.149.97.219"
или
2021-02-27 14:29:06 10.0.21.150 - 10.0.20.222 443 GET /IPtest.php ?v=1 200 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" 0/2822 "10.0.21.150, 73.149.97.219"
Мне нужно выполнить захват 73.149.97.219
в обоих сценариях.
Комментарии:
1. Когда вы используете remoteIP, вам не нужно использовать %{X-Forwarded-For}i , но %a, каков результат этого?
2. @on8tom не
%a
является адресом remoteaddr? Это передается как адрес ELB,10.x.x.x.
3. Просто для ясности, если у клиента есть ip-адрес 1.2.3.4, но он добавляет свой собственный заголовок "x-forwarded-for: 192.2.0.1", тогда ELB изменяет заголовок x-forwarded for на "x-forwarded-for: 192.2.0.1, 1.2.3.4", и вас интересует только адрес 1.2.3.4?
4. @on8tom правильно
5. ну, разве%a не совсем то, что вы хотите?
Ответ №1:
Я тестирую с apache 2.4 и remoteIP
RemoteIPHeader x-forwarded-for
Вам также необходимо сообщить вашему apache, какой внутренний IP-адрес вашего балансировщика нагрузки (обратный прокси-сервер). Не существует надежного простого способа определить этот внутренний IP-адрес, и он может быть "любым" RFC1918 (частным) IP-адресом
Итак, вам нужно добавить эти 3 подсети.
RemoteIPTrustedProxy 10.0.0.0/8
RemoteIPTrustedProxy 172.16.0.0/12
RemoteIPTrustedProxy 192.168.0.0/16
а затем используйте %a для формата журнала
LogFromat %a
я тестировал с
RemoteIPTrustedProxy 127.0.0.1
LogFormat "%a %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i"" combined
протестировано с помощью curl
curl 127.0.0.1/so
127.0.0.1 - - [27/Feb/2021:15:02:38 0100] "GET /so/ HTTP/1.1" 200 167 "-" "curl/7.52.1"
curl 127.0.0.1/so/ -H "x-forwarded-for: 1.2.3.4"
1.2.3.4 - - [27/Feb/2021:15:04:06 0100] "GET /so/ HTTP/1.1" 200 167 "-" "curl/7.52.1"
curl 127.0.0.1/so/ -H "x-forwarded-for: 8.5.4.1, 1.2.3.4"
1.2.3.4 - - [27/Feb/2021:15:04:31 0100] "GET /so/ HTTP/1.1" 200 167 "-" "curl/7.52.1"
Комментарии:
1.
RemoteIPHeader x-forwarded-for
прошел с моей глобальной сетью, как и ожидалось.RemoteIPTrustedProxy
прошел с адресом локальной сети,RemoteIPInternalProxy
прошел с другим адресом локальной сети. Я еще не тестировал заголовок forward, потому что стандартный запрос все еще должен отображаться. (Я используюLAN
иprivate ip
взаимозаменяемо)2. Я не уверен, как интерпретировать ваш последний комментарий. но вы также можете добавить RemoteIPInternalProxy 10.0.0.0 / 8, чтобы доверять всем частным IP-адресам в подсети 10/8
3. Я добавил короткое обновление, это понятнее? Если этого ответа достаточно для этого, не могли бы вы указать краткий обзор, например
RemoteIPHeader x-forwarded-fornRemoteIPTrustedProxy ....
, или в каком порядке они должны идти. Возможно, у меня они неправильные, и один перезаписывает другой
Ответ №2:
Я столкнулся с этой проблемой в другом контексте - apache разрешал имена хостов из измененного X-Forwarded-For
заголовка. Например. X-Forwarded-For: mumblemuble.burpcollaborator.com, 1.1.1.1, anotherdomainapachewillresolve.com
Мое решение состояло в том, чтобы изменить X-Forwarded-For
заголовок, чтобы включать только IP-адрес, добавленный ELB, и отбрасывать IP-адреса, которые ELB добавил к заголовку.
Вместо других обратных прокси-серверов ELB добавляет существующие X-Forwarded-For
адреса и имя хоста перед IP-адресом клиента. Для других обратных прокси-серверов вам следует изменить регулярное выражение, чтобы отбросить все после первой запятой.
# because of "early", headers can only be set in a main server or virtual host context.
RequestHeader edit "X-Forwarded-For" "^(. ),(. )$" "$2" early
, X-Forwarded-For,)[0]
но не могу найти функцию в apache для настройки этого. Я мог бы сделать это на PHP, но тогда во всех моих журналах будут записаны неправильные IP-адреса.
Я пробовал:
но это не повлияло.
Обновить:
Конфигурация Apache выполняется с:
В настоящее время я получаю либо:
или
Мне нужно выполнить захват 73.149.97.219
в обоих сценариях.
Комментарии:
1. Когда вы используете remoteIP, вам не нужно использовать %{X-Forwarded-For}i , но %a, каков результат этого?
2. @on8tom не
%a
является адресом remoteaddr? Это передается как адрес ELB,10.x.x.x.
3. Просто для ясности, если у клиента есть ip-адрес 1.2.3.4, но он добавляет свой собственный заголовок "x-forwarded-for: 192.2.0.1", тогда ELB изменяет заголовок x-forwarded for на "x-forwarded-for: 192.2.0.1, 1.2.3.4", и вас интересует только адрес 1.2.3.4?
4. @on8tom правильно
5. ну, разве%a не совсем то, что вы хотите?
Ответ №1:
Я тестирую с apache 2.4 и remoteIP
Вам также необходимо сообщить вашему apache, какой внутренний IP-адрес вашего балансировщика нагрузки (обратный прокси-сервер). Не существует надежного простого способа определить этот внутренний IP-адрес, и он может быть "любым" RFC1918 (частным) IP-адресом
Итак, вам нужно добавить эти 3 подсети.
а затем используйте %a для формата журнала
я тестировал с
протестировано с помощью curl
Комментарии:
1.
RemoteIPHeader x-forwarded-for
прошел с моей глобальной сетью, как и ожидалось.RemoteIPTrustedProxy
прошел с адресом локальной сети,RemoteIPInternalProxy
прошел с другим адресом локальной сети. Я еще не тестировал заголовок forward, потому что стандартный запрос все еще должен отображаться. (Я используюLAN
иprivate ip
взаимозаменяемо)2. Я не уверен, как интерпретировать ваш последний комментарий. но вы также можете добавить RemoteIPInternalProxy 10.0.0.0 / 8, чтобы доверять всем частным IP-адресам в подсети 10/8
3. Я добавил короткое обновление, это понятнее? Если этого ответа достаточно для этого, не могли бы вы указать краткий обзор, например
RemoteIPHeader x-forwarded-fornRemoteIPTrustedProxy ....
, или в каком порядке они должны идти. Возможно, у меня они неправильные, и один перезаписывает другой
Ответ №2:
Я столкнулся с этой проблемой в другом контексте - apache разрешал имена хостов из измененного X-Forwarded-For
заголовка. Например. X-Forwarded-For: mumblemuble.burpcollaborator.com, 1.1.1.1, anotherdomainapachewillresolve.com
Мое решение состояло в том, чтобы изменить X-Forwarded-For
заголовок, чтобы включать только IP-адрес, добавленный ELB, и отбрасывать IP-адреса, которые ELB добавил к заголовку.
Вместо других обратных прокси-серверов ELB добавляет существующие X-Forwarded-For
адреса и имя хоста перед IP-адресом клиента. Для других обратных прокси-серверов вам следует изменить регулярное выражение, чтобы отбросить все после первой запятой.
ip_is=$1
RemoteIPHeader %{ip_is}
но это не повлияло.
Обновить:
Конфигурация Apache выполняется с:
В настоящее время я получаю либо:
или
Мне нужно выполнить захват 73.149.97.219
в обоих сценариях.
Комментарии:
1. Когда вы используете remoteIP, вам не нужно использовать %{X-Forwarded-For}i , но %a, каков результат этого?
2. @on8tom не
%a
является адресом remoteaddr? Это передается как адрес ELB,10.x.x.x.
3. Просто для ясности, если у клиента есть ip-адрес 1.2.3.4, но он добавляет свой собственный заголовок «x-forwarded-for: 192.2.0.1», тогда ELB изменяет заголовок x-forwarded for на «x-forwarded-for: 192.2.0.1, 1.2.3.4», и вас интересует только адрес 1.2.3.4?
4. @on8tom правильно
5. ну, разве%a не совсем то, что вы хотите?
Ответ №1:
Я тестирую с apache 2.4 и remoteIP
Вам также необходимо сообщить вашему apache, какой внутренний IP-адрес вашего балансировщика нагрузки (обратный прокси-сервер). Не существует надежного простого способа определить этот внутренний IP-адрес, и он может быть «любым» RFC1918 (частным) IP-адресом
Итак, вам нужно добавить эти 3 подсети.
а затем используйте %a для формата журнала
я тестировал с
протестировано с помощью curl
Комментарии:
1.
RemoteIPHeader x-forwarded-for
прошел с моей глобальной сетью, как и ожидалось.RemoteIPTrustedProxy
прошел с адресом локальной сети,RemoteIPInternalProxy
прошел с другим адресом локальной сети. Я еще не тестировал заголовок forward, потому что стандартный запрос все еще должен отображаться. (Я используюLAN
иprivate ip
взаимозаменяемо)2. Я не уверен, как интерпретировать ваш последний комментарий. но вы также можете добавить RemoteIPInternalProxy 10.0.0.0 / 8, чтобы доверять всем частным IP-адресам в подсети 10/8
3. Я добавил короткое обновление, это понятнее? Если этого ответа достаточно для этого, не могли бы вы указать краткий обзор, например
RemoteIPHeader x-forwarded-fornRemoteIPTrustedProxy ....
, или в каком порядке они должны идти. Возможно, у меня они неправильные, и один перезаписывает другой
Ответ №2:
Я столкнулся с этой проблемой в другом контексте — apache разрешал имена хостов из измененного X-Forwarded-For
заголовка. Например. X-Forwarded-For: mumblemuble.burpcollaborator.com, 1.1.1.1, anotherdomainapachewillresolve.com
Мое решение состояло в том, чтобы изменить X-Forwarded-For
заголовок, чтобы включать только IP-адрес, добавленный ELB, и отбрасывать IP-адреса, которые ELB добавил к заголовку.
Вместо других обратных прокси-серверов ELB добавляет существующие X-Forwarded-For
адреса и имя хоста перед IP-адресом клиента. Для других обратных прокси-серверов вам следует изменить регулярное выражение, чтобы отбросить все после первой запятой.
, X-Forwarded-For,)[0]
но не могу найти функцию в apache для настройки этого. Я мог бы сделать это на PHP, но тогда во всех моих журналах будут записаны неправильные IP-адреса.
Я пробовал:
но это не повлияло.
Обновить:
Конфигурация Apache выполняется с:
В настоящее время я получаю либо:
или
Мне нужно выполнить захват 73.149.97.219
в обоих сценариях.
Комментарии:
1. Когда вы используете remoteIP, вам не нужно использовать %{X-Forwarded-For}i , но %a, каков результат этого?
2. @on8tom не
%a
является адресом remoteaddr? Это передается как адрес ELB,10.x.x.x.
3. Просто для ясности, если у клиента есть ip-адрес 1.2.3.4, но он добавляет свой собственный заголовок «x-forwarded-for: 192.2.0.1», тогда ELB изменяет заголовок x-forwarded for на «x-forwarded-for: 192.2.0.1, 1.2.3.4», и вас интересует только адрес 1.2.3.4?
4. @on8tom правильно
5. ну, разве%a не совсем то, что вы хотите?
Ответ №1:
Я тестирую с apache 2.4 и remoteIP
Вам также необходимо сообщить вашему apache, какой внутренний IP-адрес вашего балансировщика нагрузки (обратный прокси-сервер). Не существует надежного простого способа определить этот внутренний IP-адрес, и он может быть «любым» RFC1918 (частным) IP-адресом
Итак, вам нужно добавить эти 3 подсети.
а затем используйте %a для формата журнала
я тестировал с
протестировано с помощью curl
Комментарии:
1.
RemoteIPHeader x-forwarded-for
прошел с моей глобальной сетью, как и ожидалось.RemoteIPTrustedProxy
прошел с адресом локальной сети,RemoteIPInternalProxy
прошел с другим адресом локальной сети. Я еще не тестировал заголовок forward, потому что стандартный запрос все еще должен отображаться. (Я используюLAN
иprivate ip
взаимозаменяемо)2. Я не уверен, как интерпретировать ваш последний комментарий. но вы также можете добавить RemoteIPInternalProxy 10.0.0.0 / 8, чтобы доверять всем частным IP-адресам в подсети 10/8
3. Я добавил короткое обновление, это понятнее? Если этого ответа достаточно для этого, не могли бы вы указать краткий обзор, например
RemoteIPHeader x-forwarded-fornRemoteIPTrustedProxy ....
, или в каком порядке они должны идти. Возможно, у меня они неправильные, и один перезаписывает другой
Ответ №2:
Я столкнулся с этой проблемой в другом контексте — apache разрешал имена хостов из измененного X-Forwarded-For
заголовка. Например. X-Forwarded-For: mumblemuble.burpcollaborator.com, 1.1.1.1, anotherdomainapachewillresolve.com
Мое решение состояло в том, чтобы изменить X-Forwarded-For
заголовок, чтобы включать только IP-адрес, добавленный ELB, и отбрасывать IP-адреса, которые ELB добавил к заголовку.
Вместо других обратных прокси-серверов ELB добавляет существующие X-Forwarded-For
адреса и имя хоста перед IP-адресом клиента. Для других обратных прокси-серверов вам следует изменить регулярное выражение, чтобы отбросить все после первой запятой.