Модуль Apache mod_remoteip
| Описание: | Заменяет исходный IP-адрес клиента для соединения списком IP-адресов пользовательских агентов, переданным прокси-серверами или балансировщиком нагрузки в заголовках запроса. |
|---|---|
| Статус: | Базовый |
| Идентификатор модуля: | remoteip_module |
| Исходный файл: | mod_remoteip.c |
Краткое описание
Этот модуль позволяет считать пользовательский агент, инициировавший запрос, исходным пользовательским агентом, определяемым httpd для целей авторизации и ведения журналов, даже если этот пользовательский агент находится за балансировщиком нагрузки, фронтенд-сервером или прокси-сервером.
Модуль переопределяет IP-адрес клиента для соединения IP-адресом пользовательского агента, указанным в заголовке запроса, настроенном с помощью директивы RemoteIPHeader.
Кроме того, этот модуль реализует серверную часть протокола PROXY HAProxy при использовании директивы RemoteIPProxyProtocol.
После замены в соответствии с настройками переопределённый IP-адрес пользовательского агента используется функцией mod_authz_host Require ip, передаётся директивой mod_status и записывается строками формата mod_log_config %a и core %a. Исходный IP-адрес клиента для соединения доступен в строке формата %{c}a.
Обработка удалённого IP-адреса
По умолчанию Apache определяет пользовательский агент по значению client_ip соединения, а значения remote_host и remote_logname соединения вычисляются на его основе. Эти поля используются для аутентификации, авторизации, ведения журналов и других целей другими загружаемыми модулями.
mod_remoteip переопределяет IP-адрес клиента для соединения рекламируемым IP-адресом пользовательского агента, предоставленным прокси-сервером или балансировщиком нагрузки, на время обработки запроса. Балансировщик нагрузки может установить с сервером длительное keepalive-соединение, и для каждого запроса будет указан корректный IP-адрес пользовательского агента, хотя исходный IP-адрес клиента балансировщика нагрузки останется неизменным.
Если в значении заголовка перечислено несколько IP-адресов пользовательских агентов, разделённых запятыми, они обрабатываются справа налево. Обработка прекращается, если очередной IP-адрес пользовательского агента не является доверенным источником предыдущего IP-адреса. Поле заголовка обновляется оставшимся списком неподтверждённых IP-адресов либо, если все IP-адреса были доверенными, заголовок полностью удаляется из запроса.
Переопределяя IP-адрес клиента, модуль сохраняет список промежуточных узлов в заметке remoteip-proxy-ip-list, которую mod_log_config может записывать с помощью маркера формата %{remoteip-proxy-ip-list}n. Если администратору нужно сохранить это значение в дополнительном заголовке, его также можно записать в заголовок с помощью директивы RemoteIPProxiesHeader.
Адреса IPv4, сопоставленные с IPv6
Как и в случае с httpd в целом, все адреса IPv4, сопоставленные с IPv6, записываются в представлении IPv4.Внутренние (частные) адреса
Все внутренние адреса из блоков 10/8, 172.16/12, 192.168/16, 169.254/16 и 127/8 (а также адреса IPv6 за пределами общедоступного блока 2000::/3) обрабатываются mod_remoteip только при регистрации внутренних (интранет-) прокси-серверов с помощьюRemoteIPInternalProxy.Директива RemoteIPHeader
| Описание: | Задаёт поле заголовка, в котором следует искать IP-адреса пользовательских агентов |
|---|---|
| Синтаксис: | RemoteIPHeader header-field |
| Значение по умолчанию: | none |
| Контекст: | конфигурация сервера, виртуальный хост |
| Статус: | Базовый |
| Модуль: | mod_remoteip |
Директива RemoteIPHeader указывает mod_remoteip считать значение указанного заголовка header-field IP-адресом пользовательского агента или списком IP-адресов промежуточных пользовательских агентов с учётом дополнительной настройки директив RemoteIPInternalProxy и RemoteIPTrustedProxy. Если эти другие директивы не используются, mod_remoteip будет доверять всем узлам, передающим значение IP-адреса RemoteIPHeader.
Пример для внутреннего балансировщика нагрузки
RemoteIPHeader X-Client-IP
Пример для прокси-сервера
RemoteIPHeader X-Forwarded-For
Директива RemoteIPInternalProxy
| Описание: | Задаёт интранет-IP-адреса клиентов, которым доверено передавать значение RemoteIPHeader |
|---|---|
| Синтаксис: | RemoteIPInternalProxy proxy-ip|proxy-ip/subnet|hostname ... |
| Контекст: | конфигурация сервера, виртуальный хост |
| Статус: | Базовый |
| Модуль: | mod_remoteip |
Директива RemoteIPInternalProxy добавляет один или несколько адресов (или блоков адресов), которым доверено передавать допустимое значение RemoteIPHeader с IP-адресом пользовательского агента. В отличие от директивы RemoteIPTrustedProxy, доверенными считаются любые IP-адреса, переданные в этом заголовке через указанные прокси-серверы, в том числе частные интранет-адреса.
Пример для внутреннего балансировщика нагрузки
RemoteIPHeader X-Client-IP RemoteIPInternalProxy 10.0.2.0/24 RemoteIPInternalProxy gateway.localdomain
Директива RemoteIPInternalProxyList
| Описание: | Задаёт интранет-IP-адреса клиентов, которым доверено передавать значение RemoteIPHeader |
|---|---|
| Синтаксис: | RemoteIPInternalProxyList filename |
| Контекст: | конфигурация сервера, виртуальный хост |
| Статус: | Базовый |
| Модуль: | mod_remoteip |
Директива RemoteIPInternalProxyList указывает файл, который обрабатывается при запуске и используется для построения списка адресов (или блоков адресов), которым доверено передавать допустимое значение RemoteIPHeader с IP-адресом пользовательского агента.
Символ решётки '#' обозначает строку-комментарий; в противном случае каждая запись, отделённая пробелом или переводом строки, обрабатывается так же, как директива RemoteIPInternalProxy.
Пример для внутреннего балансировщика нагрузки
RemoteIPHeader X-Client-IP RemoteIPInternalProxyList conf/trusted-proxies.lst
Содержимое conf/trusted-proxies.lst
# Our internally trusted proxies; 10.0.2.0/24 #Everyone in the testing group gateway.localdomain #The front end balancer
Директива RemoteIPProxiesHeader
| Описание: | Задаёт поле заголовка, в котором будут записаны все промежуточные IP-адреса |
|---|---|
| Синтаксис: | RemoteIPProxiesHeader HeaderFieldName |
| Контекст: | конфигурация сервера, виртуальный хост |
| Статус: | Базовый |
| Модуль: | mod_remoteip |
Директива RemoteIPProxiesHeader задаёт заголовок, в который mod_remoteip будет собирать список всех промежуточных IP-адресов клиентов, которым доверено определять IP-адрес пользовательского агента запроса. Обратите внимание: в этот заголовок записываются промежуточные адреса RemoteIPTrustedProxy, а промежуточные адреса RemoteIPInternalProxy отбрасываются.
Пример
RemoteIPHeader X-Forwarded-For RemoteIPProxiesHeader X-Forwarded-By
Директива RemoteIPProxyProtocol
| Описание: | Включает или отключает обработку протокола PROXY |
|---|---|
| Синтаксис: | RemoteIPProxyProtocol On|Off |
| Контекст: | конфигурация сервера, виртуальный хост |
| Статус: | Базовый |
| Модуль: | mod_remoteip |
| Совместимость: | RemoteIPProxyProtocol доступна только в httpd 2.4.31 и более поздних версиях |
Директива RemoteIPProxyProtocol включает или отключает чтение и обработку заголовка соединения протокола PROXY. Если директива включена с флагом On, вышестоящий клиент должен отправлять заголовок при каждом открытии соединения, иначе соединение будет прервано, если только клиент не входит в список отключённых узлов, заданный директивой RemoteIPProxyProtocolExceptions.
Хотя эту директиву можно указывать в любом виртуальном хосте, важно понимать, что протокол PROXY привязан к соединению и не зависит от протокола, поэтому включение и отключение фактически определяется IP-адресом и портом. Это означает, что если для одного узла и порта у вас есть несколько виртуальных хостов на основе имени и вы включите протокол хотя бы для одного из них, он будет включён для всех (с этим узлом и портом). Это также означает, что попытка включить протокол PROXY для одного хоста и отключить для другого не сработает: в таком случае будет применена последняя настройка, а в журнал будет записано уведомление о том, какая настройка была переопределена.
Listen 80
<VirtualHost *:80>
ServerName www.example.com
RemoteIPProxyProtocol On
#Requests to this virtual host must have a PROXY protocol
# header provided. If it is missing, the connection will
# be aborted
</VirtualHost>
Listen 8080
<VirtualHost *:8080>
ServerName www.example.com
RemoteIPProxyProtocol On
RemoteIPProxyProtocolExceptions 127.0.0.1 10.0.0.0/8
#Requests to this virtual host must have a PROXY protocol
# header provided. If it is missing, the connection will
# be aborted except when coming from localhost or the
# 10.x.x.x RFC1918 range
</VirtualHost> Директива RemoteIPProxyProtocolExceptions
| Описание: | Отключает обработку заголовка PROXY для определённых узлов или сетей |
|---|---|
| Синтаксис: | RemoteIPProxyProtocolExceptions host|range [host|range] [host|range] |
| Контекст: | конфигурация сервера, виртуальный хост |
| Статус: | Базовый |
| Модуль: | mod_remoteip |
| Совместимость: | RemoteIPProxyProtocolExceptions доступна только в httpd 2.4.31 и более поздних версиях |
Директива RemoteIPProxyProtocol включает или отключает чтение и обработку заголовка соединения протокола PROXY. Иногда требуется, чтобы клиенты передавали заголовок PROXY, но при этом разрешить другим клиентам подключаться без него. Эта директива позволяет администратору сервера настроить один узел или диапазон узлов CIDR, для которых это разрешено. Обычно это полезно для мониторинга и административного трафика к виртуальному хосту напрямую на сервер, расположенный за вышестоящим балансировщиком нагрузки.
Директива RemoteIPTrustedProxy
| Описание: | Задаёт интранет-IP-адреса клиентов, которым доверено передавать значение RemoteIPHeader |
|---|---|
| Синтаксис: | RemoteIPTrustedProxy proxy-ip|proxy-ip/subnet|hostname ... |
| Контекст: | конфигурация сервера, виртуальный хост |
| Статус: | Базовый |
| Модуль: | mod_remoteip |
Директива RemoteIPTrustedProxy добавляет один или несколько адресов (или блоков адресов), которым доверено передавать допустимое значение RemoteIPHeader с IP-адресом пользовательского агента. В отличие от директивы RemoteIPInternalProxy, интранет- и частные IP-адреса, сообщаемые такими прокси-серверами, включая адреса из блоков 10/8, 172.16/12, 192.168/16, 169.254/16 и 127/8 (а также адреса за пределами общедоступного блока IPv6 2000::/3), не считаются IP-адресами пользовательского агента и остаются в значении заголовка RemoteIPHeader.
Пример для доверенного балансировщика нагрузки
RemoteIPHeader X-Forwarded-For RemoteIPTrustedProxy 10.0.2.16/28 RemoteIPTrustedProxy proxy.example.com
Директива RemoteIPTrustedProxyList
| Описание: | Задаёт интранет-IP-адреса клиентов, которым доверено передавать значение RemoteIPHeader |
|---|---|
| Синтаксис: | RemoteIPTrustedProxyList filename |
| Контекст: | конфигурация сервера, виртуальный хост |
| Статус: | Базовый |
| Модуль: | mod_remoteip |
Директива RemoteIPTrustedProxyList указывает файл, который обрабатывается при запуске и используется для построения списка адресов (или блоков адресов), которым доверено передавать допустимое значение RemoteIPHeader с IP-адресом пользовательского агента.
Символ решётки '#' обозначает строку-комментарий; в противном случае каждая запись, отделённая пробелом или переводом строки, обрабатывается так же, как директива RemoteIPTrustedProxy.
Пример для доверенного балансировщика нагрузки
RemoteIPHeader X-Forwarded-For RemoteIPTrustedProxyList conf/trusted-proxies.lst
Содержимое conf/trusted-proxies.lst
# Identified external proxies; 192.0.2.16/28 #wap phone group of proxies proxy.isp.example.com #some well known ISP
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_remoteip.html