Exim + whitelist

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

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Prince71
рядовой
Сообщения: 17
Зарегистрирован: 2011-07-02 14:08:51

Exim + whitelist

Непрочитанное сообщение Prince71 » 2011-10-22 2:51:21

Доброго времени суток.

Установлен МТА exim, прикручены всякие вкусности типа дспама и т.п. и все замечательно работало.....НО
Стала задача: сделать так, чтоб внесенные в белый список отправители обходили проверку DSpam. Не пойму почему некоторые корреспонденты со 100% вероятностью попадают в спамеры, но то детали.
Мне показалось логичным нарисовать свой роутер, чтобы если отправитель из белого списка - обвести его мимо проверки ДСпамом.

написалось такое:

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

whitelist_checker:
    driver = accept
    transport = mysql_delivery
    condition = ${if eq{} {${lookup mysql{SELECT address FROM whitelist WHERE address='${domain}'}}}{}{yes}}
mysql_delivery есть и работает, но только не для этого роутера
сам транспорт:

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

mysql_delivery:
  driver = appendfile
  maildir_format
  create_directory
  maildir_tag = ,S=$message_size
  directory = /var/mail/$domain/$local_part
  return_path_add
  delivery_date_add
  envelope_to_add
  group = mail
  mode = 0660
  no_mode_fail_narrower
  headers_remove = "Lines"
  headers_add = "Lines: $body_linecount\n"
  check_string = ""
  directory_mode = 700
  message_prefix = ""
  message_suffix = ""
  quota = ${lookup mysql{SELECT quota FROM users \
        WHERE id='${local_part}' AND mbox_host='${domain}'}{${value}M}}
  quota_size_regex = S=(\d+)$
  quota_warn_threshold = 75%
В итоге... при попытке протестировать то что получилось с помощью блаблабла | exim -d+all -bhc блаблабла
получаю вот такое в логе:

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

