Страница 1 из 1

exim проверка отправителя

Добавлено: 2010-03-12 18:24:13
deisler
Прописал такой ACL для проверки отправителя:

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

deny    log_message    = "Sender doesn't exist."
        !authenticated = * : !+relay_from_hosts
        !verify        = sender/callout=5s,defer,maxwait=30s
Но при входящем письме, exim ругается:

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

processing "deny"
check !authenticated = * : !+relay_from_hosts
check !verify = sender/callout=5s,defer,maxwait=30s
deny: condition test error
SMTP>> 451 Temporary local problem - please try later
451 Temporary local problem - please try later
LOG: MAIN REJECT
  H=(mail.domain.ru) [1.1.1.1] F=<user@domain.ru> temporarily rejected RCPT vasja@pypkin.ru: bad time value in ACL condition "verify sender/callout=5s,defer,maxwait=30s"
При этом, проверяя телнетом вручную, коннектясь на сервер отправителя проверка проходит успешно.
Не пойму что ему не нравится по времени.

Re: exim проверка отправителя

Добавлено: 2010-03-12 19:40:46
dikens3

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

!authenticated = * : !+relay_from_hosts
Непонял я что тут происходит? (В полезных скриптах есть отладка)
Возможно правильно будет так:

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

1   !authenticated = *
2   !hosts = +relay_from_hosts
1. Поверка пользователя, аутентифицирован он или нет.
2. Проверка, входит хост в некий список или нет.

Мне кажется ваши собственные пользователи не проходят проверку.
(В полезных скриптах есть отладка)

Re: exim проверка отправителя

Добавлено: 2010-03-15 10:59:02
deisler
Я собственно эту настройку взял в полезных скриптах.

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

!authenticated = * : !+relay_from_hosts
Вот эту конструкцию я понимаю так: не аутентифицированные все, кроме список_хостов.
Вариант с

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

!authenticated = *
!hosts         = +relay_from_hosts
ни к чему не приводит, всё то же самое.

Я собственно, добавил в этой конструкции (оригинал)

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

deny    log_message    = "Sender doesn't exist."
        !authenticated = * 
        !verify        = sender/callout=20s,defer_ok,maxwait=30s

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

: !+relay_from_hosts
и изменил defer_ok, на defer:
Если при проверке роутинга присходит ошибка отсрочки, ACL, обычно, возвращает “defer”. Однако, если вы включаете “defer_ok” в опцию, вместо этого условие становится принудительно верным. Отметтьте, что это - главная проверочная опция, также как и субопции для обратных вызовов.
для того, чтобы если при проверке обратным вызовом удалённый smtp сервер не отвечает, то проверка была успешна, иначе при использовании defer_ok, с удалёнными серверами которые пишут

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

% telnet recvmail.piter.net 25
Trying 195.161.113.98...
telnet: Unable to connect to remote host: Connection refused
но рассылают спам, проверка не проходит и спам письма доходят, но при этом, с использованием defer, вместо defer_ok, перестаёт доходить вообще любая почта, с ошибкой:

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

processing "deny"
check !authenticated = * : !+relay_from_hosts
check !verify = sender/callout=5s,defer,maxwait=30s
deny: condition test error
SMTP>> 451 Temporary local problem - please try later
451 Temporary local problem - please try later
LOG: MAIN REJECT
  H=(mail.domain.ru) [1.1.1.1] F=<user@domain.ru> temporarily rejected RCPT vasja@pypkin.ru: bad time value in ACL condition "verify sender/callout=5s,defer,maxwait=30s"
Вот это мне и не понятно, почему так.

Re: exim проверка отправителя

Добавлено: 2010-03-15 16:01:49
dikens3
Давайте кое-что проясним:

Первое:

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

!authenticated = *
Данное условие проверяет переменную (я так это понимаю) $authenticated_id.
Данное условие сработает, если переменная будет пуста, т.е. пользователь не аутентифицирован.
Образно можно записать так:

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

!authenticated = $authenticated_id
Вот что написано в документации:
http://www.lissyara.su/doc/exim/4.62/string_expansions/

# $authenticated_id
Когда сервер полностью аутентифицирует клиента, то это (видимо, в этот момент) может быть сконфигурировано для сохранения части аутентификационной информации в переменной “$authenticated_id” (смотрите раздел 33). Например, конфигурация аутентификатора user/password могла бы сохранить имя пользователя, для использования в роутерах. Отметтьте, что это не таже самая информация, которая сохраняется в “$sender_host_authenticated”. Когда сообщение посылается локально, не через TCP соединение, переменная “$authenticated_id” содержит имя пользователя вызвавшего процесса.
Добавим ваши предположения:

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

!authenticated = *: !+relay_from_hosts
Предположим что:

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

relay_from_hosts = 192.168.1.1 : 192.168.1.2
Тогда наш фильтр примет вид:

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

!authenticated = * : !192.168.1.1 : !192.168.1.2
Данное условие будет истинным (т.е. сработает как !authenticated = что-то там....) при условии, что:
1. $authenticated_id пуста
или
2. В переменной $authenticated_id не находятся некие данные (Мы же не хосты проверяем!! Хосты проверяются hosts = ...), а именно 192.168.1.1 или 192.168.1.2
Итого непонятно зачем добавлять собственное условие, если оно будет срабатывать только в том случае, и только тогда, когда $authenticated_id пуста

Вобщем объяснил как смог по этому поводу.

Второе:
при этом, с использованием defer, вместо defer_ok, перестаёт доходить вообще любая почта, с ошибкой:
bad time value

Вот это мне и не понятно, почему так.
Ненашёл я такой опции - defer.
defer_ok есть и очень рекомендую.

А причина ошибки видимо в том, как понимает это exim.
Он разбирает опции (предполагаю) так:
1. Находит основные опции (выделю красным)
!verify = sender/callout=5s,defer,maxwait=30s
defer - не выделяю, не знает он такой опции.

2. Далее присваивает им указанные пользователем данные и в итоге получается список переменных:
sender =
callout=5s,defer, (Скорее всего запятые как-то обрезаются)
maxwait=30s

Итого в переменной callout оказывается значение 5s,defer.
Т.к. в данной опции программой предусмотрено только время, ошибка очевидна.

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

bad time value - неправильно указано время
Третье:
для того, чтобы если при проверке обратным вызовом удалённый smtp сервер не отвечает, то проверка была успешна, иначе при использовании defer_ok, с удалёнными серверами которые пишут

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

% telnet recvmail.piter.net 25
Trying 195.161.113.98...
telnet: Unable to connect to remote host: Connection refused
но рассылают спам, проверка не проходит и спам письма доходят
Полезные скрипты и отладку вам в руки.. Почему? Вы не понимаете что происходит и как работает фильтр.

Спам пройдёт, если время соединения (timeout) выйдет. Если будет будет Connection refused, письмо будет отброшено.

Re: exim проверка отправителя

Добавлено: 2010-03-15 18:33:15
deisler
Спасибо за подробные разъяснения.
Про !authenticated я всё понял, а предположение наличии опции defer исходя из прочтённой документации было ошибочным.
Третье:
для того, чтобы если при проверке обратным вызовом удалённый smtp сервер не отвечает, то проверка была успешна, иначе при использовании defer_ok, с удалёнными серверами которые пишут

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

% telnet recvmail.piter.net 25
Trying 195.161.113.98...
telnet: Unable to connect to remote host: Connection refused
но рассылают спам, проверка не проходит и спам письма доходят
Полезные скрипты и отладку вам в руки.. Почему? Вы не понимаете что происходит и как работает фильтр.

Спам пройдёт, если время соединения (timeout) выйдет. Если будет будет Connection refused, письмо будет отброшено.
По поводу defer_ok, почему вы рекомендуете использовать эту опцию? Проверил использование exim'ом с опцией defer_ok и без неё:

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

