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 refering of the best MX record of the sender domain to private or # special address space # Проверка принадлежности основной MX записи домена отправителя к # зарезервированному/частному/немаршрутизируемому адресному пространтсву # dnl # в access_db значения helo вносятся в следующем виде: dnl # SenderDomainBestMX:localhost REJECT dnl # SenderDomainBestMX:192.168 REJECT dnl # SenderDomainBestMX:172.16 ERROR MX of sender address domain cannot refer to private or special address space dnl # dnl # исключения сделаны для ${client_addr}, находящихся в $w в виде IP адреса dnl # в квадратных скобках, и для ${client_name}, находящихся в $w, dnl # т. е. если клиент находится на том же хосте, что и сервер dnl # dnl # для исключения из проверки исходящих сообщений надо в sendmail.mc внести: dnl # define(`confCHECK_MAIL_DOMAIN_BEST_MX_SKIP', `OUTGOING')dnl dnl # подробнее о понятии "исходящим сообщений см. HACK(`is_outgoing') dnl # dnl # для исключения из проверки сообщений сообщений от аутентифицированных отправителей dnl # надо в sendmail.mc внести: dnl # define(`confCHECK_MAIL_DOMAIN_BEST_MX_SKIP', `AUTH')dnl dnl # divert(0) VERSIONID(`$Id: check_mail_domain_best_mx.m4,v 8.12-0.04 2005/12/13 16:47:59 corvax Exp $')dnl divert(-1) dnl HACK(`cfhead')dnl ifdef(`confCHECK_MAIL_DOMAIN_BEST_MX',`',`define(`confCHECK_MAIL_DOMAIN_BEST_MX', `IP')') LOCAL_RULESETS SLocal_check_mail dnl uncomment the line below if you do not use HACK(`precheck_envelope') #R $* $: $>Parse0 $>3 $1 R $+ < @ $+ > $: $1 < @ $2 > $| $>CheckSenderDomainBestMX $2 R $* $| $#$* $#$2 R $* $| $* $: $1 SCheckSenderDomainBestMX R $* $: $1 $| $&{client_name} $| $&{client_addr} # делаем исключение из проверки, если PTR запись рилея # присутствует в $w (т. е. является адресом интерфеса этого же хоста) R $* $| $=w $| $* $@ SKIP_LOCAL # подставляем IP адрес рилея в квадратных скобках R $* $| $* $| $* $: $1 $| $2 $| [ $3 ] # делаем исключение из проверки, если IP адрес рилея в квадратных скобках # присутствует в $w (т. е. является адресом интерфеса этого же хоста) R $* $| $* $| $=w $@ SKIP_LOCAL # делаем исключение из проверки, если IP адрес рилея в квадратных скобках # является адресом loopback интерфейса R $* $| $* $| [127.0.0.1] $@ SKIP_LOCAL # убираем квардратные скобки R $* $| $* $| [ $+ ] $: $1 $| $2 $| $3 dnl ifelse_strstr(confCHECK_MAIL_DOMAIN_BEST_MX_SKIP, `AUTH', `dnl # skip checks for authentificated senders # делаем исключение из проверки для аутентифицированных отправителей R $* $| $* $| $* $: $&{auth_type} $| $1 $| $2 $| $3 R $+ $| $* $| $* $| $* $@ SKIP_AUTH R $* $| $* $| $* $| $* $: $2 $| $3 $| $4 ') dnl ifelse_strstr(confCHECK_MAIL_DOMAIN_BEST_MX_SKIP, `OUTGOING', `dnl # skip checks for outgoing messages # делаем исключение из проверки для исходящих сообщений R $* $| $* $| $* $: $&{IsOutgoing} $| $1 $| $2 $| $3 R YES $| $* $| $* $| $* $@ SKIP_OUTGOING R $* $| $* $| $* $| $* $: $2 $| $3 $| $4 ') R $* $| $* $| $* $: $1 R $+ . $: $1 dnl R $+ $: $1 $| $>CheckIPsyntax $1 R $+ $| FAILED $: $1 R $+ $| $* $@ SKIP_IP dnl R $+ $: $1 $| $(mxserved_best $1 $) R $+ $| $* $#TEMP $@ 4.7.1 $: "450 Can not check best MX record(s) for sender domain " $1 dnl R $+ $| $+ $: $1 $| $2 $| $(dns_a $2 $) R $+ $| $+ $| $* $#TEMP $@ 4.7.1 $: "450 Can not get A record for " $2 ", best MX record of sender domain " $1 R $+ $| $+ $| $+ . $: $1 $| $2 $| $3 dnl R $+ $| $+ $| $+ $: $1 $| $2 $| $3 $| $>A <$3> <> dnl R $+ $| $+ $| $+ $| $* $@ OK R $+ $| $+ $| $+ $| $* $@ SKIP R $+ $| $+ $| $+ $| $* $: $1 $| $2 $| $3 dnl R $+ $| $+ $| $+ $| <$* $$1 $*> <$*> $: $1 $| $2 $| $3 $| <$4 $1 $5> <$6> R $+ $| $+ $| $+ $| <$* $$2 $*> <$*> $: $1 $| $2 $| $3 $| <$4 $2 $5> <$6> R $+ $| $+ $| $+ $| <$* $$3 $*> <$*> $: $1 $| $2 $| $3 $| <$4 $3 $5> <$6> dnl R $+ $| $+ $| $+ $| <$*> $#error $@ 5.7.1 $: "554 MX " $2 " [" $3 "] for " $1 " cannot refer to private or special address space, see RFC 3330" R $+ $| $+ $| $+ $| <$*> $#error $@ 5.7.1 $: $4 R $+ $| $+ $| $+ $| <$*> $#error $@ 5.7.1 $: $4 R $+ $| $+ $| $+ $| <$*> $#discard $: discard R $+ $| $+ $| $+ $| <$*> $#discard $: $4 R $+ $| $+ $| $+ $| <$*> $#discard $: $4 R $+ $| $+ $| $+ $| <$*> $#error $@ TEMPFAIL $: "Try again later" R $+ $| $+ $| $+ $| <$*> $#error $@ TEMPFAIL $: $4. "Try again later" R $+ $| $+ $| $+ $| <$*> $#error $@ TEMPFAIL $: $4. "Try again later" R $+ $| $+ $| $+ $| <$*> $#error $@ $4.$5.$6 $: $7 R $+ $| $+ $| $+ $| <$*> $#error $@ UNAVAILABLE $: $4 R $+ $| $+ $| $+ $| <$*> $#error $@ UNAVAILABLE $: $4 R $+ $| $+ $| $+ $| <$*> <$*> $#error $: $4 R $+ $| $+ $| $+ $| $* $: $1 $| $2 $| $3 dnl R $+ $| $+ . $| $+ $: $1 $| $2 $| $3 R $+ $| [$+] $| $+ $: $1 $| [$2] $| $3 $| FAILED R $+ $| $+ $| $+ $: $1 $| $2 $| $3 $| $>CheckIPsyntax $2 dnl ifelse_strstr(confCHECK_MAIL_DOMAIN_BEST_MX, `IP', `dnl R $+ $| $+ $| $+ $| FAILED $: $1 $| $2 $| $3 R $+ $| $+ $| $+ $| $* $#error $@ 5.7.1 $: "554 Invalid MX record for domain " $1 " with an IP address " $2 " instead of a domain name on the right hand side" R $+ $| $+ $| $+ $: $1 $| $2 $| $3 $| $>D <$2> <> ', ` R $+ $| $+ $| $+ $| FAILED $: $1 $| $2 $| $3 $| $>D <$2> <> ')dnl dnl R $+ $| $+ $| $+ $| $* $@ NOT_FOUND R $+ $| $+ $| $+ $| $* $@ OK R $+ $| $+ $| $+ $| $* $@ SKIP dnl R $+ $| $+ $| $+ $| <$* $$1 $*> <$*> $: $1 $| $2 $| $3 $| <$4 $1 $5> <$6> R $+ $| $+ $| $+ $| <$* $$2 $*> <$*> $: $1 $| $2 $| $3 $| <$4 $2 $5> <$6> R $+ $| $+ $| $+ $| <$* $$3 $*> <$*> $: $1 $| $2 $| $3 $| <$4 $3 $5> <$6> dnl R $+ $| $+ $| $+ $| <$*> $#error $@ 5.7.1 $: "554 MX " $2 " for " $1 " cannot refer to private or special address space, see RFC 3330" R $+ $| $+ $| $+ $| <$*> $#error $@ 5.7.1 $: $4 R $+ $| $+ $| $+ $| <$*> $#error $@ 5.7.1 $: $4 R $+ $| $+ $| $+ $| <$*> $#discard $: discard R $+ $| $+ $| $+ $| <$*> $#discard $: $4 R $+ $| $+ $| $+ $| <$*> $#discard $: $4 R $+ $| $+ $| $+ $| <$*> $#error $@ TEMPFAIL $: "Try again later" R $+ $| $+ $| $+ $| <$*> $#error $@ TEMPFAIL $: $4. "Try again later" R $+ $| $+ $| $+ $| <$*> $#error $@ TEMPFAIL $: $4. "Try again later" R $+ $| $+ $| $+ $| <$*> $#error $@ $4.$5.$6 $: $7 R $+ $| $+ $| $+ $| <$*> $#error $@ UNAVAILABLE $: $4 R $+ $| $+ $| $+ $| <$*> $#error $@ UNAVAILABLE $: $4 R $+ $| $+ $| $+ $| <$*> <$*> $#error $: $4 LOCAL_CONFIG HACK(`check_ip')dnl