Модуль Apache mod_remoteip
| Описание: | Заменяет исходный IP-адрес клиента на IP-адрес пользователя-агента, представленный в списке прокси или балансировщиком нагрузки через заголовки запроса. |
|---|---|
| Статус: | Базовый |
| Идентификатор модуля: | remoteip_module |
| Файл исходного кода: | mod_remoteip.c |
Обзор
Этот модуль используется для обработки пользователя-агента, инициировавшего запрос, как исходного пользователя-агента, определённого httpd для целей авторизации и ведения журнала, даже в тех случаях, когда этот пользователь-агент находится за балансировщиком нагрузки, сервером-прокси или сервером-прокси.
Модуль переопределяет IP-адрес клиента для подключения на IP-адрес пользователя-агента, указанный в заголовке запроса, настроенном с помощью директивы RemoteIPHeader.
Кроме того, этот модуль реализует серверную часть протокола HAProxy PROXY Protocol при использовании директивы RemoteIPProxyProtocol.
После замены, указанной в инструкции, переопределённый IP-адрес пользователя-агента используется для mod_authz_host Require ip функции, отображается mod_status, и записывается в mod_log_config %a и core %a форматах строк. Базовый IP-адрес клиента подключения доступен в строке формата %{c}a.
Обработка удалённого IP-адреса
По умолчанию Apache определяет пользователя-агента с помощью значения client_ip подключения, а connection remote_host и remote_logname выводятся из этого значения. Эти поля играют роль в аутентификации, авторизации и ведении журнала и в других целях, используемых другими загружаемыми модулями.
mod_remoteip переопределяет IP-адрес клиента подключения на объявленный IP-адрес пользователя-агента, предоставленный прокси или балансировщиком нагрузки, на время запроса. Балансировщик нагрузки может установить долговременное подключение keep-alive с сервером, и каждый запрос будет содержать правильный IP-адрес пользователя-агента, даже если базовый IP-адрес клиента балансировщика остаётся неизменным.
Если в значении заголовка указаны несколько IP-адресов пользователя-агента, разделённых запятыми, они обрабатываются в порядке справа налево. Обработка прекращается, когда указанный IP-адрес пользователя-агента не надёжно подтверждает предыдущий IP-адрес. Поле заголовка обновляется до этого оставшегося списка неподтверждённых IP-адресов, или если все IP-адреса были надёжно подтверждены, этот заголовок удаляется из запроса полностью.
При переопределении IP-адреса клиента модуль сохраняет список промежуточных хостов в примечании remoteip-proxy-ip-list, которое mod_log_config может записывать с помощью маркера формата %{remoteip-proxy-ip-list}n. Если администратору необходимо сохранить это как дополнительный заголовок, это же значение можно также записать как заголовок с помощью директивы RemoteIPProxiesHeader.
IP-адреса IPv4, отображённые через IPv6
Как и в httpd в целом, любые IP-адреса IPv4, отображённые через IPv6, записываются в их представлении IPv4.Внутренние (приватные) адреса
Все внутренние адреса 10/8, 172.16/12, 192.168/16, 169.254/16 и блоки 127/8 (и IP-адреса IPv6 за пределами публичного блока 2000::/3) оцениваются модулем mod_remoteip только при регистрации внутренних (внутрисетевых) проксиRemoteIPInternalProxy. Директива RemoteIPHeader
| Описание: | Определить поле заголовка, которое должно быть обработано для IP-адресов пользователя-агента |
|---|---|
| Синтаксис: | RemoteIPHeader header-field |
| Контекст: | конфигурация сервера, виртуальный хост |
| Статус: | Базовый |
| Модуль: | 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, клиент upstream должен отправлять заголовок каждый раз при открытии подключения, иначе подключение будет прервано, если оно не находится в списке отключённых хостов, предоставленных директивой 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 хостов, которые могут это сделать. Это обычно полезно для мониторинга и административного трафика на виртуальный хост напрямую на сервер за балансировщиком нагрузки upstream.
Директива 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
| Описание: | Указывает адреса клиентской внутренней сети, которым доверяют при представлении значения 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