SPF не рулит (или на хитрую ... есть ... с винтом)

EXIM, sendmail, postfix, Dovecot и прочие. Решение проблем связанных с работой электронной почты

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Guest
проходил мимо

SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение Guest » 2010-12-27 19:21:54

Всем привет!

Решил попробовать SPF и вот:

Код: Выделить всё

2010-12-27 17:24:13 H=(smtp.adslplus.ch) [89.217.116.196] I=[ХХХ.ХХХ.ХХХ.ХХХ]:25 Warning: SPF check result: pass
2010-12-27 17:24:14 H=adsl-89-217-116-196.adslplus.ch (smtp.adslplus.ch) [89.217.116.196] I=[ХХХ.ХХХ.ХХХ.ХХХ]:25 F=<inf@nicepost.ru> ...
Смотрю, с чего бы это "SPF check result: pass", что за бня?

А вот чего:

Код: Выделить всё

host -t txt nicepost.ru
nicepost.ru descriptive text "v=spf1 a mx ip4:55.11.65.20/2 ip4:90.2.123.112/2 ip4:176.33.87.19/2 ip4:212.63.89.33/2 -all"
Обратите внимание на маски...

А вот и наш герой:

Код: Выделить всё

domain:     NICEPOST.RU
nserver:    ns1.pegas-dns.com.
nserver:    ns2.pegas-dns.com.
state:      REGISTERED, DELEGATED, UNVERIFIED
person:     Private Person
phone:      +380  99  4015332
e-mail:     ivan_stanislavsky@bk.ru
registrar:  REGTIME-REG-RIPN
created:    2010.09.20
paid-till:  2011.09.20
source:     TCI
Так умирают мечты...

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2520 рублей (8 CPU, 8Gb RAM, 2x500Gb HDD, RAID 3ware 9750):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение dikens3 » 2010-12-27 22:25:06

Это в разделы приколы надо. SPF тут не причём, всякое бывает с админами и руками.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1220
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение xM » 2010-12-28 10:14:18

dikens3 писал(а):Это в разделы приколы надо. SPF тут не причём, всякое бывает с админами и руками.
Может быть. Только отчего SPF то pass тогда хотелось бы понять. И как с этим бороться, соответственно.
IT voodoo blog https://kostikov.co

Guest
проходил мимо

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение Guest » 2010-12-28 10:25:25

Дело не в криворукости, а в сознательном создании таких записей спамерами - зарегистрировал домен, прописал SPF с подсетями (любыми) и рассылай--не хочу, в крайнем случае, все спишется именно на криворукость.
Вы посмотрите в ARIN, кому принадлежат подсети с указанными "админом" niceport.ru IP-адресами, например 55.11.65.20:

Код: Выделить всё

NetRange:       55.0.0.0 - 55.255.255.255
CIDR:           55.0.0.0/8
OriginAS:      
NetName:        ARMY-RCAS
NetHandle:      NET-55-0-0-0-1
Parent:        
NetType:        Direct Allocation
NameServer:     NS01.ARMY.MIL
NameServer:     NS02.ARMY.MIL
NameServer:     NS03.ARMY.MIL
RegDate:        1996-10-26
Updated:        2007-04-06
Ref:            http://whois.arin.net/rest/net/NET-55-0-0-0-1
Так что вопрос о "кривых руках" (дескать, ошибся с маской) отпадает - торчат рога и копыта. А механизм SPF получается никак не защищен от подобных вещей. Такие дела...

Guest
проходил мимо

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение Guest » 2010-12-28 10:38:38

to xM:
Только отчего SPF то pass тогда хотелось бы понять.
А потому, что с точки зрения SPF все корректно:
Адрес отправителя: @nicepost.ru
IP-адрес отправителя: 89.217.116.196
Смотрим в SPF nicepost.ru и видим запись: "v=spf1 a mx ip4:55.11.65.20/2 ip4:90.2.123.112/2 ip4:176.33.87.19/2 ip4:212.63.89.33/2 -all", таким образом наш 89.217.116.196 разрешен в домене nicepost.ru.
И как с этим бороться, соответственно.
Получается, что никак - о чем и написал. В этом и оказалась уязвимость хорошей идеи. Никто ведь не запретит товарисчу ivan_stanislavsky@bk.ru делать такие записи в своем ДНС? Или я ошибаюсь?

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1220
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение xM » 2010-12-28 11:55:53

Н-да. Т.е. только ручками блэклистить по имени домена или IP который его релеит включать в DNSBL.
Временная мера, понятно.
IT voodoo blog https://kostikov.co

