The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Ограничение количества одновременных входящих коннектов в sendmail. (sendmail dns limit rate connect spam perl)


<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>
Ключевые слова: 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; }

<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>

Обсуждение [ RSS ]
  • 1, vvvua (ok), 20:26, 22/02/2007 [ответить]  
  • +/
    A через xinetd с ограничением на количество сессий?
    Проще раз в 20 :)
     
  • 2, MTumanov (?), 19:17, 20/06/2007 [ответить]  
  • +/
    Отсекает залповые рассылки очень успешно.
    За что автору огромное спасибо.
    Автор еще забыл сказать что надо написать короткий шелл-скриптик чтобы запускать перловый скрипт при старте сервера.
     
     
  • 4, Jorj (?), 23:45, 17/06/2008 [^] [^^] [^^^] [ответить]  
  • +/
    просто пора использовать exim - в нем это по дефолту присутствует, плют много всего для фильтрации зомби сетей из виндовсов
     

  • 3, Vaso Petrovich (?), 21:28, 18/10/2007 [ответить]  
  • +/
    как все таки люди любят изобритаьт велосипед, а ведь *nix way куда проще...
    iptables -A INPUT -p tcp -m tcp --sport 1024:65535 --dport 25 -m state --state ESTABLISHED -j ACCEPT
    iptables -A INPUT -p tcp -m tcp --sport 1024:65535 --dport 25 -m state --state NEW -m hashlimit --hashlimit 1/s --hashlimit-burst 2 --hashlimit-mode srcip --hashlimit-name SMTP --hashlimit-name SMTP -j ACCEPT
    iptables -A INPUT -p tcp -m tcp --dport 25 -j LOG --log-level debug --log-prefix "SMTP Flood "
    iptables -A INPUT -i eth0 -p tcp -m tcp --dport 25 -j TARPIT
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2021 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру