2009-02-01 6 views
4

У меня есть веб-сервис CGI/Fast CGI на основе Perl и вы хотите ограничить количество клиентов по IP-адресу, чтобы остановить агрессивных клиентов, вызывая слишком много работы.Как я могу реализовать ограничение скорости на стороне сервера для веб-службы Perl?

Я искал код и нашел Algorithm::TokenBucket в CPAN, но это касается запросов клиентов; он не имеет настойчивости и не имеет конфигурации для каждого пользователя, поэтому он не очень полезен для ограничения скорости на стороне сервера.

Я ищу предложения для чего-то, что уже существует, в противном случае мне нужно будет свернуть свое собственное, основываясь на некоторой простой настойчивости, такой как привязка к DB_File для IP-адреса и некоторое пакетное задание, которое выполняет управление маркерами.

ответ

5

Я использовал Cache::FastMmap для ограничения скорости путем отслеживания ударов по IP-адресу. Это кеш, поэтому данные истекают с течением времени, но если вы установите правильный размер и срок действия, это не должно быть проблемой.

IP-адрес - это хеш-ключ, а хэш-значение - это массив временных меток. У меня есть вторая структура данных (также поддерживается Cache::FastMMap), которая является хешем запрещенных IP-адресов, обновленных в соответствии с данными из первой структуры.

+0

У меня был Cache :: FastMmap истекает запись до истечения срока их действия и до того, как кеш заполнен (все страницы). Имея это в виду, я бы использовал BDB вместо этого, и вручную истекал устаревшие записи. – jrockway

+0

Ну, я решил использовать Cache :: FastMmap для обеспечения производительности и одновременного доступа, а потому, что ограничение * строгого ограничения скорости не требовалось. Последнее, кажется, применяется здесь, я не знаю о первом. – kixx

4

Я знаю, что это не то, о чем вы просили, но считаете ли вы, что вы занимаетесь этим в другом месте в стеке, где это уже сделано для вас? Ясно, что я не знаю ваш стек развертывания, но если это apache, вы можете использовать mod_evasive. Если вы в Linux, вы можете позволить iptables выполнять свою работу, используя что-то вроде:

#Allow only 12 connections per IP 
/sbin/iptables -A INPUT -p tcp --dport 80 -m conn-limit --connlimit-above 12 -j REJECT --reject-with tcp-reset 

возможно более сложные правила.

+0

У меня нет доступа к конфигурации сервера - это общий хостинг, поэтому мне нужен уровень приложения, чтобы справиться с этим, в этом случае perl, так как это то, что я его написал. – dajobe

+0

Я ищу варианты ограничения скорости для моего FastCGI API. Я думал, что mod_evasive является идеальным решением, однако я нашел проблему с модулем в отношении запросов к скрипту (не для браузера). Кажется, mod_evasive работает в секунду, но не работает в течение второго. I.e, вы можете перейти к пределу запроса DOSPageInterval & DOSSiteInterval, если это будет сделано достаточно быстро. По этим причинам я ищу альтернативные решения. Просто примечание для любого, кто с любопытством смотрит на mod_evasive –

Смежные вопросы