IIS8中动态IP限制设置的最佳选项是什么?

25

因此,我已经在我的Azure云服务站点上启用了此功能,以尝试减少蜘蛛和机器人对我们的攻击次数。

有人有这些设置的经验吗?

基于并发请求数量拒绝IP地址: 最大并发请求数量是多少?

基于一段时间内的请求数量拒绝IP地址: 最大请求数量是多少? 时间段(以毫秒为单位)是多少?


3
为什么您想要阻止蜘蛛爬取?您的服务应该被设计成蜘蛛(或任何用户)不会引起性能问题。我认为您处理了症状而不是原因,这种方法可能不太适合解决问题。请考虑根本上解决问题。 - Dai
3
因为我们有数万种产品,而且流氓蜘蛛不断地攻击我们所有的产品页面。我测量了一只特定蜘蛛在几个小时内的27,000多次点击。更不用说恶意蜘蛛会无数次地攻击页面,寻找漏洞,以及过去发生的DOS攻击。一个正常的用户或好的机器人/蜘蛛不会从单个IP地址这么荒谬地频繁访问网站。顺便说一下,网站运行良好,但这是IIS8中的一个功能,希望听听其他人的使用经验。 - dimoss
2
我有一个不同的使用情况。拒绝攻击电子商务网站的欺诈者。如果我允许他们自由访问,他们不会像你描述的机器人那样表现。他们将每分钟尝试一次交易左右。我想拒绝他们超过5次的任何尝试。由于每个页面最多生成6个GET请求,我想尝试:“基于一段时间内的请求数量拒绝IP地址”,并将其设置为类似于:“最大请求数量”= 30,“时间段(毫秒)”= 86400000(24小时)。但是有些东西告诉我,在此最后一个插槽中放入一个巨大的数字将会破坏该工具。 - Mark Goldfain
1
对于 IIS 的这样一个重要功能,几乎没有任何真实世界的使用信息。我已经在这个问题上开始了一项悬赏,以获得更多的关注。 - Muhammad Rehan Saeed
点击此处查看更多答案:http://serverfault.com/questions/416233/dynamic-ip-restriction-strategy - Keith
2个回答

23

一种寻找合理设置的试验方法

最近我一直在尝试这些设置,以决定我们的生产站点的值。

我们确定了单个(请求密集的)页面生成的最大请求数,并将其乘以2.5以获得随时间变化的最大请求数。对于时间值,我选择了200ms。

手动测试表明,这些设置对“正常”使用效果良好。当我们在浏览器中同时重新加载5个或更多选项卡时,我们会遇到一些403 Forbidden。

您必须记住的一件事是,您网站的许多用户可能坐在同一个代理后面,因此动态IP限制将这些用户视为一个用户。由于时间窗口相对较短(200毫秒),我预计这不会成为问题,同时在一定程度上阻止攻击。

此外,我们不限制同时连接的数量。在此处找到合理的数字几乎是不可能的,因为不同客户端的数量可能是无限的。

请注意,单个页面(取最多请求的页面)的请求对于获取有用的设置非常重要。例如,如果您的主页加载生成10个请求到您的服务器,那么这些请求将在非常短的时间内完成,因此您的限制必须有更高的阈值。

2015年4月更新

我们的服务已经使用这些设置运行了一年多了,到目前为止,我们感到非常满意。


1
非常明智的方法,刚刚意识到我们很多客户都是企业客户,因此当然共享相同的IP。基于流量,您有什么建议要调整的...例如唯一同时连接的用户? - Robert Hoffmann
@Robert 这是我一开始想到的问题。你对此有什么解决方法吗? - yakya
1
关于“同一代理”的问题,请注意此模块的最新版本(内置于iis8中)具有“代理模式”,该模式查看“X-Forwarded-For”标头而不是实际IP地址。https://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-dynamic-ip-address-restrictions - jazzcat
@jazzcat:客户端可以轻松修改该标头。只有在请求被您控制的机器(例如负载均衡器)转发时,您才应该尊重x-forwarded-for标头。当然,如果您使用负载均衡器,通常会希望将动态限制放置在负载均衡器本身而不是IIS上。 - Brian

