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 через модуль.