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

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

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

【问题讨论】:

    标签: .net iis-7 windows-server-2008 ip-address


    【解决方案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 地址和域限制”,但我不知道代理模式。谢谢!
        猜你喜欢
        • 1970-01-01
        • 2021-01-21
        • 1970-01-01
        • 1970-01-01
        • 2011-04-29
        • 2021-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多