Категорії
Mail systems Misc, staff, other

[vexim] blocklists: учимся правильно блокировать

Для тех, кто не знает, VExim – это панели управления почтовым сервером exim. Аналог postfixadmin’a для postfix’a, но на мой взгляд более функциональна, в силу самого exim’a. Рассказывать о всех преимуществах не буду, а расскажу лишь о том, как правильно настроить блокировку писем по критериям. Их всего 4: отправитель, получатель, тема, почтовый клиент. Если вы ничего не меняли в маршрутах, то в конфигурации по умолчанию они выглядят вот так:

ditch_hdrmailer:
driver = redirect
allow_fail
data = :blackhole:
condition = ${if eq {${lookup mysql{select count(*) from blocklists,users,domains \
where blocklists.blockhdr = 'x-mailer' \
and blocklists.blockval = '${quote_mysql:$h_x-mailer:}' \
and users.localpart = '${quote_mysql:$local_part}' \
and domains.domain = '${quote_mysql:$domain}' \
and domains.domain_id=blocklists.domain_id \
and users.user_id=blocklists.user_id}}}{1} {yes}{no}}
local_part_suffix = -*
local_part_suffix_optional
retry_use_local_part

ditch_hdrto:
driver = redirect
allow_fail
data = :blackhole:
condition = ${if eq {${lookup mysql{select count(*) from blocklists,users,domains \
where blocklists.blockhdr = 'to' \
and blocklists.blockval = '${quote_mysql:$h_to:}' \
and users.localpart = '${quote_mysql:$local_part}' \
and domains.domain = '${quote_mysql:$domain}' \
and domains.domain_id=blocklists.domain_id \
and users.user_id=blocklists.user_id}}}{1} {yes}{no}}
local_part_suffix = -*
local_part_suffix_optional
retry_use_local_part

ditch_hdrfrom:
driver = redirect
allow_fail
data = :blackhole:
condition = ${if eq {${lookup mysql{select count(*) from blocklists,users,domains \
where blocklists.blockhdr = 'from' \
and blocklists.blockval = '${quote_mysql:$h_from:}' \
and users.localpart = '${quote_mysql:$local_part}' \
and domains.domain = '${quote_mysql:$domain}' \
and domains.domain_id=blocklists.domain_id \
and users.user_id=blocklists.user_id}}}{1} {yes}{no}}
local_part_suffix = -*
local_part_suffix_optional
retry_use_local_part

ditch_hdrsubject:
driver = redirect
allow_fail
data = :blackhole:
condition = ${if eq {${lookup mysql{select count(*) from blocklists,users,domains \
where blocklists.blockhdr = 'subject' \
and blocklists.blockval = '${quote_mysql:$h_subject:}' \
and users.localpart = '${quote_mysql:$local_part}' \
and domains.domain = '${quote_mysql:$domain}' \
and domains.domain_id=blocklists.domain_id \
and users.user_id=blocklists.user_id}}}{1} {yes}{no}}
local_part_suffix = -*
local_part_suffix_optional
retry_use_local_part

Но в такой конфигурации они мало удобны, так как требуют точного совпадения. То есть, например, нельзя занести в список домен, а только отдельных получателей, да и ещё не просто получателя, а в формате . (именно так: то есть вместе с угловыми скобками). Согласитесь, не совсем удобно. Поэтому, я решил немного подправить условия, что бы можно было заносить адреса в привычной для нас форме, возможность заносить не просто отдельный адрес, а целый домен, совпадение по ключевым словам в теме и т.д.
Ниже будет описание, какие изменения делаем для каждого маршрута.

1) По почтовому клиенту:

В роутере ditch_hdrmailer вместо строки

and blocklists.blockval = '${quote_mysql:$h_x-mailer:}' \

пишем такую

and '${quote_mysql:$h_x-mailer:}' like concat('%',blocklists.blockval,'%') \

2) По получателю

В роутере ditch_hdrto вместо строки

and blocklists.blockval = '${quote_mysql:$h_to:}' \

пишем такую

and '${quote_mysql:$h_to:}' like concat('%',blocklists.blockval,'%') \

3) По отправителю

В роутере ditch_hdrfrom вместо строки

and blocklists.blockval = '${quote_mysql:$h_from:}' \

пишем такую

and '${quote_mysql:$h_from:}' like concat('%',blocklists.blockval,'%') \

4) По теме письма

В роутере ditch_hdrsubject вместо строки

and blocklists.blockval = '${quote_mysql:$h_subject:}' \

пишем такую

and '${quote_mysql:$h_subject:}' like concat('%',blocklists.blockval,'%') \

После всех изменений перезапускаем exim.

5) Тестирование

Тестирование покажу на примере ротуера для почтового клиента. Заходим в админку vexim’a, выбираем нужного нам пользователя, заходим в редактирование настроек для него и опускаемся в самый низ, до надписи

Add a new header blocking filter for this user:

Выбираем X-mailer и в поле вписываем Outlook. Будем проверять на примере почтового клиента Microfost Outlook 2003. Пробуем отправить письмо. Вот что мы увидим в логах, при включённом режиме debug:

14:12:47 33295 --------> ditch_hdrmailer router <--------
14:12:47 33295 local_part=user domain=domain.ua
14:12:47 33295 checking "condition"
14:12:47 33295 expanding: $h_x-mailer:
14:12:47 33295    result: Microsoft Office Outlook 11
14:12:47 33295 expanding: $local_part
14:12:47 33295    result: user
14:12:47 33295 expanding: $domain
14:12:47 33295    result: domain.ua
14:12:47 33295 expanding: select count(*) from blocklists,users,domains where blocklists.blockhdr = 'x-mailer' and '${quote_mysql:$h_x-mailer:}' like concat('%',blocklists.blockval,'%') and users.localpart = '${quote_mysql:$local_part}' a
nd domains.domain = '${quote_mysql:$domain}' and domains.domain_id=blocklists.domain_id and users.user_id=blocklists.user_id
14:12:47 33295    result: select count(*) from blocklists,users,domains where blocklists.blockhdr = 'x-mailer' and 'Microsoft Office Outlook 11' like concat('%',blocklists.blockval,'%') and users.localpart = 'user' and domains.doma
in = 'domain.ua' and domains.domain_id=blocklists.domain_id and users.user_id=blocklists.user_id
14:12:47 33295 search_open: mysql "NULL"
14:12:47 33295   cached open
14:12:47 33295 search_find: file="NULL"
14:12:47 33295   key="select count(*) from blocklists,users,domains where blocklists.blockhdr = 'x-mailer' and 'Microsoft Office Outlook 11' like concat('%',blocklists.blockval,'%') and users.localpart = 'user' and domains.domain =
'domain.ua' and domains.domain_id=blocklists.domain_id and users.user_id=blocklists.user_id" partial=-1 affix=NULL starflags=0
14:12:47 33295 LRU list:
14:12:47 33295 internal_search_find: file="NULL"
14:12:47 33295   type=mysql key="select count(*) from blocklists,users,domains where blocklists.blockhdr = 'x-mailer' and 'Microsoft Office Outlook 11' like concat('%',blocklists.blockval,'%') and users.localpart = 'user' and domai
ns.domain = 'domain.ua' and domains.domain_id=blocklists.domain_id and users.user_id=blocklists.user_id"
14:12:47 33295 database lookup required for select count(*) from blocklists,users,domains where blocklists.blockhdr = 'x-mailer' and 'Microsoft Office Outlook 11' like concat('%',blocklists.blockval,'%') and users.localpart = 'user
' and domains.domain = 'domain.ua' and domains.domain_id=blocklists.domain_id and users.user_id=blocklists.user_id
14:12:47 33295 MySQL query: select count(*) from blocklists,users,domains where blocklists.blockhdr = 'x-mailer' and 'Microsoft Office Outlook 11' like concat('%',blocklists.blockval,'%') and users.localpart = 'user' and domains.do
main = 'domain.ua' and domains.domain_id=blocklists.domain_id and users.user_id=blocklists.user_id
14:12:47 33295 MYSQL using cached connection for localhost/vexim/vexim
14:12:47 33295 lookup yielded: 1
14:12:47 33295 expanding: ${lookup mysql{select count(*) from blocklists,users,domains where blocklists.blockhdr = 'x-mailer' and '${quote_mysql:$h_x-mailer:}' like concat('%',blocklists.blockval,'%') and users.localpart = '${quote_mysql:
$local_part}' and domains.domain = '${quote_mysql:$domain}' and domains.domain_id=blocklists.domain_id and users.user_id=blocklists.user_id}}
14:12:47 33295    result: 1
14:12:47 33295 expanding: 1
14:12:47 33295    result: 1
14:12:47 33295 condition: eq {${lookup mysql{select count(*) from blocklists,users,domains where blocklists.blockhdr = 'x-mailer' and '${quote_mysql:$h_x-mailer:}' like concat('%',blocklists.blockval,'%') and users.localpart = '${quote_my
sql:$local_part}' and domains.domain = '${quote_mysql:$domain}' and domains.domain_id=blocklists.domain_id and users.user_id=blocklists.user_id}}}{1}
14:12:47 33295    result: true
14:12:47 33295 expanding: yes
14:12:47 33295    result: yes
14:12:47 33295 expanding: no
14:12:47 33295    result: no
14:12:47 33295 skipping: result is not used
14:12:47 33295 expanding: ${if eq {${lookup mysql{select count(*) from blocklists,users,domains where blocklists.blockhdr = 'x-mailer' and '${quote_mysql:$h_x-mailer:}' like concat('%',blocklists.blockval,'%') and users.localpart = '${quo
te_mysql:$local_part}' and domains.domain = '${quote_mysql:$domain}' and domains.domain_id=blocklists.domain_id and users.user_id=blocklists.user_id}}}{1} {yes}{no}}
14:12:47 33295    result: yes
14:12:47 33295 calling ditch_hdrmailer router
14:12:47 33295 rda_interpret (string): :blackhole:
14:12:47 33295 expanded: :blackhole:
14:12:47 33295 file is not a filter file
14:12:47 33295 parse_forward_list: :blackhole:
14:12:47 33295 extract item: :blackhole:
14:12:47 33295 address :blackhole:d
14:12:47 33295 LOG: MAIN
14:12:47 33295   => :blackhole: <user@domain.ua> R=ditch_hdrmailer
14:12:47 33295 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


Как видим, наш фильтр сработал, и письмо заблокировалось. В режиме нормального логгирования получим такое сообщение:

2010-09-29 14:12:47 [33295] 1P0uaY-0008ez-5q => :blackhole: R=ditch_hdrmailer
2010-09-29 14:12:47 [33295] 1P0uaY-0008ez-5q Completed QT=5s

Напомню, что если мы имеем 4 роутера, и сработал первый по списку, то остальные не проверяются.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP
Powered by Muff