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_ADDR
和 REMOTE_HOST
<serverVariables>
。
要让这个秘籍生效,第一个条件必须设置为与您的反向代理的 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 地址或块。
将<action />
更改为任何需要的值。
因为上面的 web.config
配方过滤了标准的 REMOTE_ADDR
变量,所以无论有无HTTP_X_FORWARDED_FOR
,它都适用。 applicationHost.config
<rewrite>
<globalRules>
中的配方确保 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 地址限制应用程序的主要内容,如果未能解决你的问题,请参考以下文章