divert(-1) # # Copyright (c) 2003, 2004 Victor Ustugov # This hack is under BSD License # Redistributions of source code must retain the above copyright notice # # hacks disscussion's maillist - http://www.mta.org.ua/mailman/listinfo/sendmail-conf # # # Check dial-up/dsl/cable relays # Проверка dial-up/dsl/cable рилеев # dnl # dnl # проверка рилея на принадлежность к сетям dial-up & dsl dnl # NO - не производить проверку dnl # CLIENT_NAME - производить проверку ${client_name} dnl # CLIENT_PTR - производить проверку ${client_ptr} dnl # define(`confCHECK_RELAY_DIALUP', `CLIENT_NAME')dnl dnl # несколько значений могут быть указаны через пробел dnl # значением по умолчанию является `CLIENT_NAME' dnl # dnl # сами регулярные выражения указываются при использовании HACK(`check_relay_dialup_regex') dnl # пример: dnl # HACK(`check_relay_dialup_regex',``^(.+[\.\-])?(adsl|cable|client|dhcp|dial|dial-in|dial-up|dialup|dsl|dyn|dynamic|dyndsl|pool|ppp|user|xdsl)[\.\-_0-9].+'') dnl # HACK(`check_relay_dialup_regex',``^.*[0-9]{1,3}[-\.][0-9]{1,3}[-\.][0-9]{1,3}[-\.][0-9]{1,3}[-\.].+$'',``Access denied. Send mail thru your ISP'') dnl # dnl # исключения из проверки производятся для: dnl # - адресов получателей, указанных в access_db с квалификатором Spam и dnl # значением FRIEND. для этого необходимо использование dnl # FEATURE(`delay_checks', `FRIEND') dnl # - хостов, PTR запись которых присутствует в $w dnl # (т. е. является адресом интерфеса этого же хоста) dnl # - хостов, IP адрес которых в квадратных скобках присутствует в $w dnl # (т. е. является адресом интерфеса этого же хоста) dnl # - хостов, указанных в access_db (в виде PTR или A записи, доменной зоны dnl # или номера сети) с квалификатором Connect и значением RELAY или OK dnl # - хостов, указанных в access_db (в виде PTR или A записи, доменной зоны dnl # или номера сети) с квалификатором ConnectDialUp и значением RELAY, OK или SKIP dnl # dnl # дополнительные исключения из проверки: dnl # AUTH - исключения для аутентифицированных отправителей dnl # OUTGOING - исключения для исходящих сообщений (подробнее см. HACK(`is_outgoing') dnl # define(`confCHECK_RELAY_DIALUP_SKIP', `AUTH OUTGOING')dnl dnl # несколько значений могут быть указаны через пробел dnl # значением по умолчанию является AUTH dnl # divert(0) VERSIONID(`$Id: check_relay_dialup.m4,v 8.12-0.07 2004/08/31 12:34:29 corvax Exp $')dnl divert(-1) dnl define(`_CHECK_RELAY_DIALUP_')dnl dnl ifdef(`confCHECK_RELAY_DIALUP_SKIP',`',`define(`confCHECK_RELAY_DIALUP_SKIP', `AUTH')') dnl dnl LOCAL_RULESETS dnl dnl SLocal_check_relay dnl R $* $| $* $: $1 $| $2 $| $>Local_check_dialup_relay $1 $| $2 R $* $| $* $| $#$* $#$3 R $* $| $* $| $* $: $1 $| $2 dnl SLocal_check_dialup_relay dnl # делаем исключение из проверки, если PTR запись рилея # присутствует в $w (т. е. является адресом интерфеса этого же хоста) R $=w $| $* $@ SKIP_LOCAL # подставляем IP адрес рилея в квадратных скобках R $* $| $* $: $1 $| [ $2 ] # делаем исключение из проверки, если IP адрес рилея в квадратных скобках # присутствует в $w (т. е. является адресом интерфеса этого же хоста) R $* $| $=w $@ SKIP_LOCAL # делаем исключение из проверки, если IP адрес рилея в квадратных скобках # является адресом loopback интерфейса R $* $| [127.0.0.1] $@ SKIP_LOCAL # убираем квардратные скобки R $* $| [ $+ ] $: $1 $| $2 dnl # производим поиск PTR записи рилея в access_db с квалификатором Connect R $+ $| $* $: $1 $| $2 $| $>D <$1> <> # производим поиск A записи рилея в access_db с квалификатором Connect R $| $+ $: $| $1 $| $>A <$1> <> R $+ $| $+ $| $* $: $1 $| $2 $| $>A <$2> <> # делаем исключение, если в результате найдено значение RELAY или OK R $* $| $* $| <$={Accept}> $* $@ SKIP_CONNECT R $* $| $* $| $* $: $1 $| $2 # производим поиск PTR записи рилея в access_db с квалификатором ConnectDialUp R $+ $| $* $: $1 $| $2 $| $>D <$1> <> # производим поиск A записи рилея в access_db с квалификатором ConnectDialUp R $| $+ $: $| $1 $| $>A <$1> <> R $+ $| $+ $| $* $: $1 $| $2 $| $>A <$2> <> # делаем исключение, если в результате найдено значение RELAY или OK R $* $| $* $| <$={Accept}> $* $@ SKIP_CONNECT_DIALUP # делаем исключение, если в результате найдено значение SKIP R $* $| $* $| $* $@ SKIP_CONNECT_DIALUP R $* $| $* $| $* $: $1 $| $2 dnl ifelse_strstr(confCHECK_RELAY_DIALUP_SKIP, `AUTH', `dnl # skip checks for authentificated senders # делаем исключение из проверки для аутентифицированных отправителей R $* $| $* $: $&{auth_type} $| $1 $| $2 R $+ $| $* $| $* $@ SKIP_AUTH R $* $| $* $| $* $: $2 $| $3 ') dnl ifelse_strstr(confCHECK_RELAY_DIALUP_SKIP, `OUTGOING', `dnl # skip checks for outgoing messages # делаем исключение из проверки для исходящих сообщений R $* $| $* $: $&{IsOutgoing} $| $1 $| $2 R YES $| $* $| $* $@ SKIP_OUTGOING R $* $| $* $| $* $: $2 $| $3 ') dnl # check client_name by regexp # !!! WARNING !!! # regex check with dulpat disabled # for regex checks use check_relay_dialup_regex # # проверка client_name по регулярному выражению # !!! ВНИМАНИЕ !!! # проверка по dulpat отключена # для проверки client_name по регулярным выражениям необходимо использовать check_relay_dialup_regex #R $* $| $* $: $(dulpat $1 $: $1 $) $| $2 ifelse(len(X`'_ARG_),`1',` #R @MATCH $| $* $#error $@ 5.7.1 $: "550 Access from dsl/dial-up/cable relays denied according to the local policy" ', ` #R @MATCH $| $* $#error $@ 5.7.1 $: "_ARG_" ') dnl