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

Non existent host in HELO

Добавлено: 2011-01-13 11:44:48
xM
Вот такой у меня красавчик в логах попался.
Jan 13 10:31:02 beta exim[52007]: H=(w0215.ignd.org) [109.123.165.40] I=[192.168.1.2]:25 Warning: ACL "warn" statement skipped: condition test deferred: failed to expand ACL string "${if !eq{${lookup dnsdb{a=$sender_helo_name}{$value}fail}}{$sender_host_address}{yes}{no}}": lookup of "a=w0215.ignd.org" gave DEFER:
Т.е. в HELO указан несуществующий хост.
Посоветуйте предварительную обработку поэлегантнее до этого ACL для таких случаев. А то неаккуратно как-то... :oops:
Собственно, само правило:

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

  # проверка соответствия IP HELO IP хоста отправителя
  warn   condition      = ${if !eq{${lookup dnsdb{a=$sender_helo_name}{$value}fa
         hosts          = !+relay_from_hosts : *
         set acl_c0     = ${eval:$acl_c0+20}
         logwrite       = SPAM score $acl_c0 for host $sender_host_name [$sender_host_address] with HELO $sender_helo_name - HELO do not points to host address

Re: Non existent host in HELO

Добавлено: 2011-01-13 12:07:36
xM
Ой, что-то кусок не влез выше.
Дублирую

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

  # проверка соответствия IP HELO IP хоста отправителя
  warn   condition      = ${if !eq{${lookup dnsdb{a=$sender_helo_name}{$value}fail}}{$sender_host_address}{yes}{no}}
         hosts          = !+relay_from_hosts : *
         set acl_c0     = ${eval:$acl_c0+20}
         logwrite       = SPAM score $acl_c0 for host $sender_host_name [$sender_host_address] with HELO $sender_helo_name - HELO do not points to host address

Re: Non existent host in HELO

Добавлено: 2011-01-13 12:43:22
blade_007

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

warn 
        !senders = :
        !hosts = +localadds : +relay_from_hosts
        !authenticated = * 
        condition = ${if !eq{$sender_helo_name}{$sender_host_name}{yes}{no}}
        logwrite = WARN: Host=$sender_host_name [$sender_host_address] with HELO=$sender_helo_name - reverse zone not match with HELO

Re: Non existent host in HELO

Добавлено: 2011-01-13 12:44:15
xM
Сам ничего умнее вот этого предварительного правила не придумал

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

# запрет приёма почты от HELO с несуществующими доменами
  deny    message       = HELO is non exsistent domain. Access denied.
          hosts         = !+relay_from_hosts : *
          condition     = ${lookup dnsdb{a=$sender_helo_name}}
          delay         = 10s

Re: Non existent host in HELO

Добавлено: 2011-01-13 12:46:56
xM
blade_007 писал(а):

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

warn 
        !senders = :
        !hosts = +localadds : +relay_from_hosts
        !authenticated = * 
        condition = ${if !eq{$sender_helo_name}{$sender_host_name}{yes}{no}}
        logwrite = WARN: Host=$sender_host_name [$sender_host_address] with HELO=$sender_helo_name - reverse zone not match with HELO
Тут немного другое. Проверяется соответствие HELO имени хоста. У меня же - IP из HELO IP хоста отправителя.
Честно говоря я вообще смысла в вашей проверке не вижу, т.к. HELO может быть CNAME имени хоста.

Re: Non existent host in HELO

Добавлено: 2011-01-13 15:00:43
xM
Поправка. Условие забыл :crazy:
Т.е. имеем сначала

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

  # запрет приёма почты от HELO с несуществующими доменами
  deny    message       = HELO is non exsistent domain. Access denied.
          hosts         = !+relay_from_hosts : *
          condition     = ${if eq{${lookup dnsdb{a=$sender_helo_name}}{}{yes}{no}}
          delay         = 10s
а где-то чуть позже

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

  # проверка соответствия IP HELO IP хоста отправителя
  warn   condition      = ${if !eq{${lookup dnsdb{a=$sender_helo_name}{$value}fail}}{$sender_host_address}{yes}{no}}
         hosts          = !+relay_from_hosts : *
         set acl_c0     = ${eval:$acl_c0+20}
         logwrite       = SPAM score $acl_c0 for host $sender_host_name [$sender_host_address] with HELO $sender_helo_name - HELO do not points to host address

Re: Non existent host in HELO

Добавлено: 2011-01-13 15:38:56
blade_007
Почти тоже самое что и в вашем первом пункте, только проверка по sender_host_name.. можно добавить задержку в 10 секунд

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

    warn 
        condition = ${if eq{$host_lookup_failed}{1}{yes}{no}}
        !hosts = +relay_from_hosts
        !senders = :
        !authenticated = * 
        logwrite = WARN: host = $sender_host_name [$sender_host_address] with HELO = $sender_helo_name - no reverse zone for host

Re: Non existent host in HELO

Добавлено: 2011-01-13 15:48:10
xM
blade_007 писал(а):Почти тоже самое что и в вашем первом пункте, только проверка по sender_host_name.. можно добавить задержку в 10 секунд

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

    warn 
        condition = ${if eq{$host_lookup_failed}{1}{yes}{no}}
        !hosts = +relay_from_hosts
        !senders = :
        !authenticated = * 
        logwrite = WARN: host = $sender_host_name [$sender_host_address] with HELO = $sender_helo_name - no reverse zone for host
Ну да. Только проверяется хостнэйм, а у меня HELO.
Кроме того, $host_lookup_failed это реверсная проверка (из IP в имя), а у меня - прямая (из имени в IP).
А аналогичное этому правило у меня идет уже в блоке начисления очков по СПАМу.
Т.е. сначала жёстко (с deny) разбирется HELO на корректность, затем отправитель (свой-чужой-аутентификация) и включенность в DNSBL, а после уже все остальное. Тут уже помягче правила.

Re: Non existent host in HELO

Добавлено: 2011-01-14 21:41:58
blade_007
Добавление/исправление.. Что будете делать в случае резервирования IP с помощью ДНС?
Например,

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

> ${lookup dnsdb{a=yandex.ru}{$value}fail}
87.250.251.11
93.158.134.11
213.180.204.11
213.180.204.211
77.88.21.11
87.250.250.11
Т.е. если удаленныйпредставляется в EHLO именем, которое разрешается в 10-20 ипов. Яндекс просто как пример, но такая ситуация вполне возможна. Собственно, подставляя значения в ваше условие с WARN, получим (пусть EHLO=yandex.ru):

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

> ${if !eq{${lookup dnsdb{a=yandex.ru}{$value}fail}}{192.168.9.0}{yes}{no}}
yes
> ${if !eq{${lookup dnsdb{a=yandex.ru}{$value}fail}}{93.158.134.11}{yes}{no}}
yes
> ${if !eq{${lookup dnsdb{a=yandex.ru}{$value}fail}}{87.250.251.11}{yes}{no}}
yes
> ${if !eq{${lookup dnsdb{a=yandex.ru}{$value}fail}}{213.180.204.11}{yes}{no}}
yes
Теперь об изменении: функция sq действует как оператор замены (все \n заменяются на :), затем условный оператор match_ip сравнивает $sender_host_address с полученным ранее списком ипов. Если хост в списке - возвращается yes, если нет - no.
Проверка:

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

> ${if match_ip{192.168.0.1} { ${sg {${lookup dnsdb{a=yandex.ru}{$value}fail}} {\N\n\N} {:}} }  {yes}{no} }
no
> ${if match_ip{213.180.204.211} { ${sg {${lookup dnsdb{a=yandex.ru}{$value}fail}} {\N\n\N} {:}} }  {yes}{no} }
yes
> ${if match_ip{213.180.204.211} { ${sg {${lookup dnsdb{a=mxs.mail.ru}{$value}fail}} {\N\n\N} {:}} }  {yes}{no} }
no
> ${if match_ip{94.100.176.20} { ${sg {${lookup dnsdb{a=mxs.mail.ru}{$value}fail}} {\N\n\N} {:}} }  {yes}{no} }
yes
>
Как то так. Проверьте - может какие умные мысли предложите или просто покритикуете здраво.

Re: Non existent host in HELO

Добавлено: 2011-01-15 0:50:44
xM
Мысль уловил. Очень верно.
Перекладываем его на нашу задачу:

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

beta# exim -be
> ${lookup dnsdb{a=ya.ru}}
77.88.21.3
87.250.250.3
87.250.251.3
93.158.134.3
213.180.204.3
> ${if match_ip{87.250.250.3}{${sg{${lookup dnsdb{a=ya.ru}{$value}fail}}{\N\n\N}{:}}}{yes}{no}}
yes
> ${if match_ip{1.1.1.1}{${sg{${lookup dnsdb{a=ya.ru}{$value}fail}}{\N\n\N}{:}}}{yes}{no}}
no
В итоге имеем вот такое второе правило

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

  # проверка соответствия IP HELO IP хоста отправителя
  warn   condition      = ${if !match_ip{$sender_host_address}{${sg{${lookup dnsdb{a=$sender_helo_name}{$value}fail}}{\N\n\N}{:}}}{yes}{no}}
         hosts          = !+relay_from_hosts : *
         set acl_c0     = ${eval:$acl_c0+20}
         logwrite       = SPAM score $acl_c0 for host $sender_host_name [$sender_host_address] with HELO $sender_helo_name - HELO do not points to host address

Re: Non existent host in HELO

Добавлено: 2012-05-07 11:43:45
Stason
Спешу поделиться радостью:
Вот тоже настала пора как я убедил руководство перейти с постфикса на экзим, все как надо с тестово-промышленной эксплуатацией. Ставил exim 4.77, но конфиги у меня были еще от 4.68, где я обнаружил, что часть проверок не работает, оказалось это связано с изменением синтаксиса в версии 4.77.
Например, если проверять так, как вы рекомендуете, то получим unable to complete match against "${lookup dnsdb..., а это весьма опасно, об этом написано в http://ftp.exim.org/pub/exim/ChangeLogs/ChangeLog-4.77.
Так что правильнее в 4.77 будет так condition = ${if !inlist{$sender_host_address}{${sg{${lookup dnsdb{a=$sender_helo_name}{$value}fail}}{\N\n\N}{:}}}{yes}{no}}

Re: Non existent host in HELO

Добавлено: 2012-05-08 10:48:57
Stason
Stason писал(а):Спешу поделиться радостью
Эх рано я спешил, при использовании inlist проверка не отрабатывает, если кому интересно, я создал новую тему:
http://forum.lissyara.su/viewtopic.php?f=20&t=36540
там просто у меня еще ряд вопросов возник.

Re: Non existent host in HELO

Добавлено: 2012-08-26 21:25:15
xM
Признаться, не знаю, в чем у вас проблема с этой проверкой.
У меня вот в таком варианте все отлично работает.

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

  # преобразование HELO в IP (если возможно)
  warn   condition      = ${if isip{$acl_m1}{no}{yes}}
         set acl_m1     = ${sg{${lookup dnsdb{defer_never,a=$sender_helo_name}}}{\N\n\N}{:}}

...

  # проверка соответствия IP HELO IP хоста отправителя
  warn   condition      = ${if match_ip{$sender_host_address}{$acl_m1}{no}{yes}}
         hosts          = !+relay_from_hosts : *
         set acl_c0     = ${eval:$acl_c0+20}
         logwrite       = SPAM score $acl_c0 for host $sender_host_name [$sender_host_address] with HELO $sender_helo_name - HELO do not point to host address
Переменная, которая определяется в первом выражении, у меня еще используется в одном месте.

Re: Non existent host in HELO

Добавлено: 2012-08-26 22:24:15
xM
Да, забыл, до первого условия выше есть еще такая штука

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

  # удаляем квадратные скобки из HELO (если есть)
  warn   set acl_m1     = ${lc:${sg{$sender_helo_name}{\N\[|\]\N}{}}}
В принципе, можно подставить напрямую.

Re: Non existent host in HELO

Добавлено: 2012-09-06 21:55:45
ASY
xM писал(а):Вот такой у меня красавчик в логах попался.
Т.е. в HELO указан несуществующий хост.
Посоветуйте предварительную обработку поэлегантнее до этого ACL для таких случаев. А то неаккуратно как-то... :oops:
на всякий случай: http://www.rfc-editor.org/rfc/rfc2821.txt

An SMTP server MAY verify that the domain name parameter in the EHLO
command actually corresponds to the IP address of the client.
However, the server MUST NOT refuse to accept a message for this
reason if the verification fails: the information about verification
failure is for logging and tracing only.

в 5321 оно так же осталось.

Re: Non existent host in HELO

Добавлено: 2012-09-06 22:13:17
xM
ASY писал(а):на всякий случай: http://www.rfc-editor.org/rfc/rfc2821.txt
An SMTP server MAY verify that the domain name parameter in the EHLO
command actually corresponds to the IP address of the client.
However, the server MUST NOT refuse to accept a message for this
reason if the verification fails: the information about verification
failure is for logging and tracing only.
в 5321 оно так же осталось.
У мну только скорринг, не более. Хотя, конечно, "клинику" а-ля localhost в HELO я рублю. Но, думаю, оно правильно и духу RFC не противоречит.

Re: Non existent host in HELO

Добавлено: 2012-09-10 0:04:00
ASY
рубить localhost - это точно не противоречит, но в исходном сообщении w0215.ignd.org, я правильно понимаю ? Вообще, логов Exim не видел, но "H=" понял так.

Re: Non existent host in HELO

Добавлено: 2012-09-10 9:42:47
xM
ASY писал(а):рубить localhost - это точно не противоречит, но в исходном сообщении w0215.ignd.org, я правильно понимаю ? Вообще, логов Exim не видел, но "H=" понял так.
Да это история старая. Там ошибка была в конфиге.