может и с опозданием но все же …
добавляем записи в NS
[cc]
vs.kiev.ua. IN TXT “v=spf1 +mx -all”
vs.kiev.ua. IN SPF “v=spf1 +mx -all”
[/cc]
добавляем пользователя от которого будет работать policyd-spf
[cc lang=bash]
pw group add spf -g 1111
pw user add spf -g spf -s /sbin/nologin -u 1111
[/cc]
ставим порт
portinstall mail/postfix-policyd-spf-perl
дальше чуть правим postfix-policyd-spf-perl чтоб он корректно работал c sqlgrey который я использую для грейлиста Источник ТУТ
root@mx1/usr/local/sbin> vi postfix-policyd-spf-perl
В подпрограмме sender_policy_framework находим строки
# Reject on HELO fail. Defer on HELO temperror if message would otherwise # be accepted. Use the HELO result and return for null sender. if ($helo_result->is_code('fail')) { syslog( info => "%s: SPF %s: HELO/EHLO: %s", $attr->{queue_id}, $helo_result, $attr->{helo_name} ); return "550 $helo_authority_exp"; } elsif ($helo_result->is_code('temperror')) { syslog( info => "%s: SPF %s: HELO/EHLO: %s", $attr->{queue_id}, $helo_result, $attr->{helo_name} ); return "DEFER_IF_PERMIT SPF-Result=$helo_local_exp"; } elsif ($attr->{sender} eq '') { syslog( info => "%s: SPF %s: HELO/EHLO (Null Sender): %s", $attr->{queue_id}, $helo_result, $attr->{helo_name} ); return "PREPEND $helo_spf_header" unless $cache->{added_spf_header}++; }
и приводим их к следующему виду
# Reject on HELO fail. Defer on HELO temperror if message would otherwise # be accepted. Use the HELO result and return for null sender. if ($helo_result->is_code('fail')) { syslog( info => "%s: SPF %s: HELO/EHLO: %s", $attr->{queue_id}, $helo_result, $attr->{helo_name} ); return "550 $helo_authority_exp"; } elsif ($helo_result->is_code('temperror')) { syslog( info => "%s: SPF %s: HELO/EHLO: %s", $attr->{queue_id}, $helo_result, $attr->{helo_name} ); return "DEFER_IF_PERMIT SPF-Result=$helo_local_exp"; } elsif ($attr->{sender} eq '' && $helo_result->is_code('pass')) { syslog( info => "%s: SPF %s: HELO/EHLO (Null Sender): %s", $attr->{queue_id}, $helo_result, $attr->{helo_name} ); return 'OK'; } elsif ($attr->{sender} eq '') { syslog( info => "%s: SPF %s: HELO/EHLO (Null Sender): %s", $attr->{queue_id}, $helo_result, $attr->{helo_name} ); return "DUNNO" }
Эти строки связаны с spf-проверкой заголовка helo. В оригинальной версии, если не произошло spf-отказа (fail) и все нормально работает, то при пустом отправителе, вне зависимочти от статуса (нет spf-записи, pass, softfail или neutral) в заголовки письма добавляется запись типа Received-SPF: pass (mail.domain.ru: xxx.xxx.xxx.xxx is authorized to use бла-бла-бла бла-бла-бла… и письмо проходит дальше. А дальше стоит грейлистинг…
В поправленом варианте, при пустом отправителе, если helo прошло spf-проверку — статус OK, письмо на доставку, если не прошло — мариноваться в грейлистинг.
[cc lang=perl]
# Same approach as HELO….
# syslog(
# info => “%s: SPF %s: Envelope-from: %s”,
# $attr->{queue_id}, $mfrom_result, $attr->{sender}
# );
# if ($mfrom_result->is_code(‘fail’)) {
# return “550 $mfrom_authority_exp”;
# }
# elsif ($mfrom_result->is_code(‘temperror’)) {
# return “DEFER_IF_PERMIT SPF-Result=$mfrom_local_exp”;
# }
# else {
# return “PREPEND $mfrom_spf_header”
# unless $cache->{added_spf_header}++;
# }
#
# return;
#http://hoarywolf.livejournal.com/12525.html
# Same approach as HELO….
syslog(
info => “%s: SPF %s: Envelope-from: %s”,
$attr->{queue_id}, $mfrom_result, $attr->{sender}
);
if ($mfrom_result->is_code(‘fail’)) {
return “550 $mfrom_authority_exp”;
}
elsif ($mfrom_result->is_code(‘temperror’)) {
return “DEFER_IF_PERMIT SPF-Result=$mfrom_local_exp”;
}
elsif ($mfrom_result->is_code(‘pass’)) {
return ‘OK’;
}
return;
[/cc]
Тут тоже все просто. Проверка по отправителю. Вместо добавления аналогичного заголовка и отправки в грейлистинг всех, кто не fail, измененная версия прошедшим проверку — статус OK, письмо на доставку, остальных мариноваться в грейлистинг. Fail изменения не затронули, они все также идут нафиг.
1. Add the following to /etc/postfix/master.cf:
[cc]
spf-policy unix – n n – 0 spawn
user=spf argv=/usr/local/sbin/postfix-policyd-spf-perl
[/cc]
The user nobody is fine if you have no other daemons running as nobody.
Otherwise, you should use a dedicated user and group for this policy
service.
2. Add “spf-policy_time_limit = 3600” to main.cf.
3. Configure the Postfix policy service in /usr/local/etc/postfix/main.cf:
smtpd_recipient_restrictions =
…
reject_unauth_destination
…
check_policy_service unix:private/spf-policy
…
NOTE: Specify check_policy_service AFTER reject_unauth_destination or your
system may become an open relay.
4. Restart Postfix.