Ключевые слова:mail, sendmail, faq, mta, (найти похожие документы)
From: sciurus <sciurus@mail.ru.>
Date: Mon, 20 Dec 2004 18:21:07 +0000 (UTC)
Subject: Решение часто возникающих задач в sendmail
Оригинал: http://linux.ufaras.ru/sendmail.html
> 1.Если необходимо перенаправить исходящую почту, посланную на
> определенный адрес или домен, то можно пойти двумя путями.
Перенаправят почту в локальный ящик вот эти 2 правила:
R123$* $#local $: postmaster
R$* < @ $*elki-palki.ru. > $#local $: postmaster
За пределы локального домена:
R123$* $#{mailer} $@ ext_domain.net $: ext_user < @ ext_domain.net. >
R$* < @ $*elki-palki.ru. > $#{mailer} $@ ext_domain.net $: ext_user < @ ext_domain.net. >
Во-первых, можно напрямую отредактировать sendmail.cf, вставив эти
правила сразу за SParse1 (в Ruleset 0).
Должно получиться следующее:
#
# Parse1 -- the bottom half of ruleset 0.
#
SParse1
R123$* $#local $: postmaster
R$* < @ $*elki-palki.ru. > $#local $: postmaster
Но тогда придется каждый раз при пересборке вручную править
sendmail.cf.
Второй способ заключается в редактировании файла
/usr/src/sendmail-XXX/cf/m4/proto.m4
В нем нужно найти все тот же SParse1 и вставить сразу после него
указанные выше правила.
Теперь эти правила будут автоматически включатся в конфиг при
пересборке.
> 2. Итак, запрещаем локальным пользователям посылать почту на
> определенный домен и его поддомены.
При этом получать почту с этих доменов юзеры смогут.
В check_rcpt (или local_check_rcpt)
С{baddom} domain1.ru domain2.ru
R$* $: $>Parse0 $>3 $1
R$* <$* $={baddom}.> $# error $@5.7.1 $:"You must not send mail to this address."
Зачем это нужно? Однажды некий админ, в ответ на сканирование моим
юзером его сети, заблокировал мою сетку так, что почта с его домена ко
мне приходила, но обратного движения не наблюдалось, лог исправно
заполнялся отлупами с того сервера. Поскольку админ на контакт упорно
не шел, а maillog прилично забивался отлупами, пришлось пойти на
военную хитрость.
> 3.Как разрешить пользователю принимать почту только с определенного
> IP-адреса.
Предположим, Вы создали список рассылки и хотите, чтобы сообщения на
него можно было посылать только с конкретных ip-адресов. Можно
поступить так:
Добавляем в sendmail.mc след. строки
LOCAL CONFIG
#В этом файле перечисляем разрешенные IP-адреса:
KADDR_LIST hash /etc/mail/addrlist
KCheckRcpt2 regex -n -a@NOLIST2 ^ < list@(.*yourdomain.ru|\[k\.l\.m\.n\]|
\[127\.0\.0\.1\]|localhost|localhost.localdomain|alias_domainname.ru)>$
(последняя строка - продолжение предпоследней)
, где [k.l.m.n] - ip-адрес почтового сервера.
SLocal_check_rcpt
# Является ли адрес получателя списком рассылки?
R$+ $: $(CheckRcpt2 $1 $:$1 $)
Если нет - пропускаем его и завершаем работу набора правил.
R@NOLIST2 $@ OK
Если да, смотрим IP-адрес отправителя письма.
R$* $: $&{client_addr}
R$-.$-.$-.$- $: $(ADDR_LIST $1.$2.$3.$4 $)
Если IP-адрес включен в файл /etc/mail/addrlist, то принимаем письмо:
ROK $@ OK
Если нет - даем отлуп.
R$* $#error $: 553 Sorry, you can not send letter to this list.
Формат файла /etc/mail/addrlist:
127.0.0.1 OK
Не забываем про команду:
makemap hash addrlist < addrlist
Пересобираем sendmail.cf и перезапускаем sendmail.
> 4. Как разрешить пользователю принимать почту только с определенного
> e-mail адреса.
Добавляем в sendmail.mc след. строки
LOCAL CONFIG
#Разрешенный отправитель:
KSnd regex -a@LIST1 <someuser@somedomain.ru.>
#Все получатели кроме того, кто может получать почту только от
указанного выше отправителя :
KRcp regex -n -a@NOLIST2 <youruser@(.*yourpostdomain.ru|\[k\.l\.m\.n\]|
\[127\.0\.0\.1\]|localhost|localhost.localdomain|alias_of_postdomain.ru)>
(последняя строка - продолжение предпоследней)
, где [k.l.m.n] - ip-адрес почтового сервера.
Scheck_compat
R$* $| $* $: $(syslog $1 $2 $) $1 $| $2
#Проверяем, является ли получатель тем самым юзером, к-й ограничен в
правах:
R$+ $| $+ $: $1 $| $(Rcp $2 $:$2 $)
#Нет - завершаем работу набора правил
R$+ $| @NOLIST2 $@ OK
#Да - проверяем, кто отправитель:
R$+ $| $+ $: $(Snd $1 $:$1 $) $| $2
#Если тот, которому все можно - завершаем работу набора правил
R@LIST1 $| $+ $@ OK
#Нет - даем отлуп
R$* $#error $: 553 Sorry, you can not send letter to this list.
Пересобираем sendmail.cf и перезапускаем sendmail.
> 5. Как отвергать почту, приходящую с локальных административных
> адресов, но не с локальных ip-адресов.
В последнее время мне то и дело сыпятся уведомления от антивирусов
различных почтовых систем, что с адм. адресов моего домена adm,
postmaster, MAILER-DAEMON, etc приходят вирусы. Кроме того, с этих же
электронных адресов стали приходить вирусы и моим пользователям,
естественно, из чужих сетей. Попробуем справиться с этим так.
Добавляем в sendmail.mc след. строки
LOCAL CONFIG
KADM_ADDR_LIST hash /etc/mail/admaddrlist
KADMADR regex -n -a@NOADMLIST ^(root|postmaster|adm|mailer-daemon|hostmaster|webmaster)<@.*yourdomain.ru.>$
R<@> $@ OK
R$+<@$+> $: $(ADMADR $1<@$2> $: $1<@$2> $)
R@NOADMLIST $@ OK
R$* $: $&{client_addr}
R$-.$-.$-.$- $: $(ADM_ADDR_LIST $1.$2.$3.$4 $)
ROK $@ OK
R$* $#discard $: discard
Формат файла /etc/mail/admaddrlist, в котором содержатся ip-адреса, с
которых разрешено приходить административной почте:
127.0.0.1 OK
и т.д.
Не забываем про команду:
makemap hash admaddrlist < admaddrlis
Пересобираем sendmail.cf и перезапускаем sendmail.
> 6. Как прописать жесткое соответствие между e-mail-адресом и локальным
> ip-адресом для отправки сообщений локальными пользователями.
Создаем файл /etc/mail/open:
user1<@somedomain.ru>192.168.0.1 YES
user2<@somedomain.ru>192.168.0.2 YES
user3<@somedomain.ru>192.168.0.3 YES
user4<@somedomain.ru>192.168.0.4 YES
В командной строке:
makemap hash open < open
В конец стандартного sendmail.mc добавляем:
LOCAL CONFIG
Определяем специальное преобразование OPEN:
KOPEN hash /etc/mail/open
LOCAL_RULESETS
SLocal_check_mail
R$* $: $>Parse0 $>3 $1
Если адрес отправителя локальный, отправляем на проверку соответствия
между электронным адресом и IP-адресом.
R$+<@$=w> $: $>CheckLocalMail $1<@$2>
Если нет, то пропускаем такую почту.
R$* $@ OK
SCheckLocalMail
На вход набору правил CheckLocalMail подан e-mail-адрес, добавляем к
нему IP-адрес хоста, установившего smtp-соединение:
R$* $: $1 $&{client_addr}
Проверяем, соотвествует ли полученная комбинация какой-либо записи в
файле /etc/mail/open:
R$+$-.$-.$-.$- $: $(OPEN $1$2.$3.$4.$5 $: $1$2.$3.$4.$5 $)
Да - пропускаем почту.
RYES $@ OK
Нет - блокируем
R$* $#error $: 553 Sorry, you cannot
send a mail from this ip-address. Please, contact to postmaster.
Пересобираем sendmail.cf и перезапускаем sendmail.
> 7. Как запретить ОПРЕДЕЛЕННОМУ локальному пользователю посылать
> сообщения за пределы локального домена.
(Решение задачи ограничения ВСЕХ локальных пользователей пересылкой
собщений только в локальный домен - здесь
http://www.sendmail.org/~ca/email/restrict.html ).
В конец стандартного sendmail.mc добавляем:
LOCAL CONFIG
Определяем специальное преобразование Sender:
KSender regex -a@LIST restricted_user
LOCAL_RULESETS
Scheck_compat
Исходные данные для этого набора правил имеют вид $1 $| $2, где $1 -
отправитель, $2 - получатель в виде <user@domain.ru.>
Если отправитель - тот пользователь, который ограничен в правах, -
отправляем его на проверку в набор правил CheckLocalMail, причем
передаем в этот набор для дальнейшей проверки только адрес получателя
(ведь с отправителем мы уже разобрались ?)
R<$+ @ $+> $| $+ $: <$(Sender $1 $)@ $2> $| $3
R<LIST @ $=w> $| $+ $: $>CheckLocalMail $2
Почту от любого друго отправителя пропускаем.
R$* $| $* $@ OK
SCheckLocalMail
На вход набору правил CheckLocalMail подан e-mail-адрес получателя в
виде <user@domain.ru.>. Делаем разбор доменной части электр. адреса,
если она локальная - пропускаем:
R<$+@$=w> $@ OK
Нет - блокируем
R$* $#error $: 553 Sorry, you cannot send a mail to
non-local address. Please, contact to postmaster.
Пересобираем sendmail.cf и перезапускаем sendmail.
> 8.Если соединение с smtp портом идет слишком долго, то причиной этому
> могут быть несколько факторов.
"Задумчивость" почтовика может появиться после подключения
FEATURE(dnsbl).
Дело в том, что в случае падения сети и недоступности Интернета ни
одно письмо не сможет быть вами отправлено с локальных ip-адресов (в
том числе и с самого почтовика), потому что dnsbl-сервера будут
недоступны. Вообще говоря, проверка локальных ip-адресов на
принадлежность dnsbl-базам излишня, поэтому, вооружившись следующим из
/usr/src/sendmail/cf/README:
'' ...Notice: to avoid checking your own local domains against those
blacklists, use the access_db feature and add:
Connect:10.1 OK
Connect:127.0.0.1 RELAY
...''
редактируем файл /etc/mail/access:
CONNECT:127.0.0.1 OK
CONNECT:i.k.l OK
CONNECT:x.y.z.w OK
CONNECT:a.b.c.d OK
Затем makemap hash access < access
Также можно настроить FEATURE(`delay_checks') (см ../cf/README)
(http://www.opennet.dev/openforum/vsluhforumID1/41191.html)
Еще 3 возможные причины задержки при установлении smtp-соединения -
неправильно настроенный Firewall, некорректный /etc/resolv.conf
(перечисленные в нем DNS-сервера должны быть доступны, и вашему
почтовику должно быть разрешено делать запросы) и большой timeout
параметра IDENT (http://www.sendmail.org/faq/section3.html#3.12)
Можно также включить в iptables (ipchains, etc) полное логирование
всех исходящих пакетов и таким образом обнаружить, куда (ip, port) так
долго стучится почтовик.