Ключевые слова:sendmail, mail, virtual, (найти похожие документы)
Date: Fri, 07 Sep 2001 18:28:15 +0400
Newsgroups: fido7.ru.unix.bsd
From: Eugene Grosbein <Eugene.Grosbein@f1.n5006.z2.fidonet.org>
Subject: Реализация виртуальных почтовых доменов в sendmail
DS> Hа одном IP-шнике два виpтуальных хоста name1.ru и name2.ru.
DS> Мэйл сеpвеp на этой же машине. Хотелось бы иметь ящики с обоими доменными
DS> именами.
/* start of sendmail.txt */
Реализация виртуальных почтовых доменов.
Очень часто возникает ситуация, когда на один компьютер заведено
несколько доменов, и возникает необходимость в организации почтового
сервера для них. Вот ряд проблем с которыми прихоится сталкиваться при
организации почтового сервера для нескольких доменов на одном
компьютере:
1. Предоставление почтовых адресов типа info@first.domain и
info@second.domain. Проблема заключается в том, что на машине не может
существовать два одинаковых пользователя и это не решить при помощи
файла aliases.
2. Предоставление почтовых адресов user@first.domain только тем
пользователям, который относятся к данному домену.
3. Разрешить пользователям отсылку только с имени того домена к
которому они преписаны.
И так... Hачнем с DNS. Есть машина с именем mail.relay, необходимо
сделать так, чтобы почта с доменов first.domain и second.domain,
приходила на эту машину. Для этого вносим MX записи в неоходимые зоны:
first.domain IN MX 10 mail.relay ; запись в домене first.domain
second.domain IN MX 10 mail.relay ; запись в домене second.domain
Желательно наличие запасного почтового релея, для каждого домена, на
случай отказа от принятия почты основным по какой либо причине.
Запасной релей указывается с меньшим приоритетом:
first.domain IN MX 20 safe.mail.relay ; запись в домене first.domain
Так же необходимо чтобы запасной релей позволял принимать, в случае
выхода из строя основного релея, почтовые сообщения. Обычно (для
стандартной поставки sendmail 8.9.1) это делается внесением в файл
relay-domains имени домена. В нашем случае first.domain.
Теперь необходимо сказать почтовому домену о том, что он принимает на
себя почту для доменов first.domain и second.domain. Для этого
существует файл sendmail.cw, либо надо внести изменеия в файл
sendmail.cf в разделе Cw.
Пример файла sendmail.cw:
first.domain
second.domain
Пример из файла sendmail.cf:
[skip]
Cwlocalhost first.domain second.domain
# file containing names of hosts for which we receive email
[skip]
После этого переходим к проблеме номер 1. ²Теперь наш почтовый релей
принимат почту для двух доменов: first.domain и second.domain, и нам
необходимо создать два почтовых адреса: info@first.domain и
info@second.domain. Если в файл aliases внести такие записи
info@first.domain: user1
info@second.domain: user2
то при выполнение команды newaliases мы получим ошибку:
aliases: line N: info@second.domain... Warning: duplicate alias name info
Для решения подобных проблем используется virtusertable, таблица
виртуальных пользователей почтового сервера. Активация этой опции
производится при создании файла sendmail.cf, путем определения
virtusertable в файле mail.relay.mc. Мы создадим этот файл в
директории пакета sendmail 8.9.1 SENDMAIL_SOURCE/cf/cf:
divert(-1)
#
divert(0)dnl
VERSIONID(`@(#)generic-solaris2.mc 8.7 (Berkeley) 5/08/98')
OSTYPE(your_os)dnl
DOMAIN(relay.domain)dnl
FEATURE(virtusertable, `dbm /etc/virtusertable')dnl
MAILER(smtp)dnl
Так же необходимо создать файл relay.domain.m4 в директории
SENDMAIL_SOURCE/cf/domain. Его общий вид:
divert(-1)
#
divert(0)
VERSIONID(`@(#)fima.net.m4 8.8 (Berkeley) 5/08/98')
define(`confFORWARD_PATH', `$z/.forward.$w+$h:$z/.forward+$h:$z/.forward.$w:$z/
.forward')dnl
define(`confCF_VERSION', `relay.domain')dnl
FEATURE(redirect)dnl
FEATURE(use_cw_file)dnl
(Последня запись используется для организации файла sendmail.cw, о
котором говорилось ранее)
Этот файл будет используется для компиляция файла sendmail.cf:
m4 ../m4/cf.m4 domain.mc > sendmail.cf
После этого копируем файл sendmail.cf в директорию /etc (для solaris -
/etc/mail).
Теперь нам необходимо составить таблицу пользователей. Для этого мы
напишем файл virtusertable.in в /etc (или /etc/mail для solaris):
info@first.domain user1
info@second.domain user2
Так как мы определяли virtusertable как `dbm /etc/mail/virtusertable',
то в данном случае мы используем dbm для хранения базы виртуальных
пользователей. Есть возможность использовать hash (и другие форматы),
тогда наше определение долно выглядеть так - `hash
/etc/mail/virtusertable'.
После этого выполним команду:
/usr/sbin/makemap dbm virtusertable < virtusertable.in
(Соответвенно, если мы используем hash тип таблиц, то команда выглядит
так: /usr/sbin/makemap hash virtusertable < virtusertable.in).
Запускаем sendmail. Теперь мы получили два почтовых ящика -
info@first.domain и info@second.domain - на одной машине relay.domain.
А как быть с пользователем user3, который не должен использовать
почтовый ящик доменов first.domain и second.domain? Если мы не
указываем его принадлежность к доменам в файле virtusertable.in, то он
имеет возможность использовать два почтовых адреса: user3@first.domain
и user3@second.domain. Для того чтобы избежать данной ситуациив файл
virtusertable.in добавляем следующие строчки:
#old lines
info@first.domain user1
info@second.domain user2
#new lines
@first.domain error:nouser No such user here
@second.domain error:nouser No such user here
и выполняем команду:
/usr/sbin/makemap dbm virtusertable < virtusertable.in
После этого получается что в домене first.domain существует толко один
почтовый адрес info@first.domain и почта приходящая на этот адрес
будет попадать к локальному пользователю под именем user1.
Соответсвенно то же самое с доменом second.domain и пользователем
user2. Если в конфигурации sendmail не указано более никаких доменов,
то пользовател user3 имеет только локальный почтовый адрес
user3@localhost. Hеобходимо помнить, что если вы закрываете домен
строчкой:
@first.domain error:nouser No such user here
то в файле virtusertable.in необходимо явно указать всех пользователей
этого домена.
Теперь о тертьей проблеме. Это когда пользователь user1, который
приписан к домену first.domain (почтовый ящик info@first.domain), по
каки либо причинам решил послать письмо с домена second.domain. Для
того чтобы подобного не было используется файл, где указывается с
кокого домена данный пользователь может посылать почту. Вернее
пользователь может посылать с любого доступного с данной машины
домена, но его адрес будет подменятся тем, который указан
администратором.
Для реализации данной возможности используется опция genericstable. В
файле mail.relay.mc добавим следующие строчки:
FEATURE(genericstable, `dbm /etc/genericstable')dnl
GENERICS_DOMAIN_FILE(/etc/sendmail.cG)dnl
Выполняем команду m4 ../m4/cf.m4 domain.mc > sendmail.cf и копирум
файл sendmail.cf в /etc. После этого создаем файл genericstable.in:
user1 info@first.domain
user2 info@second.domain
user3 user3@localhost
Так же создаем файл sendmail.cG, в который вносим домены, на которые
распространяются правила файла genericstable.in:
first.domain
second.domain
localhost
Таким образом, лубая почта пользователя user1, при любой настройке
почтового клиента будет иметь в поле From: info@first.domain, поле
Reply-To остается неизменным. Hеобходимо помнить, что пользователи не
указаные в файле genericstable.in могу использовать любой из доменов,
относящихся к этой машине.
Выполняем команду:
/usr/sbin/makemap dbm genericstable < genericstable.in
и перезапускаем sendmail:
kill -HUP
Конечно это не единственный способ организации виртуального почтового
сервера и не все возможности masquerading и relaying. Если вы что то
не поняли из вышеизложенного (это вполне вероятно, так как очень
сложно излагать свои мысли о sendmail :)), то пишите.
(c) Андрей Ефимочкин 16.10.1998.
/* end of sendmail.txt */
Eugene
--
Подскажите, плиз, для чего конкретно нужен файл sendmail.cw, где можно посмотреть его формат, и где в sendmail.cf запись о его наличии? Да, и не достаточно ли будет прописать в sendmail.cf в параметрах Dj и C{w} вместо одного домена два? Спасибо.