Как защититься от граберов?

12
K
На сайте с 12.07.2006
Offline
295
Kpd
2393

Какой-то нехороший человек повадился грабить мой сайт. Делает он это очень активно (до 30к страниц за час) и неаккуратно (грабилка неправильно обрабатывает javascript и забивает мусором логи битых страниц), поэтому решил я с этим бороться. Диспозиция

- питерский провайдер с большим пулом адресов

- большая скорость, скорее всего ADSL или что-то типа того

- после блокировки (а иногда и сами по себе) ip меняется, т.е. ip не фиксированный

- относительно редкий и постоянный user_agent

Пока вручную добавляю в iptables ip, с которых идет грабинг. Как правильно автоматизировать этот процесс (какой алгоритм) ?

Pol Fransheski
На сайте с 27.12.2006
Offline
80
#1

Интересно ?

Сложилось впечетление что Данное действо происходит уже продолжительное время.

Сколько же у вас на сайте страниц?

Может быть имеет место не граб. а чтото типа досса? И конечная цель не граб контента а создание повышенной нагрузки на сервер.

d1ma
На сайте с 18.03.2007
Offline
102
#2

надо ограничнить пользователей в коэфициенте число запросов в единицу времени

на уровне апачи для этого есть модуль mod_security

на уровне iptables для этого есть модули connlimit и iplimit

один раз мне эту задачу пришлось решать и на shared хостинге - пришлось написать парсер логов на пхп и поставить его в крон

K
На сайте с 12.07.2006
Offline
295
Kpd
#3
Pol Fransheski:
Сложилось впечетление что Данное действо происходит уже продолжительное время.

Появляется периодически. Пару дней грабит, потом неделю тишина. Впервые появился около месяца назад. Сейчас заблокировал несколько адресов, тишина.

Pol Fransheski:
Сколько же у вас на сайте страниц?

Год назад было около 300к, потом перестал считать.

Pol Fransheski:
Может быть имеет место не граб. а чтото типа досса?

Для ддоса слишком тупой алгоритм. Сегодня сервер загрузился на 45-50% (обычно в это время нагрузка ~10%), на скорости отдачи страниц посетителям это почти не повлияло. Кроме того, грабер подставляет в Referer адрес страницы, на которой была найдена ссылка.

K
На сайте с 12.07.2006
Offline
295
Kpd
#4
d1ma:
надо ограничнить пользователей в коэфициенте число запросов в единицу времени

Ограничивать всех посетителей не хочется (сам часто открываю в фоновом режиме несколько страниц).

d1ma:
на уровне iptables для этого есть модули connlimit и iplimit

В iptables можно блокировать посетителей с определенного диапазона адресов и определенного user_agent?

d1ma:
один раз мне эту задачу пришлось решать и на shared хостинге - пришлось написать парсер логов на пхп и поставить его в крон

И что делали с этим дальше?

MIRhosting.com
На сайте с 18.10.2006
Offline
203
#5

Вобщем-то грамотно настроенный апач с хорошим firewall должен решать такие проблемы практически прозрачно.

Для начала:

1. mod_evasive.

2. csf.

Во втором есть функция бана на основание кол-ва подключений. Скажем если больше 50 (всех статусов, в том числе и WAIT, SYN), то банится.

Андрей Нестеренко, MIRhosting Облачная платформа для DevOps (https://mirhosting.com/paas)
d1ma
На сайте с 18.03.2007
Offline
102
#6

По user agent можно заблокировать через .htaccess:

RewriteCond %{HTTP_USER_AGENT} ^Mozilla/4.0\ \(compatible;\ MSIE\ 5.00;\ Windows\ 98\)$ [NC]

RewriteRule .* - [F,L]

Тот мой скрипт добавлял IP в deny список .htaccess

Roxis
На сайте с 19.11.2006
Offline
40
#7

для блокировки доступа по ip и user_agent на уровне apache можно заюзать mod_rewrite или mod_setenvif

d1ma
На сайте с 18.03.2007
Offline
102
#8

Можно сделать блокировку в .htaccess по комбинации критериев маска ip & user agent, причем без mod_access и mod_setenvif, так я думаю оптимально будет:


RewriteCond %{REMOTE_HOST} ^208\.66\.195\.([0-255])$
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/4.0\ \(compatible;\ MSIE\ 5.00;\ Windows\ 98\)$ [NC]
RewriteRule .* - [F,L]

У меня такое работает, но вообще там вместо %{REMOTE_HOST} надо писать %{REMOTE_ADDR} , наверно зависит от настроек сервера.

K
На сайте с 12.07.2006
Offline
295
Kpd
#9
d1ma:
Можно сделать блокировку в .htaccess по комбинации критериев маска ip & user agent, причем без mod_access и mod_setenvif, так я думаю оптимально будет:

Вы правы,в моем случае это самое оптимальное решение. Но возникла техническая проблема - перед Апачем у меня стоит Nginx, поэтому REMOTE_ADDR показывает локальный адрес сервера, а HTTP_X_FORWARDED_FOR и HTTP_X_REAL_IP mod_rewrite не видит. Кто-нибудь знает как обойти эту проблему?

d1ma
На сайте с 18.03.2007
Offline
102
#10

А по-моему можно, обратите внимание на следующий метод:

There is the special format: %{HTTP:header} where header can be any HTTP MIME-header name. This is looked-up from the HTTP request. Example: %{HTTP:Proxy-Connection} is the value of the HTTP header ``Proxy-Connection:''.

Соотвественно вам надо пробовать:

RewriteCond %{HTTP:HTTP_X_FORWARDED_FOR}

или

RewriteCond %{HTTP:HTTP_X_REAL_IP}

У меня это работает, правда для других параметров.

Если что название переменных окружения можно уточнить в phpinfo.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий