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 # # # Restrict incoming mail # Ограничение приема сообщений с локальным доменом в MAIL FROM или FROM с нелокальных адресов # dnl # описание проверяемых адресов: dnl # ENV_FROM - проверять домен из envelope from dnl # HDR_FROM - проверять домен из header from dnl # define(`confRESTR_IN_MAIL', `ENV_FROM HDR_FROM') dnl # несколько значений можно указывать через пробел dnl # dnl # локальными доменами считаются перечисленные в $w (/etc/mail/local-host-names) dnl # dnl # поиск лакальных доменов: dnl # RELAY_DOMAINS локальными IP адресами считаются перечисленные в $R dnl # (/etc/mail/relay-domains) в виде: dnl # A.B.C.D dnl # A.B.C dnl # A.B dnl # A dnl # ACCESS_DB_A локальными IP адресами считаются перечисленные в access_db в виде dnl # A.B.C.D RELAY dnl # A.B.C RELAY dnl # A.B RELAY dnl # A RELAY dnl # Connect:A.B.C.D RELAY dnl # Connect:A.B.C RELAY dnl # Connect:A.B RELAY dnl # Connect:A RELAY dnl # ACCESS_DB_PTR локальными IP адресами считаются перечисленные в access_db в виде dnl # PTR записей или доменных зон: dnl # host.foo.bar RELAY dnl # foo.bar RELAY dnl # bar RELAY dnl # Connect:host.foo.bar RELAY dnl # Connect:foo.bar RELAY dnl # Connect:bar RELAY dnl # define(`confRESTR_IN_MAIL_LOCAL', `RELAY_DOMAINS ACCESS_DB_A ACCESS_DB_PTR')dnl dnl # несколько значений можно указывать через пробел dnl # dnl # сообщение об ошибке в случае указания локального домена в envelope from: dnl # define(`confRESTR_IN_MAIL_ENV_FROM_MSG', `You do not have permission to send mail with this Envelope FROM') dnl # dnl # сообщение об ошибке в случае указания локального домена в header from: dnl # define(`confRESTR_IN_MAIL_HDR_FROM_MSG', `You do not have permission to send mail with this header FROM') dnl # divert(0) VERSIONID(`$Id: restrict_incoming_mail.m4,v 8.12-0.05 2004/10/30 17:01:29 corvax Exp $')dnl divert(-1) dnl ifdef(`_ACCESS_TABLE_', `', ` errprint(`*** ERROR: HACK(restrict_incoming_mail) requires FEATURE(access_db) ')') dnl HACK(`precheck_envelope')dnl dnl dnl LOCAL_CONFIG dnl dnl ifdef(`confRESTR_IN_MAIL_ENV_FROM_MSG',`',` define(`confRESTR_IN_MAIL_ENV_FROM_MSG', `You do not have permission to send mail with this Envelope FROM') ') ifdef(`confRESTR_IN_MAIL_HDR_FROM_MSG',`',` define(`confRESTR_IN_MAIL_HDR_FROM_MSG', `You do not have permission to send mail with this header FROM') ') ifdef(`confRESTR_IN_MAIL_LOCAL',`',` define(`confRESTR_IN_MAIL_LOCAL', `RELAY_DOMAINS ACCESS_DB_A ACCESS_DB_PTR') ') dnl dnl LOCAL_RULESETS dnl dnl ifelse_strstr(confRESTR_IN_MAIL, `ENV_FROM',` dnl SLocal_check_mail #R $* $: $>Parse0 $>3 $1 R $* $: $1 $| $&{auth_type} R $* $| $+ $: $1 R $* $| $: $1 R $+ < @ $+ > $: $1 < @ $2 > $| $2 R $+ $| $+ . $: $1 $| $2 # ставим метку, если в адресе отправителя указан локальный домен R $+ $| $=w $: $1 $| $2 $| NO # проверяем IP адрес отправителя, если метка поставлена R $+ $| $+ $| NO $: $1 $| $2 $| $>IsIPLocal $&{client_addr} dnl ifelse_strstr(confRESTR_IN_MAIL_LOCAL, `ACCESS_DB_PTR',` # проверяем имя хоста отправителя R $+ $| $+ $| NO $: $1 $| $2 $| $>IsHostLocal $&{client_name} ') dnl # генерируем сообщение об ошибке в случае, если адрес рилея нелокальный R $+ $| $+ $| NO $#error $: confRESTR_IN_MAIL_ENV_FROM_MSG # преобразовываем адрес к виду mailbox < @ domain >, пригодному для дальнейшей проверки R <$-> $+ $| $+ $| $* $: $2 R <$-> $+ $| $+ $: $2 R <$-> $+ $: $2 ') ifelse_strstr(confRESTR_IN_MAIL, `HDR_FROM',` dnl HFrom: $>+Check_From SCheck_From R $* $: $1 $| $&{auth_type} R $* $| $+ $: $1 R $* $| $: $1 R $* $: $1 $| R $* < $+ > $* $| $: $1 < $2 > $3 $| $2 R $+ $| $: $1 $| $1 R $* $| $+ $: $1 $| $>Parse0 $>3 $2 R $* $| $+ < @ $+ > $: $1 $| $3 R $* $| $+ . $: $1 $| $2 # ставим метку, если в адресе отправителя указан локальный домен R $+ $| $=w $: $1 $| $2 $| NO # проверяем IP адрес отправителя, если метка поставлена R $+ $| $+ $| NO $: $1 $| $2 $| $>IsIPLocal $&{client_addr} dnl ifelse_strstr(confRESTR_IN_MAIL_LOCAL, `ACCESS_DB_PTR',` # проверяем имя хоста отправителя R $+ $| $+ $| NO $: $1 $| $2 $| $>IsHostLocal $&{client_name} ') dnl # генерируем сообщение об ошибке в случае, если адрес рилея нелокальный R $+ $| $+ $| NO $#error $: confRESTR_IN_MAIL_HDR_FROM_MSG # преобразовываем адрес к первоначальному R <$-> $+ $| $+ $| $* $: $2 R <$-> $+ $| $+ $: $2 R <$-> $+ $: $2 ') SIsIPLocal ifelse_strstr(confRESTR_IN_MAIL_LOCAL, `RELAY_DOMAINS',` # прекращаем проверку, если IP адрес отправителя указан явным образом в /etc/mail/relay-domains R $=R $@ YES # прекращаем проверку, если IP адрес отправителя указан в /etc/mail/relay-domains в виде A.B.C R $=R.$- $@ YES # прекращаем проверку, если IP адрес отправителя указан в /etc/mail/relay-domains в виде A.B R $=R.$-.$- $@ YES # прекращаем проверку, если IP адрес отправителя указан в /etc/mail/relay-domains в виде A R $=R.$-.$-.$- $@ YES ') dnl ifelse_strstr(confRESTR_IN_MAIL_LOCAL, `ACCESS_DB_A',` # производим поиск записи об IP адресе отправителя в access_db с квалификатором Connect или без него R $-.$-.$-.$- $: $>A <$1.$2.$3.$4> <+Connect> <> # прекращаем проверку, если запись найдена со значением RELAY R $* $@ YES ') dnl # при любом другом значении или отсутствии такового считаем адрес нелокальным R $* $@ NO dnl SIsHostLocal # производим поиск записи о хосте отправителя в access_db с квалификатором Connect или без него R $+ $: $>D <$1> <+Connect> <> # прекращаем проверку, если запись найдена со значением RELAY R $* $@ YES dnl # при любом другом значении или отсутствии такового считаем адрес нелокальным R $* $@ NO dnl