Spec-Zone.ru › Apache HTTP Server

Модуль 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API