Ключевые слова:sendmail, dns, limit, rate, connect, spam, perl, (найти похожие документы)
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 down\n" }
);
$ns->add_dynamic("fastbl.dmz" => \&handle_request);
$ns->answer_queries();
sub handle_request {
my ($domain, $residual, $qtype, $qclass, $dm, $from) = @_;
my $tm = time();
foreach my $host (keys %ttlh)
{
my $difftm = $tm - $ttlh{$host};
if ($difftm > $timelimit)
{
delete $ttlh{$host}; delete $count{$host};
}
}
$ttlh{$residual} = $tm if (!$ttlh{$residual});
$count{$residual} = 0 if (!$count{$residual});
$count{$residual} = $count{$residual} + 1;
if($qtype == 1)
{
if($count{$residual})
{
if($count{$residual} > $countlimit && ($tm-$ttlh{$residual}) < $timelimit)
{
$dm->{answer} .= dns_answer(QPTR,T_A,C_IN,$timelimit,rr_A(0x7f00000A));
$dm->{ancount} += 1;
}
}
}
elsif($qtype == 6)
{
$dm->{answer} .= dns_answer(QPTR,T_SOA,C_IN,$timelimit,rr_SOA("localhost.fastbl.dmz", "hostmaster.fastbl.dmz",$tm, $timelimit, $timelimit, 120, 0));
$dm->{ancount} += 1;
}
return 0;
}
Отсекает залповые рассылки очень успешно.
За что автору огромное спасибо.
Автор еще забыл сказать что надо написать короткий шелл-скриптик чтобы запускать перловый скрипт при старте сервера.