IIS 7 - 通过负载均衡器后面的 IP 地址限制应用程序

Posted

技术标签:

【中文标题】IIS 7 - 通过负载均衡器后面的 IP 地址限制应用程序【英文标题】:IIS 7 - Restrict Application by IP Address behind load balancer 【发布时间】:2011-10-11 09:20:49 【问题描述】:

我正在尝试通过负载平衡器后面的 Web 服务器上的 IP 地址来限制 IIS 7 中的应用程序。 X-Forwarded-For 标头由负载均衡器使用客户端的 IP 地址设置。

在 IIS 7 中提取该 IP 地址以在我的应用程序上设置 IP 地址过滤的最佳方法是什么?如果没有最好的方法,我最终会使用 HTTPModule 来为我处理。

【问题讨论】:

【参考方案1】:

您可以使用IIS URL Rewrite module 来完成此操作。

添加一个新的入站规则,其中包含检查 IP 地址是否与 HTTP_X_Forwarded_For 不匹配的条件。然后,您可以设置规则以重定向、重写或中止请求。

您可以为要列入白名单的每个 IP 地址设置一个新条件。

【讨论】:

【参考方案2】:

使用IIS URL Rewrite module 规范化REMOTE_ADDR 并实施IP 限制。

使用以下配方,REMOTE_ADDR 将设置为 真实 客户端 IP,无论前面是否有可信任的反向代理来设置 HTTP_X_FORWARDED_FOR。这意味着您可以从 IIS 前面删除反向代理,这些 IP 限制仍将继续按预期工作。

applicationHost.config 中标准化REMOTE_ADDR

在全局 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>

仅当 REMOTE_ADDR 中的原始值与受信任的反向代理的 IP 地址匹配时,上面的方法才会将它在 HTTP_X_FORWARDED_FOR 中找到的最后一个 IP 地址复制到 REMOTE_ADDRREMOTE_HOST &lt;serverVariables&gt;

要让这个秘籍生效,第一个条件必须设置为与您的反向代理的 IP 地址相匹配:

<add input="REMOTE_ADDR" pattern="^10\.1\.1\.[123]$" ignoreCase="false" />

在上面的示例中,HTTP_X_FORWARDED_FOR 中的客户端 IP 只有在以下 IP 地址之一由反向代理设置时才受信任:

10.1.1.1 or 10.1.1.2 or 10.1.1.3

这需要将REMOTE_ADDR 设置为真实客户端IP。

web.config 中的 IP 限制

IP 限制可以在站点的web.config 中使用IIS URL Rewrite module 来设置:

<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 地址或块。

&lt;action /&gt; 更改为任何需要的值。

因为上面的 web.config 配方过滤了标准的 REMOTE_ADDR 变量,所以无论有无HTTP_X_FORWARDED_FOR,它都适用。 applicationHost.config &lt;rewrite&gt; &lt;globalRules&gt; 中的配方确保 REMOTE_ADDR 始终设置为 真实 客户端 IP,以便以后可能引用 REMOTE_ADDR

【讨论】:

【参考方案3】:

IIS 7 及更高版本包含Dynamic IP Restrictions 模块,该模块支持通过X-Forwarded-For 标头过滤客户端请求,该标头添加到请求when using an AWS load balancer:

支持代理后的 Web 服务器 - 如果您的 Web 服务器位于代理后,您可以将模块配置为使用 X-Forwarded-For 标头中的客户端 IP 地址。

You can enable Proxy Mode support 通过选中模块配置页面中的“代理”复选框,然后编写规则以通过模块允许/拒绝 IP/CIDR 范围。

【讨论】:

在 IIS 8.0+ 中,这个模块is called“IP 地址和域限制”,但我不知道代理模式。谢谢!

以上是关于IIS 7 - 通过负载均衡器后面的 IP 地址限制应用程序的主要内容,如果未能解决你的问题,请参考以下文章

VS 企业负载测试源 IP 地址

如何从负载均衡器后面获取客户端的 IP 地址?

IIS负载均衡

Nginx配置之负载均衡限流缓存黑名单和灰度发布

CentOS7---基于 CentOS 7 构建 LVS-DR 群集

可以将 ip 列入白名单以与 aws 负载均衡器后面的 ec2 实例进行入站通信吗?