Ключевые слова:mail, filter, regex, spam, sendmail, (найти похожие документы)
Date: Thu, 09 Sep 2004 20:28:58 +0600
From: Victor Ustugov <corvax@falbi.ua.>
Newsgroups: ftn.ru.unix
Subject: Фильтрование соединений по имени хоста в sendmail
> LOCAL_CONFIG
> Kdsl1 regex -a@MATCH ([0-9].*){5,}
длинный регексп я пропустил, для примера остальных хватит
> Kdsl3 regex -a@MATCH [0-9a-f]{8,}
>
> Kdsl4 regex -a@MATCH (^|\.)[0-9]
все регекспы с однотипными сообщениями можно объединить, указывая после
@MATCH номер регекспа для вывода в сообщении об ошибке:
Kdsl1 regex [email protected] ([0-9].*){5,}
Kdsl3 regex [email protected] [0-9a-f]{8,}
Kdsl4 regex [email protected] (^|\.)[0-9]
Kdslpat sequence dsl1 dsl3 dsl4
> LOCAL_RULESETS
>
> SLocal_check_relay
>
> R$* $: < $&{client_resolve} >
вот этого не нужно делать. я не имею ввиду поверку результатов
резолвинга, я имею ввиду затирание передаваемых правилу данных.
возможно, позже будет добавлен feature/hack, в котором тоже будет
правило Local_check_relay. и данные ему будут переданы совершенно левые
> R<TEMP> $#error $@ 4.7.1 $: "450 Relaying temporarily
denied.
> R<TEMP> IP name lookup failed for " $&{client_addr}
>
> R<FAIL> $#error $@ 5.7.1 $: "550 Relaying denied. IP name
> R<FAIL> lookup failed for " $&{client_addr}
>
> R<FORGED> $#error $@ 5.7.1 $: "550 Relaying denied. IP name
> R<FORGED> forged (PTR and A records mismatch) for "
> R<FORGED> $&{client_addr}
лучше примерно так:
R $* $| $* $: $1 $| $2 $| < $&{client_resolve} >
R $* $| $* $| <TEMP> $#error $@ 4.7.1 $: "bla-bla" $&{client_addr}
R $* $| $* $| <FAIL> $#error $@ 4.7.1 $: "bla-bla" $&{client_addr}
R $* $| $* $| <FORGED> $#error $@ 4.7.1 $: "bla-bla" $&{client_addr}
R $* $| $* $| $* $: $1 $| $2
> R$* $: $(nondsl1 $&{client_name} $)
>
> R@MATCH $@ OK
>
> R$* $: $(nondsl2 $&{client_name} $)
>
> R@MATCH $@ OK
1. лучше не оканчивать проверку рилея при совпадении имени хоста с
регекспом. ибо может быть потом нужно будет выполнить другого рода
проверку в Local_check_relay
2. если не ломать передаваемые в правило данные, то ${client_name} уже
есть в левой части
3. если необходимо не проводить проверку регекспами на основании
проверки другими регекспами, то эти другие можно объединить в sequence.
тогда при добавлении нового регекспа в исключения нужно будет делать
изменения в одном месте конфига (при описании этого регекспа и включении
его в sequence)
с учетом всего этого:
LOCAL_CONFIG
Knondsl1 regex -a@SKIP
(^|[0-9.-])(mail|mailrelay|mta|mx|relay|smtp)[0-9.-]
Knondsl2 regex -a@SKIP \.(hotmail\.com|rax\.ru|planeta)$
Knondsl sequence nondsl1 nondsl2
LOCAL_RULESETS
R $* $| $* $: $1 $| $2 $| $(nondsl $1 $: CHECK $)
после этого в строки с исключаемыми именами хостов добавится третьим
полем слово @SKIP. в остальных строках будет слово CHECK
> R$* $: $(dsl1 $&{client_name} $)
>
> R@MATCH $#error $@ 5.7.1 $: "554 DSL or DialUp sender "
> $&{client_name} " [" $&{client_addr} "] (1), please use Provider SMTP"
>
> R$* $: $(dsl2 $&{client_name} $)
>
> R@MATCH $#error $@ 5.7.1 $: "554 DSL or DialUp sender "
> $&{client_name} " [" $&{client_addr} "] (2), please use Provider SMTP"
длинная череда таких вот проверок с единообразным сообщением клиенту
заменяется одной проверкой:
# предварительно помеченные для проверки словом CHECK строки
# проверяем регекспом (серией регекспов)
R $* $| $* $| CHECK $: $1 $| $2 $| CHECK $| $(dslpat $1 $)
# возвращаем ошибку в случае совпадения с одним из регекспов
# номер в скобках будет браться из настроек регекспа
# (число после @MATCH.)
R $* $| $* $| CHECK $| @MATCH.$-
$#error $@ 5.7.1 $: "554 bla-bla " ($3)
# убираем результат проверки, оставляя метку CHECK
# для проверки следующей серией регекспов
R $* $| $* $| CHECK $| $* $: $1 $| $2 $| CHECK
# после всех поверок восстанавливаем данные, переданные в правило
R $* $| $* $| $* $: $1 $| $2
писал все это без тестов, прямо сюда. так что не исключены описки