Ключевые слова:mail, sendmail, postfix, validate, filter, (найти похожие документы)
From: Anton Lysenok <bart@unixpages.net.>
Newsgroups: email
Date: Mon, 9 Nov 2008 17:02:14 +0000 (UTC)
Subject: Проверка адреса отправителя при помощи Smfsav
Оригинал: unixpages.netВведение
Зачем нужна проверка адреса отправителя на почтовых серверах? SMTP
протокол фактически не гарантирует доставку письма, но всячески
способствует хотя бы косвенно уведомить отправителя о возможных
проблемах. Ниже приведена схема, по которой работает SMTP сервер:
Сервер получает письмо и пытается доставить получателю
Если возникает ошибка, создается отчет об ошибках и отправляется отправителю
Если возникает ошибка при отправке письма отправителю, сервер пытается
отправить отчет своему postmaster'у
Если недоступен адрес postmaster'a, в логи добавляется событие "savemail
panic" и обработка письма вместе с отчетом останавливается
Как видите, SMTP сервер пытается, во чтобы то ни стало, доставить письмо
получателю или известить компетентых людей об ошибках. Если у вас есть
почтовый сервер, обратите внимание, сколько писем у него в очереди.
Скорее всего, вы увидите письма от MAILER-DAEMON или postmaster на
непонятные адреса типа <klausdefargt093fstb@poweroverhealthing.ee.>.
Потому что спаммеры зачастую в своих письмах указывают неверный обратный
адрес, а заодно и неверный адрес получателя. Согласно вышеуказанной
схеме, отчет должен уйти отправителю, вот и висит он, потому что некуда
ему идти. Механизм проверки адреса отправителя вовсе не гарантирует, что
адрес отправителя в письме - это настоящий адрес отправителя, но
позволит нам хотя бы удостовериться, что это рабочий адрес, и, как
минимум, на него можно будет отправить отчет о недоставке.
Технология
Обычная SMTP сессия выглядит примерно так:
<= 220 Server ESMTP ready
=> HELO mx.yandex.ru
<= 250 server.firma.ua Hello mx.yandex.ru [212.89.22.56], pleased to meet you
=> MAIL FROM:<invalid@address.com.>
<= 250 2.1.0 Ok
=> RCPT TO:<petrov@firma.ua.>
<= 250 2.1.5 Ok
=> DATA
<= 354 Enter mail, end with "." on a line by itself
=> text
=> of
=> mail
=> .
<= 250 2.0.0 mAA8JNbB099896 Message accepted for delivery
=> QUIT
<= 221 2.0.0 server.firma.ua closing connection
Фильтр, отвечающий за проверку адреса получателя, вызывается почтовым
сервером после команды MAIL FROM и делает примерно следующие действия:
Получает список MX записей для домена address.com
nslookup -type=MX address.com
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
address.com mail exchanger = 10 spam04.affinitypath.com.
address.com mail exchanger = 20 spam01.affinitypath.com.
Подключается к одному из них и производит следующий диалог с сервером:
<= 220 Server ESMTP ready
=> HELO server.firma.ua
<= 250 spam04.affinitypath.com Hello server.firma.ua [11.22.33.44], pleased to meet you
=> MAIL FROM:<validator@firma.ua.>
<= 250 2.1.0 Ok
=> RCPT TO:<invalid@address.com.>
<= 550 User not found.
=> QUIT
<= 221 2.0.0 spam04.affinitypath.com closing connection
Возращает отправителю ошибку без приема письма. Сессия будет выглядеть
примерно так:
<= 220 Server ESMTP ready
=> HELO mx.yandex.ru
<= 250 server.firma.ua Hello mx.yandex.ru [212.89.22.56], pleased to meet you
=> MAIL FROM:<invalid@address.com.>
<= 550 Sender address verification failed
=> QUIT
<= 221 2.0.0 server.firma.ua closing connection
Установка smfsav для sendmail
Установите smfsav из исходников (сорцы возьмите
на http://smfs.sourceforge.net/smf-sav.html), либо из портов FreeBSD:
make install clean -C /usr/ports/mail/smfsav
Поправьте в конфиге smfsav.conf, который скорее всего будет в
/usr/local/etc:
PublicName dns_имя_вашего_сервера #Узнайте командой nslookup ваш_внешний_IP
SafeCallBack postmaster@firma.ua #Заведомо рабочий адрес в вашем домене
Запустите сервис
/usr/local/etc/rc.d/smfsav start
Пропишите фильтр в конфиг sendmail'a /etc/mail/your_hostname.mc
INPUT_MAIL_FILTER(`smfsav', `S=unix:/var/run/smfsav/smfsav.sock, T=S:30s;R:4m')
Пересоберите конфиги и перезапустите сервер
make all install stop start -C /etc/mail
Все, ждите сообщений в логах!
# tail -f /var/log/maillog |grep smf
Nov 10 10:37:52 gt smf-sav[60084]: sender check failed: <tefighter70@icqmail.com.>, 83.9.68.148, abzw148.adsl.tpnet.pl, [00:00:06]
Nov 10 10:40:09 gt smf-sav[60084]: sender check failed: <yu@basf.com.>, 89.254.215.113, line113-49.adsl.kirov.ru, [00:00:03]
Nov 10 10:41:05 gt smf-sav[60084]: sender check failed: <simeon@basf.com.>, 89.20.23.89, [89.20.23.89], [00:00:04]
Nov 10 10:44:32 gt smf-sav[60084]: sender check failed: <www.@ruthschris.com.>, 85.72.60.199, oikopano.static.otenet.gr, [00:00:03]
Nov 10 10:45:08 gt smf-sav[60084]: sender check succeeded: <fields@whsllc.com.>, 59.90.187.144, [59.90.187.144], [00:00:02]
Настройка фильтра на postfix
Такой механизм уже есть в стандартной поставке postfix'a, добавьте
нужное значение в следующий параметр конфига main.cf:
smtpd_sender_restrictions = ..., reject_unverified_sender