Пятница, 2024-11-08, 1:40 PM
 
Начало Форум Регистрация Вход
Вы вошли как Гость
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: denix  
Решение часто возникающих задач в sendmail
denixДата: Четверг, 2006-06-29, 2:29 AM | Сообщение # 1
Admin
Группа: Администраторы
Сообщений: 531
Репутация: 0
Статус: Offline
> 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.ru/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) так
долго стучится почтовик.

 
  • Страница 1 из 1
  • 1
Поиск:


Бесплатный хостинг uCoz