Предыстория:
Стоял у меня Postfix настороеный полгода, я думал что всё хорошо и не напрягался. Спам натыкался на несуществующие адреса, ClamAV и spamassassin отдыхали. Тока засветил я своё мыло в инете - на следующий день приходит письмо. От меня ко мне же. А я и не припомню, чтобы я сам себе писал, да и архив вкладывал с екзешником. Какие-то ребята из Донецка постарались, ну - не суть важно. Понял я - мелкая бага в постфиксе - надо постфиксить :) Да и напарник по работе жаловался, что не получается сделать белый список на основании адреса отправителя не в ущерб другим проверкам. Да и сам постфикс мой давно просил проверки адреса отправителя.
Клиентами в этой статье я называю всех кто подключается к Postfix - будь то почтовые сервера, релеи или непосредственно рабочие станции.
В демоне smtpd есть 4 ограничения(restrictions) для почты
ОграничениеКогда проверяетсяЧто проверяется
smtpd_client_restrictionsсразу после установления соединенияip-адрес клиента
smtpd_helo_restrictionsна этапе HELO/EHLOприветсвие клиента
smtpd_sender_restrictionsна этапе MAIL FROM:адрес отправителя
smtpd_recipient_restrictionsна этапе RCPT TO:адрес получателя
В основном именно они используются на передовой линии антиспама. Проверка происходит в указанном порядке. Если какое-либо из ограничений даёт негативный ответ - дальнейшая проверка прекращается и клиент посылается куда подальше.
И есть одна директива, которая управляет временем вычисления значений и применения ограничений. Это smtpd_delay_reject. Если она равна yes, Postfix дождётся момента, когда будет доступна полная информация о клиенте(ip и helo) и письме(от кого и кому), и только после этого вступят в действие ограничения. Иначе ограничения вычисляются и применяются соотвественно таблице. По умолчанию директива включена. Как пишут в мане, это есть хорошо - в логе видно, кому и чья почта "не дошла". Также это даёт определённые плюсы - возможность оперировать всеми величинами во всех ограничениях. Поясню на примере.
Есть криво настроенные почтовые сервера, с которых приходится принимать почту. Перед моим напарником встала задача - принимать почту с определённого домена (пусть domain.com )во чтобы то ни стало. И не важно что почтовые сервера, с которых идёт эта почта, редко повторяются и не имеют преобразования ip в имя. Не требовать обратного преобразования вообще - засыпают спамом все кому не лень. Ждать пока засветятся все ip, с которых идёт domain.com' овская почта - долго да и где гарантися что не будет новых. Вообщем - засада. Вспоминаю с чего начинал - запретить почту из мира с моим же адресом отправителя. Заглядываю на форум в своей локалке, где проскакивала эта тема - и меня осеняет :) .
Оказывается в каждом ограничении можно проверять любой параметр, например в ограничении получателей smtpd_recipient_restrictions проверять ip-адрес клиента. Вот соотвествующие наиболее часто используемые директивы
Директивачто проверяет
check_client_accessip-адрес клиента
check_helo_accessприветсвие клиента
check_sender_accessадрес отправителя
check_recipient_accessадрес получателя
В нашем случае имеем
/etc/postfix/main.cf:
smtpd_delay_reject = yes

smtpd_client_restrictions = check_sender_access hash:/etc/postfix/sender_access, reject_unknown_client
/etc/postfix/sender_access:
domain.com OK
т.е. письма, приходящие с domain.com, не будут отвергаться, если у клиента нет преобразования ip в имя. От клиентов, присылающих письма от другого домена, потребуется наличие преобразования ip в имя.
Аналогично можно обходить для domain.com остальные проверки, если в этом есть необходимость. В то же время для других писем будут применены более жёсткие проверки, описание которых выходит за рамки этой статьи и которые довольно хорошо расписаны без меня.
Удачи!
зы: багу я постфиксил, проверку отправителя тоже сделал - ничего нетривиального.