Очень часто возникает ситуация, когда на один
компьютер заведено несколько доменов, и
возникает
необходимость в организации почтового сервера для них. Вот ряд проблем с
которыми прихоится
сталкиваться при организации почтового сервера для нескольких доменов на
одном компьютере:
1. Предоставление почтовых адресов типа info@first.domain и
info@second.domain.
Проблема
заключается в том, что на машине не может существовать два одинаковых
пользователя и это не
решить при помощи файла aliases.
2. Предоставление почтовых адресов user@first.domain
только тем
пользователям, который
относятся к данному домену.
3. Разрешить пользователям отсылку только с имени того домена к которому
они преписаны.
И так... Начнем с 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
внести такие
записи
то при выполнение команды newaliases мы
получим ошибку:
aliases: line N: info@second.domain... Warning: duplicate alias name info
Для решения подобных проблем используется virtusertable,
таблица виртуальных
пользователей
почтового сервера. Активация этой опции производится при создании файла sendmail.cf,
путем
определения virtusertable в файле mail.relay.mc. Мы
создадим этот файл в
директории пакета
SENDMAIL_SOURCE/cf/cf:
(Последня запись используется для
организации файла 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'.
(Соответвенно, если мы используем 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 добавляем
следующие строчки:
После этого получается что в домене first.domain
существует толко
один почтовый адрес
info@first.domain и почта
приходящая на этот адрес будет
попадать к локальному пользователю под
именем user1. Соответсвенно то же самое с доменом second.domain
и пользователем
user2.
Если в конфигурации sendmail не указано более никаких доменов, то
пользовател user3
имеет
только локальный почтовый адрес user3@localhost.
Необходимо
помнить, что если вы закрываете
домен строчкой:
@first.domain error:nouser No such user here
то в файле
virtusertable.in
необходимо явно указать всех пользователей этого домена.
Теперь о тертьей проблеме. Это когда
пользователь user1, который приписан к домену
first.domain
(почтовый ящик info@first.domain),
по каки либо причинам
решил послать письмо с домена
second.domain. Для того чтобы
подобного не было используется
файл, где указывается с кокого
домена данный пользователь может посылать почту. Вернее пользователь
может посылать с любого
доступного с данной машины домена, но его адрес будет подменятся тем,
который указан
администратором.
Для реализации данной возможности
используется опция genericstable. В файле
mail.relay.mc
добавим следующие строчки:
Так же создаем файл sendmail.cG, в который
вносим домены, на которые
распространяются
правила
файла genericstable.in:
first.domain second.domain localhost
Таким образом, лубая почта пользователя user1,
при любой настройке почтового
клиента будет
иметь в поле From: info@first.domain,
поле Reply-To
остается неизменным. Необходимо
помнить,
что пользователи не указаные в файле genericstable.in могу
использовать любой из
доменов,
относящихся к этой машине.
Конечно это не единственный способ организации
виртуального почтового сервера и не все
возможности .
Если вы что то не поняли из вышеизложенного (это вполне вероятно, так
как очень сложно
излагать свои мысли о sendmail :)), то пишите.