ФИЛЬТРУЕМ ПО HELO. 1. Sendmail (8.12.*) Добавляем следующий RuleSet в конец нашего любимого sendmail.mc: ---- кусь ---- LOCAL_RULESETS SLocal_check_mail R $* $: $1 $| $&s $| $&{client_name} R $* $| hotmail . com $| $+ . hotmail . com $: $1 $| hotmail . com R $* $| hotmail . com $| $+ $#error $: it looks like message from fake hotmail.com R $* $| $+ $| $* $: $1 $| $2 R $* $| $+ $: $1 $| < $(access Helo:$2 $: ? $) > R $* $| < REJECT:$* > $#error $: "553 Helo command rejected" R $* $| < REJECT $* > $#error $: "553 Helo command rejected" R $* $| < DISCARD:$* > $#discard $: "553 Helo command rejected" R $* $| < DISCARD $* > $#discard $: "553 Helo command rejected" R $* $| < TEMP:$* > $#error $@ TEMPFAIL $: Service unavailable. Try again later R $* $| $* $: $1 ---- кусь ---- Обращаем внимание, что валидными разделителями в конфиге является а не . Генерим с помощью m4 sendmail.cf Теперь в /etc/mail/access можно добавить записи такого вида: ---- кусь ---- Helo:compuserve.com REJECT ---- кусь ---- Таким образом отправителю, представившемуся в HELO как compuserve.com будет выдан REJECT: ---- экшен ---- bad_guy@spam_host: telnet relay.victim.ru 25 Trying aaa.bbb.ccc.ddd... Connected to victim.ru. Escape character is '^]'. 220 relay.victim.ru ESMTP Sendmail 8.12.9/8.12.9; Sat, 21 Jun 2003 15:52:48 +0400 (MSD) helo compuserve.com 250 relay.victim.ru Hello [XXX.YYY.ZZZ.AAA], pleased to meet you mail from: 553 5.3.0 <>... Helo command rejected quit 221 2.0.0 relay.victim.ru closing connection Connection closed by foreign host. ---- экшен ---- 2. Postfix (2.0.*) В postfix'е в отличие от sendmail'а это делается штатными средствами, и к тому же механизм более гибкий. Добавляем в main.cf: ---- кусь ---- smtpd_helo_required = yes smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_non_fqdn_hostname, check_helo_access hash:/etc/mail/helo ---- кусь ---- permit_sasl_authenticated позволяет нам релеить после успешной авторизации с внутренней сетки (если таковая присутствует), с "серыми" адресами, в которой компьютеры представляются в HELO согласно их сетевому имени, что как раз удовлетворит отсекающее условие (если оно есть) reject_unknown_hostname. Кроме того, можно без всяких проверок позволить релеить с хостов, перечесленных в mynetworks (permit_mynetworks). Теперь создаем таблицу, которая будет содержать данные для проверки аргумента HELO (например /etc/mail/helo): ---- экшен ---- root@victim.ru# touch /etc/mail/helo root@victim.ru# echo "compuserve.com REJECT" >> /etc/mail/helo ---- экшен ---- Теперь можно создать "ленивый скрипт", помогающий сэкономить нам телодвижения при дальнейшей работе с helo.db, ну и заодно с aliases.db, access.db и virtusertable.db: ---- экшен ---- root@victim.ru# cd /etc/mail root@victim.ru# touch make.sh root@victim.ru# chmod u+x make.sh ---- экшен ---- Содержимое make.sh: ---- кусь ---- #!/bin/sh cd /etc/mail case "$1" in maps) /usr/local/sbin/postmap access /usr/local/sbin/postmap helo /usr/local/sbin/postmap virtusertable ;; aliases) /usr/bin/newaliases ;; all) /usr/local/sbin/postmap access /usr/local/sbin/postmap helo /usr/local/sbin/postmap virtusertable /usr/bin/newaliases ;; *) echo "Usage: ${0##*/}: { maps | aliases | all }" 2>&1 exit ;; esac ---- кусь ---- После чего строим базу и заставляем постфикс перечитать конфиг: ---- экшен ---- root@victim.ru# cd /etc/mail root@victim.ru# ./make.sh maps root@victim.ru# /usr/local/sbin/postfix reload ---- экшен ---- Теперь все попытки удаленного хоста представиться в HELO какой-нибудь белибердой типа "HELO adjkeszxdr", а также в частности "HELO compuserve.com" будут обречены на провал: ---- экшен ---- bad_guy@spam_host: telnet relay.victim.ru 25 Trying aaa.bbb.ccc.ddd... Connected to relay.victim.ru. Escape character is '^]'. 220 relay.victim.ru ESMTP Postfix helo sdfercmfhry 250 relay.victim.ru mail from: 250 Ok rcpt to: 450 : Helo command rejected: Host not found quit 221 Bye Connection closed by foreign host. bad_guy@spam_host: telnet relay.victim.ru 25 Trying aaa.bbb.ccc.ddd... Connected to relay.victim.ru. Escape character is '^]'. 220 relay.victim.ru ESMTP Postfix helo compuserve.com 250 relay.victim.ru mail from: 250 Ok rcpt to: 554 : Helo command rejected: Access denied quit 221 Bye Connection closed by foreign host. ---- экшен ---- 3. На заметку спамолову Что должна содержать база helo? Кроме злополучного compuserve.com там может находиться любое "неправильное" имя, которым норовят представиться "злоумышленник". Например: www.mail.ru (mail.ru не имеет MX-ов с таким именем) итп. Кроме того, я никогда не поверю тому, кто в HELO представляется IP-адресом моего же хоста. К тому же имеет смысл прописать туда свое доменное имя - не путать с hostname (хотя, в случае использования postfix можно занести и его - убедившись что 127.0.0.1/32 и aaa.bbb.ccc.ddd/32 включены в mynetworks). То есть, если я держу почтовик, который получает почту для victim.ru, при этом hostname почтовика - relay.victim.ru - строку "victim.ru REJECT" можно спокойно занести в базу helo: ---- кусь ---- aaa.bbb.ccc.ddd REJECT # my IP victim.ru REJECT # my domain_name compuserve.com REJECT # compuserve.com ---- кусь ---- -- Nikolaj I. Potanin