moury
сержант
Сообщения: 249
Зарегистрирован: 2009-02-06 23:02:40
Откуда: Москва
Контактная информация:

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение moury » 2010-12-28 12:06:55

xM писал(а):Н-да. Т.е. только ручками блэклистить по имени домена или IP который его релеит включать в DNSBL.
Временная мера, понятно.
Нет.

Игнорировать pass в настройках почтового сервера.

То есть, SPF должен быть лишь рядовым запрещающим правило среди других запрещающих.
Сисадмин - вождь апачей

Guest
проходил мимо

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение Guest » 2010-12-28 13:13:14

Посмотрел статистику за сутки:
SPF pass: 8% (корректные mail, gmail, yandex + несколько фэйков типа вышеописанного случая)
SPF fail, error: 14%
SPF none, neutral: 78%

Резюме: надо использовать только SPF fail, error (pass, none, neutral игнорируем).
Себе в домены в ДНС прописал SPF и DKIM, только чтобы мои письма не резали, в своих acl'ах использовать SPF не буду - как показала практика (критерий истины!), свои фильтры работают лучше.

Кстати, еще совет-просьба - НЕ ИСПОЛЬЗУЙТЕ callout, т.к. при greylisting'е возникают петли:
1. я посылаю почту: user@my.domain => user@remote.domain
2. удаленный MTA (mx.remote.domain) использует callout: мой MTA видит входящее подключение bla-bla-bla@remote.domain => user@my.domain
3. мой MTA принимает решение defer (user unknown, suspicious)
4. удаленный MTA получает 4ХХ на попытку callout и отдает моему MTA уже 5ХХ - мое письмо в ж...
Если используете callout, то настройте MTA так, чтобы он использовал бы ТУ ЖЕ ПАРУ АДРЕСОВ при запросе, т.е. НЕ bla-bla-bla@remote.domain => user@my.domain, а user@remote.domain => user@my.domain

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1220
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение xM » 2010-12-28 14:16:06

moury писал(а):
xM писал(а):Н-да. Т.е. только ручками блэклистить по имени домена или IP который его релеит включать в DNSBL.
Временная мера, понятно.
Нет.
Игнорировать pass в настройках почтового сервера.
То есть, SPF должен быть лишь рядовым запрещающим правило среди других запрещающих.
Ну у меня то так и сделано. Только за fail накидывается много баллов в SPAM score. Остальное игнорируется.
IT voodoo blog https://kostikov.co

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение dikens3 » 2010-12-28 22:27:35

Guest писал(а):Резюме: надо использовать только SPF fail, error (pass, none, neutral игнорируем).
Вобщем-то у меня так и сделано. Тупо прибиваются все FAIL с соответствующим сообщением.

Guest писал(а):Кстати, еще совет-просьба - НЕ ИСПОЛЬЗУЙТЕ callout, т.к. при greylisting'е возникают петли:
1. я посылаю почту: user@my.domain => user@remote.domain
2. удаленный MTA (mx.remote.domain) использует callout: мой MTA видит входящее подключение bla-bla-bla@remote.domain => user@my.domain
3. мой MTA принимает решение defer (user unknown, suspicious)
4. удаленный MTA получает 4ХХ на попытку callout и отдает моему MTA уже 5ХХ - мое письмо в ж...
Если используете callout, то настройте MTA так, чтобы он использовал бы ТУ ЖЕ ПАРУ АДРЕСОВ при запросе, т.е. НЕ bla-bla-bla@remote.domain => user@my.domain, а user@remote.domain => user@my.domain
Не очень понятна ваша цепочка для callout. В народе ваш пример работает так:

По умолчанию проверка отправителя производится от имени <> и который создан для проверки пользователей.

1. я посылаю почту: user@my.domain => user@remote.domain
2. удаленный MTA (mx.remote.domain) использует callout: мой MTA видит входящее подключение <> => user@my.domain
3. мой MTA принимает решение ОК на стадии RCPT (далее в дата можно и нужно блокировать, но не раньше.)
4. удаленный MTA получает ОК на попытку callout.
Всё путём.

Белый лист рулит. Кому посылаете загоняйте в базу и пропускайте мимо проверок.
У грейлиста есть кэш, он тоже помогает.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Guest
проходил мимо

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение Guest » 2011-01-16 0:15:15

Возвращаясь к теме:

Код: Выделить всё

