Использование модуля перезаписи URL IIS для нормализации REMOTE_ADDR
и реализации ограничений IP.
При следующем рецепте REMOTE_ADDR
будет установлен на real 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
в real Client-IP.
IP-ограничения в web.config
IP-ограничения можно установить с помощью IIS URL Rewrite в сайте 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
и без него,Рецепт в applicationHost.config
<rewrite>
<globalRules>
гарантирует, что REMOTE_ADDR
всегда будет установлен в real Client-IP для всего, что позже может ссылаться на REMOTE_ADDR
.