使用以下配方,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。