Spamd - секретный контрудар Andrey Matveev, Anton Karpov Хакер, номер #085, стр. 085-106-3 Задача спамера состоит в том, чтобы в кратчайшие сроки отправить максимально возможное количество рекламных писем. При этом успешность отправки каждого сообщения не отслеживается. Одна из главных причин - в мире электронной почты надежность доставки исходящей корреспонденции дорогого стоит, а именно: наличия специальных инжекторов, выполнения дополнительных ресурсоемких системных вызовов, к примеру, fsync(2) и write(2), и операций с очередью /var/spool/mqueue (либо миграции очередей). Так что работу спамеров можно охарактеризовать как «отправил и забыл» (fire and forget). Мы на этом и сыграем. Суть идеи greylisting'а предельно проста: корректно сконфигурированный почтовый сервер отправителя, получив определенный ответ от сервера получателя, обязан повторить попытку доставки письма через некоторый промежуток времени (обычно 5, 15, 25, 30 или 60 минут). Зная это, в качестве ответа на соединение от неизвестного почтового сервера с помощью spamd мы будем возвращать не стандартное SMTP-сообщение OK или Rejected, а временную ошибку с кодом 450, 451 или 550. Когда почтовый сервер отправителя повторит доставку письма (а по RFC он обязан это сделать), мы примем к сведению, что данный сервер уже пытался отправить нам письмо N минут назад, а значит, он не спамер. И тогда мы примем корреспонденцию. Некоторые SMTP-коды ошибок, после которых отправитель обязан повторить попытку отправки письма: 450 Requested mail action not taken: mailbox unavailable (E.g., mailbox busy) 451 Requested action aborted: local error in processing 550 Requested action not taken: mailbox unavailable (E.g., mailbox not found, no access) # tail /var/log/maillog Dec 1 01:55:53 toxahost sm-mta[21632]: j9F9jgYV021632: to=<andrushock@domain1.ru>, delay=00:00:11, xdelay=00:00:11, mailer=esmtp, pri=30808, relay=mail.domain1.ru. [81.211.11.22], dsn=4.3.0, stat=Deferred: 451 Temporary failure, please try again later. На приведенном куске лога видно, что сервер mail.domain1.ru отверг наше письмо адресату andrushock@domain1.ru. Если бы мы заглянули в /var/log/daemon этого сервера, мы бы увидели результат работы greylisting: # tail /var/log/daemon Dec 1 01:56:19 mail spamd[3135]: 62.16.22.33: connected (1/0) Dec 1 01:56:30 mail spamd[3135]: (GREY) 62.16.22.33: <toxa@domain2.ru> -> <andrushock@domain1.ru> Dec 1 01:56:30 mail spamd[3135]: 62.16.22.33: disconnected after 11 seconds. Затем, через некоторое время, мы увидим, что адрес сервера отправителя - 62.16.22.33 - занесен в «белый список», и при попытке повторной отправки письмо уйдет немедленно, без каких-либо проблем: # pfctl -t spamd-white -T show | grep 62.16.22.33 62.16.22.33 Чтобы получить все эти вкусности, включим spamd в конфигурационном файле стартового сценария. За счет указанных ниже аргументов мы сможем произвести более подробное журналирование событий ('-v'), подменить приветственный баннер на «Postfix» ('-n') и перевести демона в режим greylisting (spamd_grey=YES аналог '-g'): |