Mar 12 11:38:45 m exim[26483]: "Delay 30s for  [222.252.216.41] with HELO=localhost. Mail from coppedbdw851@00.ru to user@domain.ru."
Mar 12 11:39:17 m exim[26483]: 1Nq0Oq-0006t9-3n <= coppedbdw851@00.ru H=(localhost) [222.252.216.41] I=[1.1.1.1]:25 P=esmtp S=3206 id=810699182.20100312153916@ka.ua from <coppedbdw851@00.ru> for user@domain.ru
Mar 12 11:39:17 m exim[26508]: 1Nq0Or-0006tY-HN <= coppedbdw851@00.ru U=mail P=spam-scanned S=3857 id=810699182.20100312153916@ka.ua from <mail@domain.ru> for user@domain.ru
Mar 12 11:39:17 m exim[26499]: 1Nq0Oq-0006t9-3n => user <user@domain.ru> F=<coppedbdw851@00.ru> R=dspam_spamscan_router T=dspam_spamscan_transport
Mar 12 11:39:17 m exim[26499]: 1Nq0Oq-0006t9-3n Completed
Mar 12 11:39:17 m exim[26509]: 1Nq0Or-0006tY-HN => user <user@domain.ru> F=<coppedbdw851@00.ru> R=delivery_spam_router T=delivery_spam_transport
Mar 12 11:39:17 m exim[26509]: 1Nq0Or-0006tY-HN Completed

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

% dig MX 00.ru
...
;; ANSWER SECTION:
00.ru.			59430	IN	MX	1 recvmail.piter.net.
...
;; ADDITIONAL SECTION:
recvmail.piter.net.	59439	IN	A	195.161.113.98

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

% telnet recvmail.piter.net 25
Trying 195.161.113.98...
telnet: Unable to connect to remote host: Connection refused
exim -d -bhc 222.252.216.41
helo localhost
mail from:coppedbdw851@00.ru
rcpt to:user@domain.ru
...
Этот тест при включённом defer_ok проходит неуспешно и спам доставляется:

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

...
dbfn_read: key=00.ru
callout cache: no domain record found
dbfn_read: key=coppedbdw851@00.ru
callout cache: no address record found
interface=NULL port=25
Connecting to recvmail.piter.net [195.161.113.98]:25 ... failed: Connection refused
----------- end verify ------------
verify defer overridden by callout_defer_ok
deny: condition test failed
...
С отключённой defer_ok данный тест проходит

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

dbfn_read: key=00.ru
callout cache: no domain record found
dbfn_read: key=coppedbdw851@00.ru
callout cache: no address record found
interface=NULL port=25
Connecting to recvmail.piter.net [195.161.113.98]:25 ... failed: Connection refused
----------- end verify ------------
deny: condition test deferred
LOG: MAIN REJECT
  H=(localhost) [222.252.216.41] sender verify defer for <coppedbdw851@00.ru>: could not connect to recvmail.piter.net [195.161.113.98]: Connection refused
SMTP>> 451 Could not complete sender verify callout
451 Could not complete sender verify callout
LOG: MAIN REJECT
  H=(localhost) [222.252.216.41] F=<coppedbdw851@00.ru> temporarily rejected RCPT user@domain.ru: Could not complete sender verify callout
LOG: lost_incoming_connection MAIN

Re: exim проверка отправителя

Добавлено: 2010-03-15 20:34:38
dikens3
Видимо я сам уже что-то не помню или не понимаю. Странно что фильтр так работает (про refused имею ввиду).

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

“defer_ok”
   Когда этот параметр присутствует, ошибки соединения с любым хостом, или любые другие виды временных ошибок, обрабатываются как успех ACL. Однако, при таких обстоятельствех кэш не обновляется.

http://www.lissyara.su/doc/exim/4.62/access_control_lists/#39.33
Тут написано в принципе, что при соединении, пройдёт письмо.

Вообще попробуйте и сделайте как вас устраивает. Меня тогда (когда делал фильтр) не устроило. Пользователи жаловались наверное очень, много отлупов для нормальных писем было.(Админы криворукие есть - следовательно отлуп их серверу)