host -t txt nicepost.ru
nicepost.ru descriptive text "v=spf1 a mx ip4:55.11.65.20/2 ip4:90.2.123.112/2 ip4:176.33.87.19/2 ip4:212.63.89.33/2 -all"
host -t txt jomail.ru
jomail.ru descriptive text "v=spf1 a mx ip4:55.11.65.20/2 ip4:90.2.123.112/2 ip4:176.33.87.19/2 ip4:212.63.89.33/2 -all"
host -t txt abapost.ru
abapost.ru descriptive text "v=spf1 a mx ip4:55.11.65.20/2 ip4:90.2.123.112/2 ip4:176.33.87.19/2 ip4:212.63.89.33/2 -all"
Вот простое решение (для spfd):

Код: Выделить всё

	deny
# рикошеты проверять бессмысленно
		! senders				= :
# полный (многострочный) ответ spfd:
		set acl_m_temp			= ${readsocket{SPFD_SOCKET}{ip_address=$sender_host_address\nidentity=$sender_address\n\n}{15s}{\n}{result=sockerror}}
# acl_m_spf (результат, если хотите, используйте позже) будет содержать pass/softfail/permerror/temperror/neutral/none/sockerror - в случае ошибки spdf :   
		set acl_m_spf			= ${if match {$acl_m_temp}{\Nresult[ ]?=[ ]?([a-z]+)\N}{$1}}
		condition				= ${if eq {$acl_m_spf}{pass}}