03:16:53 70619 --------> whitelist_checker router <--------
03:16:53 70619 local_part=karpova domain=111.spb.ru
03:16:53 70619 checking "condition"
03:16:53 70619 expanding:
03:16:53 70619    result:
03:16:53 70619 expanding: SELECT address FROM whitelist WHERE address='${domain}'
03:16:53 70619    result: SELECT address FROM whitelist WHERE address='111.spb.ru'
03:16:53 70619 search_open: mysql "NULL"
03:16:53 70619   cached open
03:16:53 70619 search_find: file="NULL"
03:16:53 70619   key="SELECT address FROM whitelist WHERE address='111.spb.ru'" partial=-1 affix=NULL starfla
gs=0
03:16:53 70619 LRU list:
03:16:53 70619 internal_search_find: file="NULL"
03:16:53 70619   type=mysql key="SELECT address FROM whitelist WHERE address='111.spb.ru'"
03:16:53 70619 database lookup required for SELECT address FROM whitelist WHERE address='111.spb.ru'
03:16:53 70619 MySQL query: SELECT address FROM whitelist WHERE address='111.spb.ru'
03:16:53 70619 MYSQL using cached connection for localhost:(/var/www/tmp/mysql.sock)/exim/exim
03:16:53 70619 lookup yielded: 111.spb.ru
03:16:53 70619 expanding: ${lookup mysql{SELECT address FROM whitelist WHERE address='${domain}'}}
03:16:53 70619    result: 111.spb.ru
03:16:53 70619 condition: eq{} {${lookup mysql{SELECT address FROM whitelist WHERE address='${domain}'}}}
03:16:53 70619    result: false
03:16:53 70619 expanding:
03:16:53 70619    result:
03:16:53 70619 skipping: result is not used
03:16:53 70619 expanding: yes
03:16:53 70619    result: yes
03:16:53 70619 expanding: ${if eq{} {${lookup mysql{SELECT address FROM whitelist WHERE address='${domain}'}}
}{}{yes}}
03:16:53 70619    result: yes
03:16:53 70619 calling whitelist_checker router
03:16:53 70619 whitelist_checker router called for karpova@111.spb.ru
03:16:53 70619   domain = 111.spb.ru
03:16:53 70619 set transport mysql_delivery
03:16:53 70619 queued for mysql_delivery transport: local_part = karpova
03:16:53 70619 domain = 111.spb.ru
03:16:53 70619   errors_to=NULL
03:16:53 70619   domain_data=NULL localpart_data=NULL
03:16:53 70619 routed by whitelist_checker router
03:16:53 70619   envelope to: karpova@111.spb.ru
03:16:53 70619   transport: mysql_delivery
03:16:53 70619 Cannot do callout: neither router nor transport provided a host list
03:16:53 70619 ----------- end verify ------------
нагуглился только совет убрать опцию "hosts_override"... но ее нет и так :(

Может будут какие-то светлые идеи, а то что-то застрял :(

заранее спасибо.
You don't know the Power of the Dark Side...

Хостинговая компания 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/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Prince71
рядовой
Сообщения: 17
Зарегистрирован: 2011-07-02 14:08:51

Re: Exim + whitelist

Непрочитанное сообщение Prince71 » 2011-11-17 23:24:23

А вопрос все еще актуален...
Может, в каком-то другом направлении копнуть?

Светлые идеи приветствуются.
You don't know the Power of the Dark Side...

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

Re: Exim + whitelist

Непрочитанное сообщение dikens3 » 2011-11-18 12:22:36

Проверка существования пользователя - если роутер ответит ДА, то это список твоих пользователей.
Таким образом, если пользователя удалить, а он останется в белом списке, то что?
Неправильно это.

1. Я бы добавил исключение в роутеры с D_SPAM.
2. Я бы добавил auowhitelist, чтобы не особо париться.
Это такая штука, которая запоминает адреса получателей, скажем на месяц. И потом принимает от них письма без проверок на спам и т.п.
Мне показалось логичным нарисовать свой роутер, чтобы если отправитель из белого списка - обвести его мимо проверки ДСпамом.
Думаю можно, только роутер должен быть расположен до роутеров с DSPAM, со всеми проверками на существование пользователей и опцией no_more вроде.

Да и проверяешь ты домен, а не полное ИМЯ@ДОМЕН
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Гость
проходил мимо

Re: Exim + whitelist

Непрочитанное сообщение Гость » 2011-11-18 13:34:41

dikens3 писал(а):Проверка существования пользователя - если роутер ответит ДА, то это список твоих пользователей.
Таким образом, если пользователя удалить, а он останется в белом списке, то что?
Неправильно это.
Не совсем понятно...
В белый список заносятся адреса доменов ОТПРАВИТЕЛЕЙ а не моих пользователей.
Я осознаю, что нахомутал в роутере (ничего другого и быть не может), я тупо не могу понять где именно :(
dikens3 писал(а):1. Я бы добавил исключение в роутеры с D_SPAM.
2. Я бы добавил auowhitelist, чтобы не особо париться.
Это такая штука, которая запоминает адреса получателей, скажем на месяц. И потом принимает от них письма без проверок на спам и т.п.
1) кстати да... спасибо, попробую.
2) autowhitelist в DSPAM я выключил, иначе он частенько принимает граничных 10 писем от спамера до того как среагировали пользователи и заносит его в белый список. И потом забирает от него тонны спама.
dikens3 писал(а):
Мне показалось логичным нарисовать свой роутер, чтобы если отправитель из белого списка - обвести его мимо проверки ДСпамом.
Думаю можно, только роутер должен быть расположен до роутеров с DSPAM, со всеми проверками на существование пользователей и опцией no_more вроде.

Да и проверяешь ты домен, а не полное ИМЯ@ДОМЕН
Роутер и так расположен первым. Да и проверяю я ведь вроде бы домен?

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

Re: Exim + whitelist

Непрочитанное сообщение dikens3 » 2011-11-18 16:56:03

Гость писал(а):
dikens3 писал(а):Проверка существования пользователя - если роутер ответит ДА, то это список твоих пользователей.
Таким образом, если пользователя удалить, а он останется в белом списке, то что?
Неправильно это.
Не совсем понятно...
В белый список заносятся адреса доменов ОТПРАВИТЕЛЕЙ а не моих пользователей.
1. Я не админю уже года 3, так что, что помню.
2. Проверка существования пользователя на твоём сервере, происходит видимо так:
- Обрабатываются роутеры сверху вниз.
- При выполнении всех условий роутера (положительного результата) обработка заканчивается на этом роутере, за исключением no_more. Там продолжается и можно копии например делать таким роутером.
- В роутере проверяется наличие драйвера ACCEPT.
Если такой драйвер есть, значит доставка возможна и пользователь существует.
Таким образом, отсутствие проверки существования пользователя-получателя породит существование любого пользователя, для отправителей из белого списка.

Т.е. обязательно проверять существование пользователей в роутере.
Роутер и так расположен первым. Да и проверяю я ведь вроде бы домен?
Получателя? Я думаю со 100% вероятностью он будет срабатывать при таком раскладе.

1. Проверять домен отправителя - ищи переменную домена отправителя
2. Лучше проверять всего пользователя - ищи переменную отправителя с доменом.

Список переменных есть в документации.

Я тут тренировался когда-то. Посмотри как делается сравнение, если уж ты сравнение используешь.
Неразумно сравнивать домен с пустым местом.

Так попробуй в роутере вместо condition:

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

senders  = Проверка отправителя вида user@domain
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

amdcooper
рядовой
Сообщения: 27
Зарегистрирован: 2007-12-06 14:29:24

Re: Exim + whitelist

Непрочитанное сообщение amdcooper » 2011-11-19 0:09:25

У меня так :

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

rule_router:
  driver = accept
  domains = +local_domains
  condition =${if eq{}{${lookup mysql{SELECT senders from rules_mail where   '$sender_address' like `senders`  and `recipient`='${local_part}@${domain}'}}}{no}{yes}}
  transport = rules_transport

rules_transport:
    driver = appendfile
    check_string = ""
    create_directory
    delivery_date_add
    directory = ${lookup mysql{SELECT CONCAT('/var/mail/exim/', `maildir`, '.', `dirrule` ) \
                FROM `mailbox`, rules_mail WHERE `username`='${local_part}@${domain}' and \
                '$sender_address' like `senders` and `recipient`='${local_part}@${domain}'}}
    directory_mode = 770
    envelope_to_add
    group = mail
    maildir_format
    maildir_tag = ,S=$message_size
    message_prefix = ""
    message_suffix = ""
    mode = 0600

db
CREATE TABLE IF NOT EXISTS `rules_mail` (
  `id_rule` int(20) NOT NULL AUTO_INCREMENT,
  `senders` varchar(255) NOT NULL,
  `recipient` varchar(255) NOT NULL,
  `dirrule` varchar(255) NOT NULL,
  PRIMARY KEY (`id_rule`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=21 ;



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

Re: Exim + whitelist

Непрочитанное сообщение dikens3 » 2011-11-19 9:33:51

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

amdcooper
рядовой
Сообщения: 27
Зарегистрирован: 2007-12-06 14:29:24

Re: Exim + whitelist

Непрочитанное сообщение amdcooper » 2011-11-19 18:11:21

Ты прав можно в роутере добавить проверку таблицы юзеров но так как это мой домашний сервак и пользователей я не удаляю, а если удаляю делаю через PMA то для меня это не проблема. От всяких постфикс админ я отказался за ненадобностью.

Аватара пользователя
Prince71
рядовой
Сообщения: 17
Зарегистрирован: 2011-07-02 14:08:51

Re: Exim + whitelist

Непрочитанное сообщение Prince71 » 2011-11-22 1:56:37

Или я совсем туплю или одно из двух...
ведь в белый список заносятся адреса тех, кто отправляет почту мне, а в таблицу моих пользователей заносятся адреса тех, кто у меня почту получает...

Соответственно, если я удалю получателя - каким боком мне помешает отправитель, занесенный в белый список?

ЗЫ: по теме - внезапно, непонятно с какого перепугу заработал список callbackdomains, именно так как нужно - отправители внесенные в него на спам не проверяются.
Пытаю напарника что он нашаманил... пока не сознается :-D
You don't know the Power of the Dark Side...

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

Re: Exim + whitelist

Непрочитанное сообщение dikens3 » 2011-11-22 7:46:04

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

Гость
проходил мимо

Re: Exim + whitelist

Непрочитанное сообщение Гость » 2011-11-22 11:42:35

dikens3 писал(а):
Соответственно, если я удалю получателя - каким боком мне помешает отправитель, занесенный в белый список?
А попробовать и самому решить?
Ну вот, я так и знал :-D
ночью попробую, днем серв под нагрузкой.

Аватара пользователя
Prince71
рядовой
Сообщения: 17
Зарегистрирован: 2011-07-02 14:08:51

Re: Exim + whitelist

Непрочитанное сообщение Prince71 » 2011-11-22 20:16:29

Попробовал. Я ж правильно понимаю, что теоретически проблема тут возникнет если отправитель из белого списка будет отправлять в несуществующий адрес? Не обязательно создавать/удалять получателя?

Так вот, при отправке на несуществующего получателя получаю вполне прогнозируемый ответ - отлуп с указанием причины "Unrouteable address" ложится в ящик отправителя.
You don't know the Power of the Dark Side...

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

Re: Exim + whitelist

Непрочитанное сообщение dikens3 » 2011-11-23 14:25:22

Prince71 писал(а):Попробовал. Я ж правильно понимаю, что теоретически проблема тут возникнет если отправитель из белого списка будет отправлять в несуществующий адрес? Не обязательно создавать/удалять получателя?

Так вот, при отправке на несуществующего получателя получаю вполне прогнозируемый ответ - отлуп с указанием причины "Unrouteable address" ложится в ящик отправителя.
А если отправитель не существует? И их тысячи?
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
Prince71
рядовой
Сообщения: 17
Зарегистрирован: 2011-07-02 14:08:51

Re: Exim + whitelist

Непрочитанное сообщение Prince71 » 2011-11-29 0:18:29

То экзим сожрет все что пришло с этого домена без проверки существует ли адресат, так я правильно понял?

Таки ты прав - надо исключение добавлять в роутер с ДСпамом и это будет православно.

(пошел придумывать как приклеить к существующему кондишену еще одно)
ЗЫ: про callbackdomains то я погорячился - проверяются на спам помещенные в этот список :(
You don't know the Power of the Dark Side...

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

Re: Exim + whitelist

Непрочитанное сообщение dikens3 » 2011-11-29 15:32:59

То экзим сожрет все что пришло с этого домена без проверки существует ли адресат, так я правильно понял?
Организовать 100% проверку отправителя, без участия самого отправителя невозможно.
verify помогает конечно, но не на все 100%.

В мой практике существовали работающие E-Mail'ы, которые невозможно было проверить с помощью verify в течении 5 минут. А настройки его таковы, что нужно указать как поступать по истечении времени на проверку:
1. Принимать, т.е. спамер тупо создаёт почтовый сервер и держит соединения по 30 минут и проверка пользователя пройдена.
2. Не принимать, и тогда рубятся простые смертные. Впрочем редко.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
Prince71
рядовой
Сообщения: 17
Зарегистрирован: 2011-07-02 14:08:51

Re: Exim + whitelist

Непрочитанное сообщение Prince71 » 2011-12-06 1:57:56

Та проверка, которая на том серве работает сейчас пока что всех устраивает.

Сейчас пытаюсь прикрутить дополнительное условие в condition роутера с ДСпам-ом.
в документации описано комбинирование условий с помощью "and" и это как нельзя лучше вписывается в придуманное решение. НО.

то условие, которое работает сейчас это:

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

condition = "${if and {{!eq {$received_protocol}{spam-scanned}} {!def:h_X-FILTER-SPAM:}} {1}{0}}"
Вроде бы все ясно - "если протокол не spam-scanned" И "если не пуст хидер X_FILTER_SPAM".
Но что это за "{1}{0}"?
Если я правильно понял теорию, то я могу добавить условие ПЕРЕД "} {1}{0}}" Но если я пытаюсь туда добавить "{${lookup mysql{SELECT address FROM whitelist WHERE address='${domain}'}}}" то условие не выполняется никогда :(
Я нашел опытным путем, что

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

condition = ${if eq{} {${lookup mysql{SELECT address FROM whitelist WHERE address='${domain}'}}}{}{yes}}
правильно обрабатывает наличие домена отправителя в таблице whitelist (если быть честным - то слямзил где-то заготовку и доработал напильником)
Опять-таки непонятно что за {}{yes}? И почему eq{}, ведь насколько я понимаю - внутри этих скобок и должен быть список строк, которые сравниваются....

Задача решилась путем замены в роутере ${domain} на ${sender_address_domain}, тогда при первом проходе переменная не определена и потому условие не выполняется, а при втором проходе переменная определена, условие выполняется и роутер с транспортом срабатывают.

Но все-таки хочется разобраться в написании условий... :oops:
You don't know the Power of the Dark Side...

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

Re: Exim + whitelist

Непрочитанное сообщение dikens3 » 2011-12-06 8:08:29

{1}{0} = {yes}{no}
иногда значения опускаются вовсе.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
Prince71
рядовой
Сообщения: 17
Зарегистрирован: 2011-07-02 14:08:51

Re: Exim + whitelist

Непрочитанное сообщение Prince71 » 2011-12-06 12:46:27

dikens3 писал(а):{1}{0} = {yes}{no}
иногда значения опускаются вовсе.
Это-то как раз понятно.
непонятно другое:
"${if and {{!eq {$received_protocol}{spam-scanned}} {!def:h_X-FILTER-SPAM:}} {1}{0}}"
мне читается этот кондишен как:
Если
{!eq {$received_protocol}{spam-scanned}}
и
{!def:h_X-FILTER-SPAM:}
по моему скудному разумению тут должна быть финальная закрывающая скобка
Но нет... имеем {1}{0}. Я не могу понять какую смысловую нагрузку несут эти "да/нет". Ведь они за пределами сгруппированного and {{условие1}{условие2}}...

Далее, ${if eq{} {${lookup mysql{SELECT address FROM whitelist WHERE address='${domain}'}}}{}{yes}}
в группе eq{} пусто - для чего она тогда?
:unknown:
You don't know the Power of the Dark Side...

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

Re: Exim + whitelist

Непрочитанное сообщение dikens3 » 2011-12-06 12:56:58

По остальному я не помню уже, читай документацию.
Я не могу понять какую смысловую нагрузку несут эти "да/нет".
По моему инвертирование.

Условие работает так:

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

condition = что-то там, должно вернуть ДА или НЕТ, или данные(т.е. ДА).
Как то так.
Так вот ты можешь изменить само условие видимо отрицанием (!) или сменой ДА/НЕТ. Возможно издалека идёт и всё.
Не уверен, попробуй.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.