作者: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 限制设置,请执行以下步骤:
- 打开 IIS 管理器
- 如果要配置服务器范围设置,请在左侧树视图中选择服务器节点,或选择站点节点来配置特定于站点的设置。
- 在功能视图中,单击“动态 IP 限制”
- 在“动态 IP 限制”主页中,可启用和指定任何功能的配置。 若要将 IP 地址添加到“允许”列表,可单击右侧的“显示允许的地址”链接:
- 选择上面的“显示允许的地址”链接后会显示一个窗口,如下所示,可在其中看到允许绕过动态 IP 限制验证的所有 IP 地址。 可通过选择右侧的“添加允许条目”链接,将更多 IP 地址添加到列表中。
基于并发请求数阻止 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 - 禁止”错误:
重要
实际情况下为 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 - 禁止”状态代码响应:
如果再等待 5 秒,所有之前的请求均已执行,这时发出请求就会成功。
重要
在实际情况中为 Web 应用程序配置一段时间内允许的请求数时,请完整细致地测试所选限制,以确保不阻止符合条件的 HTTP 客户端。 这对于具有支持 AJAX 的网页并提供媒体内容的丰富 Internet 应用程序尤为重要。
拒绝操作
该模块可配置为在拒绝 IP 地址请求时执行以下操作:
- 向客户端发送 403(禁止)响应;
- 向客户端发送 404(找不到文件)响应;
- 通过关闭 HTTP 连接中止请求,而不向客户端发送任何响应。
对有代理的 Web 服务器的支持
如果 Web 服务器位于防火墙或代理计算机后方,所有请求的客户端 IP 可能显示为代理或防火墙服务器的 IP。 这会妨碍动态 IP 限制模块发挥用途。 但大多数此类服务器会在 HTTP 请求中添加 X-Forwarded-For 标头,其中包含原始客户端的 IP 地址。 如果选择主“动态 IP 限制”配置页中的“代理”模式复选框,会首先检查此标头中的客户端 IP 地址。