# выделяем из полного ответа ip в формате CIDR ip/mask:
		set acl_m_ip			= ${if match {$acl_m_temp}{\N\'ip4:([\d\./]+)\'\N}{$1}}
		condition				= ${if def:acl_m_ip}
		set acl_m_mask			= ${if match {$acl_m_ip}{\N[\d\.]+/(\d+)\N}{$1}{32}}
		condition				= ${if < {$acl_m_mask}{16}}
		message				= Fake SPF record (sender=$sender_address, host=$sender_host_address, mask=$acl_m_mask)
А вот и результат:

Код: Выделить всё

2011-01-15 23:44:18 H=(mx-g19.proxad.net) [82.65.116.35] I=[XXX]:25 F=<business@jomail.ru> rejected RCPT <XXX>: Fake SPF record (sender=business@jomail.ru, host=82.65.116.35, mask=2)

Guest
проходил мимо

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение Guest » 2011-01-16 0:34:33

По умолчанию проверка отправителя производится от имени <> и который создан для проверки пользователей.
Как то сталкивался с тем, что в callout используются не <>, а адреса из моего RCPT TO

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение dikens3 » 2011-01-16 21:42:04

Guest писал(а):
По умолчанию проверка отправителя производится от имени <> и который создан для проверки пользователей.
Как то сталкивался с тем, что в callout используются не <>, а адреса из моего RCPT TO
Тут как пожелаешь вобщем-то. Только никто не обязан таких отправителей принимать..

http://www.lissyara.su/doc/exim/4.62/ac ... sts/#39.33

Код: Выделить всё

 Когда проверка адресов в строках заголовков использует проверочную опцию “header_sender”, exim, по умолчанию, ведёт себя как будто адреса - адреса отправителя из конверта. Проверка обратным вызовом, поэтому, проверяет может ли быть доставлен рикошет, путём использования пустого адреса в команде MAIL. Однако, спорно, что эти адреса никогда бы не могли бы использоваться как отправители конверта, и поэтому рикошеты (с пустым отправителем) могли быть правомерно отклонены. Параметр обратного вызова “mailfrom” позволяет вам определить, какой адрес использовать в команде MAIL. Например:

require  verify = header_sender/callout=mailfrom=abcd@x.y.z

   Этот параметр доступен лишь в опции “header_sender”.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Guest
проходил мимо

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение Guest » 2011-01-20 14:38:16

Вот:

Код: Выделить всё

host -t txt gogomail.ru
gogomail.ru descriptive text "v=spf1 a mx ip4:55.11.65.20/2 ip4:90.2.123.112/2 ip4:176.33.87.19/2 ip4:212.63.89.33/2 -all"
host -t soa gogomail.ru
gogomail.ru has SOA record ns1.pegas-dns.com. hostmaster.gogomail.ru. 2010122401 14400 3600 1209600 86400
host -t txt inform-ttk.ru
inform-ttk.ru descriptive text "v=spf1 a mx ip4:55.11.65.20/2 ip4:90.2.123.112/2 ip4:176.33.87.19/2 ip4:212.63.89.33/2 -all"
host -t soa inform-ttk.ru
inform-ttk.ru has SOA record ns1.pegas-dns.com. hostmaster.inform-ttk.ru. 2011011301 14400 3600 1209600 86400
... и так далее
Обратите внимание на DNS-сервера для всех этих доменов: ns*.pegas-dns.com

Смотрим дальше:

Код: Выделить всё

Информация о домене PEGAS-DNS.COM
 
Service Provided By: Center of Ukrainian Internet Names
Website: http://www.ukrnames.com
Contact: +380.577626123

Domain Name: PEGAS-DNS.COM

Creation Date: 23-Mar-2010
Modification Date: 23-Mar-2010
Expiration Date: 23-Mar-2011

Domain servers in listed order:
ns1.pegas-dns.com
ns2.pegas-dns.com

Registrant:
Sergej Chernomorskij sergey.chernomorsky@yahoo.com
Private person
Odesskaya, 11, 63
Moskva, 113149
RUSSIAN FEDERATION
+7.9208059612

... и так далее
Вот он - НАСТОЯЩИЙ ГЕРОЙ!
Вопрос: какие меры могут/должны быть приняты в отношении этого чела?

DenisKh
мл. сержант
Сообщения: 97
Зарегистрирован: 2007-12-19 21:04:16
Откуда: Москва
Контактная информация:

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение DenisKh » 2011-01-24 19:07:02

Да никаких ты против него мер особых не примешь.
Я могу целый список его доменов скинуть

либо же использовать правило примерно такого вида

Код: Выделить всё

        deny    condition   = ${if match {${lookup dnsdb{txt=$sender_address_domain}}}{\N^v=spf.*/2\s\-all\N} {yes}{no}}
                            message     = SPF Fail. $sender_host_address is not allowed to send mail
                          log_message = SPF Fail. Incorrect spf record syntax.If you think this is wrong, get in touch with postmaster@domain.com

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1220
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение xM » 2011-01-25 0:36:32

DenisKh писал(а):...{\N^v=spf.*/2\s\-all\N}...
Он завтра на /3 или /1 сменит маску и все.
Выше анонимус дал более правильный вариант, однако же и более мудрёный.
IT voodoo blog https://kostikov.co

DenisKh
мл. сержант
Сообщения: 97
Зарегистрирован: 2007-12-19 21:04:16
Откуда: Москва
Контактная информация:

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение DenisKh » 2011-01-25 11:47:51

Более чем за полгода данный персонаж плодит только домены :) Но не меняет маску
http://www.robtex.com/dns/ns1.pegas-dns.com.html#graph

blade_007
ст. прапорщик
Сообщения: 571
Зарегистрирован: 2010-03-12 12:59:08
Контактная информация:

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение blade_007 » 2011-01-25 18:03:43

xM писал(а):
DenisKh писал(а):...{\N^v=spf.*/2\s\-all\N}...
Он завтра на /3 или /1 сменит маску и все.
Выше анонимус дал более правильный вариант, однако же и более мудрёный.

Как вариант. Исходя из идеи проверять маску из поля TXT.

Код: Выделить всё

/usr/sbin/exim -be
${if forany {<; ${filter{<; ${sg {${lookup dnsdb{txt=gogomail.ru}{$value}fail}}{\N \N}{\N;\N}}}{match{$item}{/}} }}{ < {${extract{-1}{/}{$item}}}{16}}{yes}{no}}
Что делает данный код?
1. Вытащить из ДНС строку txt для некоторого домена. Если записи нет - принудительный отказ fail
2. Замена пробелов на ;. У меня не получилось указать явно разделитель " ". Если есть способ - сообщите, поправлю (просто меньше выражение будет).
3. Фильтр списка, полученного на предыдущем этапе, - все что БЕЗ "/" удалить, т.е. остается список вида: ip4:IP1/MASK;ip4:IP2/MASK;*****
4. Далее применяется функция forany, которая возвращает true, если маска любого элемента списка МЕНЬШЕ 16.
5. Функция extract собственно берет из элемента ip4:IP1/MASK часть ДО символа "/", затем идет сравнение с числом 16.

Проверка:

Код: Выделить всё

> ${if forany {<; ${filter{<; ${sg {${lookup dnsdb{txt=jomail.ru}{$value}fail}}{\N \N}{\N;\N}}}{match{$item}{/}} }}{ < {${extract{-1}{/}{$item}}}{16}}{yes}{no}}
yes
> ${if forany {<; ${filter{<; ${sg {${lookup dnsdb{txt=mail.ru}{$value}fail}}{\N \N}{\N;\N}}}{match{$item}{/}} }}{ < {${extract{-1}{/}{$item}}}{16}}{yes}{no}}
no
> ${if forany {<; ${filter{<; ${sg {${lookup dnsdb{txt=ya.ru}{$value}fail}}{\N \N}{\N;\N}}}{match{$item}{/}} }}{ < {${extract{-1}{/}{$item}}}{16}}{yes}{no}}
no
> ${if forany {<; ${filter{<; ${sg {${lookup dnsdb{txt=gogomail.ru}{$value}fail}}{\N \N}{\N;\N}}}{match{$item}{/}} }}{ < {${extract{-1}{/}{$item}}}{16}}{yes}{no}}
yes
>
Может кто предложит лучший вариант, либо здраво покритикует данную конструкцию.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1220
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение xM » 2011-01-25 18:07:17

У меня не получилось указать явно разделитель " "
В Perl (ну и в Exim как использующего его regexp) пробел есть \s
IT voodoo blog https://kostikov.co

blade_007
ст. прапорщик
Сообщения: 571
Зарегистрирован: 2010-03-12 12:59:08
Контактная информация:

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение blade_007 » 2011-01-25 18:13:19

xM писал(а):
У меня не получилось указать явно разделитель " "
В Perl (ну и в Exim как использующего его regexp) пробел есть \s
Я имел ввиду указать разделитель как <SEPARATOR, т.е. <ПРОБЕЛ или <; или <+.

Guest
проходил мимо

Re: SPF не рулит (или на хитрую ... есть ... с винтом)

Непрочитанное сообщение Guest » 2011-01-25 23:30:20

Всем привет!
Каюсь насчет SPF (см. первый пост): оказалось еще как полезно, причем именно для фальшивок!

Код: Выделить всё

# Фальшивых SPF (как бы pass)
cat /var/log/exim/exim_mainlog | grep -c 'Corrupted'
458
# Не прошедших проверку SPF
cat /var/log/exim/exim_mainlog | grep -c 'SPF check'
210
# Письма неизвестному в моем домене солдату
cat /var/log/exim/exim_mainlog | grep -c 'Unrouteable'
1035
# Попытки отправить якобы от "своего" пользователя
cat /var/log/exim/exim_mainlog | grep -c 'Fake'
290
# 
cat /var/log/exim/exim_mainlog | grep -c 'Greylisted'
190
# 
cat /var/log/exim/exim_mainlog | grep -c 'Relay'
7
Кстати, еще в тему, фашист-то совсем лютует:

Код: Выделить всё

host -t a pegas-dns.com
pegas-dns.com has address 127.0.0.1
В конфиг. части определяем 2 константы: SPFD_SOCKET и SPF_MIN_MASK (у меня 16)
Если кому нужно, выложу свою acl_check_spf еще раз полностью:

Код: Выделить всё

acl_check_spf:

	deny
		set acl_m_temp			= ${readsocket{SPFD_SOCKET}{ip_address=$sender_host_address\nidentity=$sender_address\n\n}{15s}{\n}{result=sockerror}}
		set acl_m_spf			= ${extract{result}{$acl_m_temp}}
		condition				= ${if eq {$acl_m_spf}{pass}}
		set acl_m_ip			= ${if match {$acl_m_temp}{\N\'ip4:([\d\./]+)\'\N}{$1}}
		condition				= ${if def:acl_m_ip}
		set acl_m_mask			= ${if match {$acl_m_ip}{\N[\d\.]+/(\d+)\N}{$1}{32}}
		condition				= ${if < {$acl_m_mask}{SPF_MIN_MASK}}
		message				= Corrupted SPF record: mail-from=$sender_address, sender-host=$sender_host_address, spf-match=$acl_m_ip

	accept
		condition				= ${if eq {$acl_m_spf}{pass}}	

	deny
		condition				= ${if eq {$acl_m_spf}{fail}}
		message				= SPF check failed

	defer
		condition				= ${if match {$acl_m_spf}{softfail|temperror|permerror}}
		message				= SPF check not passed, try again later

	defer
		condition				= ${if eq {$acl_m_spf}{sockerror}}
		message				= SPF check not passed, try again later
		log_message			= SPF socket error

accept
В acl_smtp_rcpt в нужном месте (смотрите, не отрубите "своих")

Код: Выделить всё

	require
		acl					= acl_check_spf
Успехов!