1
有些人无法访问服务器,或者像我一样不满足动态IP限制,因此我为asp经典版编写了一个脚本。您可以将其放在想要的网页上(主页和/或内部)。它使用Mysql数据库。在示例中,我设置了每个IP在3秒内加载3个网页的禁令(这不是正常活动)。我只是想阻止对我的网站进行任何洪水、爬虫、ddos、机器人或恼人的访问。
1. 您需要创建一个MYSQL数据库:
CREATE TABLE `banip` ( `id` int(11) NOT NULL auto_increment, `IP` char(15) default NULL, `dtime` time default NULL, PRIMARY KEY (`id`), KEY `IP` (`IP`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
2. 您需要将ASP代码放到需要的位置 3. 再加上一个小型管理网页mybanipadm.asp(可以更改文件名)
ASP CLASSIC CODE:
<%
' ***PUT THIS CODE AT THE TOP OF YOUR WEBPAGE YOU WANT TO PROTECT***
' COULD BE HOME PAGE AND/OR INTERNAL PAGE
' THE BAN IS PERSISTANT UNTIL THE SERVER RESTART

response.buffer = true
IP = Request.ServerVariables("REMOTE_ADDR")

'IP WHITELIST - SEPARATE EACH IP WITH A |
IPWL = "127.0.0.1|"

if instr(IPWL,IP) then
'do nothing the ip is whitelisted
else

'CHECK IF THERE IS A BAN THAT MATCH THE CURRENT IP
if Application("mybanip") <> "" then
if instr(Application("mybanip"),IP) then

' RESPONSE EXAMPLE WHEN ACCESS DENIED (CHOOSE ONE OR MAKE YOUR)
'Response.Status = "403 Forbidden"
'Response.Status = "404 Not Found"
'response.redirect "banned.html"
response.write "You are going too fast !"

session.abandon
response.end
end if
end if


' THE TIME NOW
dtime = FormatDateTime(now(),3)

'we can decide to run it at speficied time
'if dtime >= "00:00:00" and dtime < "05:00:00" then


' PREPARE TO CHECK DATABASE FOR THE LAST 3 SECONDS ACTIVITY
secfrom = DateAdd("s",-3,now()) 'value you can change is -3 (seconds)
secfrom = FormatDateTime(secfrom,3)

' ***OPEN THE CONNEXION STRING (USE YOUR ONE OR MODIFY THIS)***
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "DRIVER={MySQL ODBC 3.51 Driver};server=127.0.0.1;uid=LOGIN;pwd=PSW;Database=DBNAME;"

' ***EVERYTHING BELOW MUST BE PUT AFTER THE CONNEXION STRING OPENED***

' POPULATE DATABASE WHIS THE CURRENT IP AND TIME
SQL = "INSERT INTO BANIP (IP,DTIME) values('" & IP & "','" & dtime & "')"
conn.execute(SQL)

' CHECK IF THERE IS A SPAM ACTIVITY FOR THE CURRENT IP
SQL = "SELECT COUNT(IP) as nbfound FROM BANIP WHERE IP='" & IP & "' AND dtime BETWEEN '" & secfrom & "' AND '" & dtime & "'"
set rsIPCount = conn.Execute(SQL)
if not rsIPCount.Eof then
ipcount = clng(rsIPCount("nbfound"))
else
ipcount = "0"
end if
rsIPCount.Close
set rsIPCount = nothing

' IF THERE IS AT LEAST 3 WEBPAGE LOADED IN 3 SECONDS ACTIVITY THEN SET A BAN
if ipcount >= 3 then 'value you can change is 3 (webpage)
application.lock
Application("mybanip") = Application("mybanip") & IP & "|"
application.unlock
end if


' DELETE ALL ENTRY EVERY 2 MINUTES FOR PERFORMANCE
if Application("mybanipdel") = "" then
Application("mybanipdel") = dtime
elseif datediff("n", Application("mybanipdel"), dtime) >= 2 or datediff("n", Application("mybanipdel"), dtime) < 0 then 'value you can change is 2 (minutes)
conn.execute "DELETE FROM BANIP"
Application("mybanipdel") = FormatDateTime(now(),3)
end if

SQL = ""
IP = ""
end if

%>

管理员页面 mybanipadm.asp

<html>
<head>
<title>My admin</title>
</head>
<body><%

if request.querystring("disconnect")="yes" then
session("adm") =""
elseif request.querystring("clear")="yes" then
Application("mybanip") = ""
end if

' ***CHANGE THIS VALUES***
login = "login"
passw = "pass"

if request.form("LogMe")<>"" and (request.form("login")=login and request.form("passw")=passw) then
session("adm") = "loggued"
elseif session("adm") = "" then
response.write "<p>Please log-in :</p> <form method=""post""><input type=""text"" size=""15"" name=""login"" placeholder=""login""> <input type=""password"" size=""15"" name=""passw"" placeholder=""password""><input type=""submit"" name=""LogMe""></form>"
response.end
end if

response.write "<p><a href=""?disconnect=yes"">Disconnect from the admin</a> - <a href=""?clear=yes"">Clear all ip</a></p>"

if request.form("unban")<>"" and request.form("ipban")<>"" then
application.lock
Application("mybanip") = replace(Application("mybanip"),request.form("ipban") & "|","")
application.unlock
response.write "<p>IP : <b>" & request.form("ipban") & "</b> has been unbanned !</p>"
end if

response.write "Unban this IP : <form method=""post""><input type=""text"" size=""15"" maxlenght=""15"" name=""ipban"" placeholder=""000.000.000.000""> <input type=""submit"" name=""Unban"" value=""Unban""></form>" 
response.write "<p>IP CURRENTLY BANNED</p>" & replace(Application("mybanip"),"|","<br>")

%>
</body>
</html>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接