IIS 7 - Ограничение приложения по IP-адресу за балансировщиком нагрузки
Я пытаюсь ограничить приложение в IIS 7 по IP-адресу на моем веб-сервере за балансировщиком нагрузки. Заголовок X-Forwarded-For задается балансировщиком нагрузки с IP-адресом клиента.
Каков наилучший способ извлечения этого IP-адреса в IIS 7 для настройки фильтрации IP-адресов в моем приложении? Если нет лучшего способа, я в конечном итоге использую HTTPModule для обработки этого для меня.
Ответы
Ответ 1
Вы можете использовать модуль перезаписи URL-адресов IIS, чтобы выполнить это.
Добавьте новое входящее правило с условиями, которые проверяют, не соответствует ли IP-адрес {HTTP_X_Forwarded_For}. Затем вы можете установить правило, чтобы перенаправить, переписать или прервать запрос.
Вы можете создать новое условие для каждого IP-адреса, который вы хотите выполнить в виде белого списка.
Ответ 2
Использование модуля REMOTE_ADDR
URL IIS для нормализации REMOTE_ADDR
и реализации ограничений IP.
С помощью следующего рецепта для REMOTE_ADDR
будет установлен настоящий Client-IP, независимо от того, существует ли доверенный обратный прокси-сервер для установки HTTP_X_FORWARDED_FOR
. Это означает, что вы можете удалить обратный прокси-сервер перед IIS, и эти IP-ограничения будут продолжать работать, как и ожидалось.
Нормализуйте REMOTE_ADDR
в applicationHost.config
Установите это в глобальном IIS applicationHost.config
:
<rewrite>
<allowedServerVariables>
<add name="REMOTE_ADDR" />
<add name="REMOTE_HOST" />
</allowedServerVariables>
<globalRules>
<rule name="Remote" patternSyntax="ECMAScript">
<match url=".*" ignoreCase="false" />
<conditions>
<add input="{REMOTE_ADDR}" pattern="^10\.1\.1\.[123]$" ignoreCase="false" />
<add input="{HTTP_X_FORWARDED_FOR}" pattern="\d+\.\d+\.\d+\.\d+$" ignoreCase="false" />
</conditions>
<serverVariables>
<set name="REMOTE_ADDR" value="{C:0}" />
<set name="REMOTE_HOST" value="{C:0}" />
</serverVariables>
<action type="None" />
</rule>
</globalRules>
</rewrite>
Приведенный выше рецепт копирует последний IP-адрес, который он находит в HTTP_X_FORWARDED_FOR
в REMOTE_ADDR
и REMOTE_HOST
<serverVariables>
только если исходное значение в REMOTE_ADDR
совпадает с IP-адресом доверенного обратного прокси-сервера.
Чтобы этот рецепт работал, должно быть установлено первое условие, соответствующее вашему IP-адресу обратного прокси:
<add input="{REMOTE_ADDR}" pattern="^10\.1\.1\.[123]$" ignoreCase="false" />
В приведенном выше примере клиентский IP в HTTP_X_FORWARDED_FOR
является доверенным, только если он установлен обратным прокси-сервером на одном из следующих IP-адресов:
10.1.1.1 or 10.1.1.2 or 10.1.1.3
Это заботится о настройке REMOTE_ADDR
для реального Client-IP.
IP-ограничения в web.config
Ограничения IP-адресов можно установить с помощью модуля перезаписи URL-адреса IIS на сайте web.config
используя этот рецепт:
<system.webServer>
<rewrite>
<rules>
<rule name="IP Restricted" patternSyntax="ECMAScript" stopProcessing="true">
<match url=".*" ignoreCase="false" />
<conditions>
<add input="{REMOTE_ADDR}" pattern="^(127\.|10\.20\.74\.|10\.25\.182\.|10\.64\.105\.10)" ignoreCase="false" negate="true" />
</conditions>
<action type="Rewrite" url="/403.html" appendQueryString="false" logRewrittenUrl="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
Отредактируйте pattern=
чтобы он соответствовал только тем IP-адресам или блокам, которые вам нужны.
Измените <action/>
на все необходимое.
Поскольку приведенный выше рецепт web.config
фильтрует стандартную переменную REMOTE_ADDR
, он работает с HTTP_X_FORWARDED_FOR
и без HTTP_X_FORWARDED_FOR
. Рецепт в applicationHost.config
<rewrite>
<globalRules>
гарантирует, что для REMOTE_ADDR
всегда будет задан настоящий IP-адрес клиента для всего, что впоследствии может ссылаться на REMOTE_ADDR
.
Ответ 3
IIS 7 и более поздние версии включают модуль Dynamic IP Restrictions, который поддерживает фильтрацию клиентских запросов по их заголовку X-Forwarded-For
, который добавляется к запросу при использовании балансировщика нагрузки AWS:
Поддержка веб-серверов за прокси-сервером. Если ваш веб-сервер находится за прокси-сервером, вы можете настроить модуль на использование IP-адреса клиента из заголовка X-Forwarded-For.
Вы можете включить поддержку режима Proxy, установив флажок "Proxy" на странице конфигурации модуля, а затем написать правила, разрешающие/запрещающие диапазоны IP/CIDR через модуль.