Подтвердить что ты не робот

Каковы оптимальные "Динамические настройки ограничения IP-адресов" в IIS8

Итак, я включил это на своем сайте облачных сервисов Azure, чтобы попытаться смягчить пауков и ботов, поразивших нас абсурдным количеством раз.

У кого-нибудь есть опыт работы с этими настройками?

Отклонить IP-адрес в зависимости от количества одновременных запросов: Максимальное количество одновременных запросов?

Отклонить IP-адрес в зависимости от количества запросов за определенный период времени: Максимальное количество запросов? Период времени (в миллисекундах)?

4b9b3361

Ответ 1

Экспериментальный подход для поиска разумных настроек

Недавно я экспериментировал с этими настройками, чтобы определить ценности для нашего сайта.

Мы определили максимальное количество запросов, которые генерируют одна (запрашиваемая тяжелая) страница, и умножили это значение на 2,5, чтобы получить максимальное количество запросов с течением времени. Для значения времени я выбрал 200 мс.

Ручное тестирование показывает, что эти настройки работают нормально для "нормального" использования. Нам удается получить около 403 Forbidden, когда мы одновременно перезагружаем страницу с 5 или более вкладками в браузере.

Что-то, о чем вы должны помнить, состоит в том, что многие пользователи вашего сайта могут сидеть за одним и тем же прокси-сервером, поэтому динамические IP-ограничения считают этих пользователей только одним. С довольно коротким окном в 200 мс я ожидаю, что это не будет проблемой, в то же время блокируя агрессивные атаки DoS в некоторой степени.

Кроме того, мы не ограничиваем количество одновременных подключений. Здесь почти невозможно найти разумное число, так как количество разных клиентов потенциально неограничено.

Обратите внимание, что запросы на одну страницу (например, с большинством запросов) имеют большое значение для получения полезных настроек. Например. если загрузка страницы на вашей первой странице генерирует 10 запросов на ваш сервер, это произойдет очень короткое время, поэтому ваши ограничения должны иметь более высокий порог.

Обновление апрель 2015 г.

Наш сервис работает уже более года с этими настройками, и мы до сих пор довольны.

Ответ 2

Некоторые люди не имеют доступа к серверу, или, как и я, их не устраивает ограничение Dynamic IP, поэтому я сделал скрипт для asp classic.

Вы можете разместить его на нужной веб-странице (домашней и/или внутренней). Это использует Mysql DB. В этом примере я установил бан для каждой IP-страницы, загружающей 3 веб-страницы за 3 секунды (это не обычное действие). Я просто хочу заблокировать каждый флуд, сценарий стремления, ддос, бот или раздражающий доступ к моему сайту.

  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;
  1. ВАМ НУЖНО СДЕЛАТЬ АСП-КОД, ГДЕ НУЖЕН

  2. PLUS A TINY ADMIN WEBPAGE mybanipadm.asp (можно изменить имя файла)

ASP КЛАССИЧЕСКИЙ КОД:

<%
' ***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>