From: Bad_UID <zhecka@gmail.com.>
Newsgroups: email
Date: Mon, 8 Feb 2007 14:31:37 +0000 (UTC)
Subject: Ограничение количества одновременных входящих коннектов в sendmail.
Защита от спама. Ограничение количества входящих коннектов в sendmail.
Введение
Пользователи почтовых систем на основе sendmail, думаю удивлены почему при наличии параметра
define(`confCONNECTION_RATE_THROTTLE', `2')dnl
почтовая система всё равно пропускает довольно большое количество одновременных коннектов.
Система просто не успевает посчитать все входящие соединения, т.к. расчетным временем является
одна секунда. А коннектов в секунду, как показывает практика, может быть очень много.
В связи с этим предлагаю вашему вниманию маленький скрипт который обеспечивает ограничение
одновременных соединений к серверу с одного IP.
Описание
Для реализации данной функции Вам понадобится пакет Stanford::DNSserver.
Можно взять с сайта http://www.stanford.edu/~riepel/lbnamed/Stanford-DNSserver/
или поставить из портов /usr/ports/dns/p5-Stanford-DNSserver/
Принцип работы
Stanford::DNSserver это пакет который позволяет построить DNS сервер со своей логикой работы.
Этим и воспользуемся. Находящийся чуть ниже скрипт добавляет блок обработки для ответов на
запросы для зоны "fastbl.dmz". Принцип работы прост. Блок обработки сохраняет значения первого
обращения к базе для искомого IP. В зависимости от установленного лимита времени $timelimit
и соединений $countlimit, формируются ответы для запросившего сервера, т.е. для нас.
Как только количество обращений для IP превысило лимит, сервер отдаёт значение "127.0.0.10"
с временем жизни $timelimit. Вышестоящий DNS сервер кеширует полученное значение и в течении
$timelimit не тратит ресурсы нашего скрипта. По истечении времени $timelimit IP адрес удаляется
из памяти блока обработки и из памяти кеширующего DNS сервера, таким образом экономятся ресурсы
сервера и осуществляется автоматическая разблокировка адресов.
Как запустить
Сохраните скрипт в файл.
Добавьте в named.conf строки
zone "fastbl.dmz" IN {
type forward;
forward first;
forwarders { 127.0.0.1 port 531; };
};
и перезапустите named.
Запустите скрипт. В случае удачного запуска Вы ничего не увидите :)
Добавьте в конфиг sendmail
FEATURE(`dnsbl', `fastbl.dmz', `"Too many connections from your ip "$&{client_addr} ". Please resend mail later."')dnl
Скомпилируйте конфиг и перезапустите sendmail.
Всё.
Для диагностики работы нашего dns сервера можно изменить следующие параметры
daemon => "no",
debug => 1.
После чего скрипт будет запущен в консольном режиме.
Данный скрипт не гарантирует Вам 100% защиту от спама, но поможет уменьшить количество сообщений получаемых во время массовых
рассылок.
PS: также для борьбы со спамом можете использовать
http://sourceforge.net/projects/ddnsbl в новый релиз которого будет включен данный скрипт.
Удачи в борьбе со спамом.
#!/usr/bin/perl
use Stanford::DNS;
use Stanford::DNSserver;
use vars qw(%ttlh %count %trust $timelimit);
$timelimit = 15;
$countlimit = 1;
$ns = new Stanford::DNSserver (
listen_on => ["127.0.0.1"],
port => 531,
defttl => 15,
debug => 0,
daemon => "yes",
logfunc => sub { print shift,"n" },
loopfunc => sub { print "checking....", `date` },
exitfunc => sub { print "Shutting downn" }
);