使用动态 IP 限制

作者:Nazim Lala

介绍

用于 IIS 7.0 及更高版本的动态 IP 限制 (DIPR) 模块提供针对 Web 服务器和网站上拒绝服务和暴力攻击的保护。 为提供此保护,该模块会暂时阻止并发请求数异常高或短时间内发出大量请求的 HTTP 客户端的 IP 地址。

功能

动态 IP 限制模块包括以下关键功能:

  • 基于并发请求数阻止 IP 地址 - 如果 HTTP 客户端的并发请求数超过允许的量,会暂时阻止该客户端的 IP 地址。
  • 基于一段时间内的请求数阻止 IP 地址 - 如果 HTTP 客户端发出的请求数超过指定时间间隔内发出的数量,会暂时阻止该客户端的 IP 地址。
  • 不阻止的 IP 地址允许列表 - 可添加无论配置如何都不受模块阻止的客户端的 IP 地址的列表。
  • 各种拒绝操作 - 可指定要返回到 IP 地址受阻止的 HTTP 客户端的响应。 模块可返回状态代码 403 和 404,或直接终止 HTTP 连接而不返回任何响应。
  • 对代理后方的 Web 服务器的支持 - 如果 Web 服务器位于代理后方,可将模块配置为使用 X-Forwarded-For 标头中的客户端 IP 地址。
  • IPv6 - 该模块提供对 IPv6 地址的完全支持。

安装 DIPR 模块

可以尝试以下方法来安装动态 IP 限制:

在“选择角色服务”屏幕中,导航到 Web 服务器(IIS) > Web 服务器 > 安全性。 选中“IP 和域限制”复选框,然后单击“下一步”继续。

先决条件

必须使用以下操作系统之一。

  • Windows Server 2008
  • Windows Vista SP1
  • Windows Server 2008 R2
  • Windows 7

卸载 DIPR 模块的 Beta 版本

如果使用 DIPR 模块的第一个 Beta 版本,则必须在安装候选版本之前卸载它,否则会发生错误,安装将失败。 在卸载该 Beta 版本之前确保将配置备份。

如果使用 DIPR 模块的 Beta 2 版本,可直接升级到最新版本。 配置设置将保留。

配置动态 IP 限制

可以使用 IIS 管理器、IIS 配置 API 或使用命令行工具 appcmd 配置动态 IP 限制。

要访问 IIS 管理器中的动态 IP 限制设置,请执行以下步骤:

  1. 打开 IIS 管理器
  2. 如果要配置服务器范围设置,请在左侧树视图中选择服务器节点,或选择站点节点来配置特定于站点的设置。
  3. 在功能视图中,单击“动态 IP 限制”
    I S 管理器的屏幕截图,其中显示了主窗格中的功能列表,选择了“动态 IP 限制”。
  4. 在“动态 IP 限制”主页中,可启用和指定任何功能的配置。 若要将 IP 地址添加到“允许”列表,可单击右侧的“显示允许的地址”链接:
    I S 管理器的屏幕截图,其中显示了主窗格中的动态 I P 限制。在“操作”窗格中选中了“允许的地址”。
  5. 选择上面的“显示允许的地址”链接后会显示一个窗口,如下所示,可在其中看到允许绕过动态 IP 限制验证的所有 IP 地址。 可通过选择右侧的“添加允许条目”链接,将更多 IP 地址添加到列表中。
    I S 管理器的屏幕截图,其中显示了“添加允许限制规则”对话框。对话框后面的“操作”窗格中突出显示了“添加允许条目”。

基于并发请求数阻止 IP 地址

使用此选项时,服务器仅允许任何客户端的 IP 地址发出配置的数量的并发请求。 超出指定限制的任何其他请求都将被拒绝。

测试此功能的一种简单方法是使用 UI 或执行 appcmd 命令将并发请求的最大数目设置为 2:

%WINDIR%\system32\inetsrv\appcmd.exe set config -section:system.webServer/security/dynamicIpSecurity 
/denyByConcurrentRequests.enabled:"True" 
/denyByConcurrentRequests.maxConcurrentRequests:"2" 
/commit:apphost

在网站的根文件夹中创建文件 test.aspx,并将以下内容粘贴到其中:

<%@ Page Language="C#" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
 System.Threading.Thread.Sleep(3000);
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
 <head runat="server">
 <title>Dynamic IP Restrictions Test</title>
 </head>
 <body>
 <form id="form1" runat="server">
 <div>
 <h1>Hello World!</h1>
 </div>
 </form>
 </body>
</html>

此 ASP.NET 页 3 秒后返回响应。 保存该文件,然后打开 Web 浏览器,请求 http://localhost/test.aspx,然后连续点击 F5 刷新浏览器。 这会导致浏览器发出 2 个以上的并发请求,结果是服务器发出“403 - 禁止”错误:

服务器错误页的屏幕截图。错误摘要显示 H T T P 错误 403.7 禁止访问。

重要

实际情况下为 Web 应用程序配置并发请求数时,请完整细致地测试所选限制,以确保不阻止符合条件的 HTTP 客户端。 这对于具有支持 AJAX 的网页并提供媒体内容的丰富 Internet 应用程序尤为重要。

基于一段时间内的请求数阻止 IP 地址

使用此选项时,服务器会拒绝任何在一段时间内发出的请求数超过可配置数量的 HTTP 客户端 IP 地址的请求。 这些 IP 地址会一直受阻止,直到其一段时间内的请求数低于配置的限额。

若要测试此功能,可使用 IIS 管理器或执行 appcmd 命令将“最大请求数”设置为 5、将“时间段”设置为 5000:

%WINDIR%\system32\inetsrv\appcmd.exe set config -section:system.webServer/security/dynamicIpSecurity /denyByRequestRate.enabled:"True" /denyByRequestRate.maxRequests:"5" /denyByRequestRate.requestIntervalInMilliseconds:"5000" /commit:apphost

打开 Web 浏览器,请求 http://localhost/welcome.png,然后点击 F5 以持续刷新页面。 随即会在 5 秒内生成 5 个以上的请求,结果是服务器以“403 - 禁止”状态代码响应:

服务器错误页的屏幕截图。错误摘要显示 H T T P 错误 403.8 禁止。

如果再等待 5 秒,所有之前的请求均已执行,这时发出请求就会成功。

重要

在实际情况中为 Web 应用程序配置一段时间内允许的请求数时,请完整细致地测试所选限制,以确保不阻止符合条件的 HTTP 客户端。 这对于具有支持 AJAX 的网页并提供媒体内容的丰富 Internet 应用程序尤为重要。

拒绝操作

该模块可配置为在拒绝 IP 地址请求时执行以下操作:

  • 向客户端发送 403(禁止)响应;
  • 向客户端发送 404(找不到文件)响应;
  • 通过关闭 HTTP 连接中止请求,而不向客户端发送任何响应。

对有代理的 Web 服务器的支持

如果 Web 服务器位于防火墙或代理计算机后方,所有请求的客户端 IP 可能显示为代理或防火墙服务器的 IP。 这会妨碍动态 IP 限制模块发挥用途。 但大多数此类服务器会在 HTTP 请求中添加 X-Forwarded-For 标头,其中包含原始客户端的 IP 地址。 如果选择主“动态 IP 限制”配置页中的“代理”模式复选框,会首先检查此标头中的客户端 IP 地址。