Чтиво: установка сервера часть 032
Настройка Postfix и Courier-IMAP с импользованием LDAP. Часть I.
Документации на русском языке на эту тему мало. Которая есть - не
полная и не понятно вообще как описанные схемы там работают. Но я все
равно представлю список, используемых мной статей:
http://sauron.opennet.ru/
http://www.ldapzone.spb.ru/docs/postfix.phtml
http://www.opennet.ru/base/net/ldap_mail.txt
Также много полезной информации (основное место для понимая работы
postfix) необходимо искать в документации поставляющейся вместе с
пакетом postfix.
Основная идея как я уже говорил - единое место хранения
используемых данных. На текущий момент у меня корректно настроены ACL в
LDAP. Добавлены ключевые пользователи и имена сервисов. Осталось только
дополнить список транспортов, иначе postfix будет ругаться на их
отсутствие (в идеале в транспорты должны входить все имена доменов,
соответствующие тому или другому транспорту).
Я хочу организовать следующую почтовую схему: во внешнем мире у
меня есть виртуальный почтовый домен (myvirtual.mydomain.com) - на него
сыплется почта для всего нашего офиса, т.е. почта с адресами:
koal@m*****.com, nina@m*****.com,
tany@m*****.com и т.д. Я забираю эту почту по протоколу
POP3 (или IMAP) с ящика, соответствующего виртуальному почтовому
домену, раскидываю ее по локальным пользователям (причем, не все
пользователи могут иметь реальные акаунты на linux-машине). Затем они
сами по сети по протоколу POP3 смогли бы забирать эту почту. Так же
пользователи могли бы обмениваться почтой между собой, минуя внешний
почтовый сервер, но почта, предназначенная для внешнего мира,
отправлялась именно через этот сервер.
Итак, добавляем в базу LDAP транспорты, которые описывают по
совместительству список доменов для которых сервер может принимать
почту:
На текущий момент добавлены:
karavay-shops.ru
bridge.karavay-shops.ru
localhost.tkaravay-shops.ru
myvirtual.mydomain.com
Нужно еще:
ns.karavay-shops.ru
www.karavay-shops.ru
ftp.karavay-shops.ru
ntp.karavay-shops.ru
smtp.karavay-shops.ru
pop.karavay-shops.ru
begin dop_transport.ldif dn: mailDomain=ns.karavay-shops.ru,ou=transports,ou=mail,dc=karavay-shops,dc=ru
objectclass: mailDomainTransport
mailDomain: ns.karavay-shops.ru
mailTransport: local
description: host name
dn: mailDomain=www.karavay-shops.ru,ou=transports,ou=mail,dc=karavay-shops,dc=ru
objectclass: mailDomainTransport
mailDomain: www.karavay-shops.ru
mailTransport: local
description: host name
dn: mailDomain=ftp.karavay-shops.ru,ou=transports,ou=mail,dc=karavay-shops,dc=ru
objectclass: mailDomainTransport
mailDomain: ftp.karavay-shops.ru
mailTransport: local
description: host name
dn: mailDomain=ntp.karavay-shops.ru,ou=transports,ou=mail,dc=karavay-shops,dc=ru
objectclass: mailDomainTransport
mailDomain: ntp.karavay-shops.ru
mailTransport: local
description: host name
dn: mailDomain=smtp.karavay-shops.ru,ou=transports,ou=mail,dc=karavay-shops,dc=ru
objectclass: mailDomainTransport
mailDomain: smtp.karavay-shops.ru
mailTransport: local
description: host name
dn: mailDomain=pop.karavay-shops.ru,ou=transports,ou=mail,dc=karavay-shops,dc=ru
objectclass: mailDomainTransport
mailDomain: pop.karavay-shops.ru
mailTransport: local
description: host name
end dop_transport.ldif Для работы postfix с LDAP необходимо пересобрать пакет postfix.
Также необходимо предусмотреть наложение патча на postfix, который бы
включал поддержку нормальных квот (ограничений на размер) для
виртуальных почтовых ящиков. В ASPLinux 9 такой патч входит в
стандартную сборку, другие же могут его найти на
http://web.onda.com.br/nadal/index.html
Пересборка postfix. Сначала необходимо установить сорцы:
$ rpm -ihv postfix-2.0.13-1.9asp.src.rpm
в /usr/src/asplinux/SPECS/postfix.spec меняю
%define LDAP 0
%define MYSQL 1
на
%define LDAP 1
%define MYSQL 0
Отключая, поддержку MySQL за ненадобностью. Теперь сама сборка:
$ rpmbuild -bb --clean postfix.spec
И устанавливаю сам пакет postfix (необходимо аккуратно разрешить
конфликты с sendmail, удалив его)
$ rpm -Uhv /usr/src/asplinux/RPMS/i386/postfix-2.0.13-1.9asp.i386.rpm
Теперь вся работа будет происходить в каталоге /etc/postfix
Конфигурационный файл почтового сервера: main.cf
begin main.cf # Информация о локальных путях
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
# Владелей процесса и очерееди сообщений
mail_owner = postfix
# Имя машины, с почтовой системой
myhostname = smtp.karavay-shops.ru
# Имя домена, в котором находится почтовая система
mydomain = karavay-shops.ru
# Имя домена, которое будет подставляться к имени пользователя, если домен
# не задан
myorigin = $mydomain
# Почтовые интерфейсы, с которых система будет получать почту. По
# умолчанию все (all), что не безопасно, ибо тогда система будет открыта
# снаружи (возможен open relay). IP-адреса интерфейсов определяются при
# помощи DNS
inet_interfaces = $myhostname, localhost
# Здесь появляется первый запрос к LDAP. Он оформляется как имя
# параметра, затем, после "=" - ключевое слово "ldap" (определяет способ
# хранения - также могут быть "hash", "mysql", "dbm" и др.), после
# двоеточия - уникальное имя запроса - в данном случае "mydestination".
# Затем весь запрос описывается с помощью этого имени в виде
# "имязапроса_имя_параметра"
# Список доменов, для которых система считает себя пунктом назначения и
# будет отправлять почту предназначенную для этих доменов черз транспорт
# local
mydestination = ldap:mydestination
# адрес LDAP-сервера, т.е. он может быть не обязательно на машине с
# postfix
mydestination_server_host = 127.0.0.1
# Таймаут запроса
mydestination_timeout = 10
# каталог внутри которого осуществляется поиск
mydestination_search_base = ou=transports,ou=mail,dc=karavay-shops,dc=ru
# Фильтр поиска. "%s" - искомый элемент, однозначно определяющий объект
# запроса
mydestination_query_filter = (&(objectClass=mailDomainTransport)(mailTransport=local)(mailDomain=%s))
# Какой атрибут объекта нужен в результате запроса
mydestination_result_attribute = mailDomain
# Уровень поиска: one - только один уровень, sub - включая вложенные
# каталоги
mydestination_scope = one
# От имени какого объекта выполнять запрос (вот они - ACL)
mydestination_bind_dn = cn=postfix,ou=services,dc=karavay-shops,dc=ru
# Пароль, подтверждающий идентификацию
mydestination_bind_pw = postfixpass
# Принимать почту только для пользователей, перечисленных в нижестоящих
# ресурсах. proxy:unix:passwd.byname- указывает, что нужно искать
# пользователей в файле passwd через proxy-демон, который позволяет
# видеть файлы, которые недоступны почтовому демону, запущенному
# chroot-окружении (для безопасности)
local_recipient_maps = proxy:unix:passwd.byname $alias_maps ldap:uidsearch ldap:valias
# В ответ на передачу информации для других (неопределенных)
# пользователей посылать ошибку со следующим номером
unknown_local_recipient_reject_code = 550
# Принимать почту к отправке только от следующих машин (дополнительная защита
от open relay)
# Стиль описания группы машин: subnet - доверять машинам своей
# IP-подсети, class - доверять машинам из сетей такого же класса, что и
# сервер (опасно при dial-up - сервер будет доверять машинам подсети
# провайдера), host - сервер доверяет только себе
# mynetworks_style = subnet
# В противном случае список машин "для доверия" можно задать отдельно
mynetworks = ldap:mynetworks
mynetworks_server_host = 127.0.0.1
mynetworks_timeout = 10
mynetworks_search_base = ou=DNS,dc=karavay-shops,dc=ru
# Здесь видна реальная польза от LDAP - список машин не создается
# отдельно а берется из базы DNS
mynetworks_query_filter = (&(objectClass=dNSZone)(aRecord=%s))
mynetworks_result_attribute = aRecord
# Поиск по всем вложенным каталогам базы
mynetworks_scope = sub
mynetworks_bind_dn = cn=postfix,ou=services,dc=karavay-shops,dc=ru
mynetworks_bind_pw = postfixpass
# Ограничение на размер одного сообщения в байтах
message_size_limit = 10240000
# Ограничение на размер почтового ящика по умолчанию в байтах
mailbox_size_limit = 20480000
# Таблицы перезаписи позволяют подменять почтовые адреса в сообщениях.
# Подмена будет полной, т.е. в заголовках писем одни адреса будут
# подменены на другие, без сохранения старых. canonical_maps будет
# производить подмену как в получателях, так и в отправителях. Также
# возможны sender_canonical_maps для подмены отправителя и
# recipient_canonical_maps для подмены получателя.
# В данном случае я подменяю всю почтовые адреса локальных
# пользователей, зарегистрированных на linux-машине, на их виртуальные
# почтовые адреса
canonical_maps = ldap:mailcnange
mailcnange_server_host = 127.0.0.1
mailcnange_timeout = 10
mailcnange_search_base = ou=users,dc=karavay-shops,dc=ru
mailcnange_query_filter = (&(objectClass=mailAccount)(uid=%s)(mailAccess=enable))
mailcnange_result_attribute = mailForward
mailcnange_scope = one
mailcnange_bind_dn = cn=postfix,ou=services,dc=karavay-shops,dc=ru
mailcnange_bind_pw = goldstar
# Ниже опции, касающиеся виртуальных адресов:
# Таблица виртуальных псевдонимов - почта предназначенная для псевдонима
# будет пересылаться реальному виртуальному пользователю ;)
virtual_alias_maps = ldap:valias
# Путь к каталогу в котором будут располагаться ящики виртуальных
# пользователей. Хотелось бы и его брать из LDAP но текущая версия
# postfix этого не позволяет
virtual_mailbox_base = /var/spool/mail
# Относительный путь до ящика конкретного пользователя (если путь до
# ящика заканчивается на "/", то это не mailbox, а maildir (почтовая
# директория - каждое сообщение - отдельный файл)
virtual_mailbox_maps = ldap:filesearch
# Список доменов, почта к которым будет доставляться через транспорт
# virtual
virtual_mailbox_domains = ldap:vdsearch
# Минимальный uid пользователя, который будет принят к возврату из
# списка virtual_uid_maps, возвращенный uid меньше этого значения не
# будет допущен к отправке
virtual_minimum_uid = 500
# UID виртуального пользователя, для допуска к его почтовому ящику
virtual_uid_maps = ldap:uidsearch
# GID виртуального пользователя, для допуска к его почтовому ящику
virtual_gid_maps = ldap:gidsearch
# Квота на почтовый ящик виртуальных пользователей по умолчанию
virtual_mailbox_limit = 2048000000
# Разрешить перекрытие параметра virtual_mailbox_limit
virtual_mailbox_limit_override = yes
# Определение квоты для ящика конкретного пользователя
virtual_mailbox_limit_maps = ldap:quotasearch
# Ограничивать квотой только ящики INBOX (для IMAP пользователей)
virtual_mailbox_limit_inbox = no
# Использовать файлы данных, совместимые с Courier IMAP
virtual_maildir_extended = yes
# Сообщение при превышении квот
# virtual_maildir_limit_message = "Sorry, the user's maildir has overdrawn his
diskspace quota, please try again later."
# Суффикс, указывающую на Maildir директорию (зачем? не понятно)
virtual_maildir_suffix =
# Создавать файлы размеров почтовых директорий (для управления ими)
virtual_create_maildirsize = yes
# Сами запросы к LDAP
valias_server_host = 127.0.0.1
valias_timeout = 10
valias_search_base = ou=users,dc=karavay-shops,dc=ru
valias_query_filter = (&(mailAlias=%s)(mailAccess=enable))
valias_result_attribute = mailForward
valias_scope = sub
valias_bind_dn = cn=postfix,ou=services,dc=karavay-shops,dc=ru
valias_bind_pw = goldstar
filesearch_server_host = 127.0.0.1
filesearch_timeout = 10
filesearch_search_base = ou=users,dc=karavay-shops,dc=ru
filesearch_query_filter = (&(objectClass=mailAccount)(mail=%s)(mailAccess=enable))
filesearch_result_attribute = mailBox
filesearch_scope = sub
filesearch_bind_dn = cn=postfix,ou=services,dc=karavay-shops,dc=ru
filesearch_bind_pw = goldstar
vdsearch_server_host = 127.0.0.1
vdsearch_timeout = 10
vdsearch_search_base = ou=transports,ou=mail,dc=karavay-shops,dc=ru
vdsearch_query_filter = (&(objectClass=mailDomainTransport)(mailTransport=virtual)(mailDomain=%s))
vdsearch_result_attribute = mailDomain
vdsearch_scope = one
vdsearch_bind_dn = cn=postfix,ou=services,dc=karavay-shops,dc=ru
vdsearch_bind_pw = goldstar
uidsearch_server_host = 127.0.0.1
uidsearch_timeout = 10
uidsearch_search_base = ou=users,dc=karavay-shops,dc=ru
uidsearch_query_filter = (&(objectClass=mailAccount)(mail=%s)(mailAccess=enable))
uidsearch_result_attribute = uidNumber
uidsearch_scope = sub
uidsearch_bind_dn = cn=postfix,ou=services,dc=karavay-shops,dc=ru
uidsearch_bind_pw = goldstar
gidsearch_server_host = 127.0.0.1
gidsearch_timeout = 10
gidsearch_search_base = ou=users,dc=karavay-shops,dc=ru
gidsearch_query_filter = (&(objectClass=mailAccount)(mail=%s)(mailAccess=enable))
gidsearch_result_attribute = gidNumber
gidsearch_scope = sub
gidsearch_bind_dn = cn=postfix,ou=services,dc=karavay-shops,dc=ru
gidsearch_bind_pw = goldstar
quotasearch_server_host = 127.0.0.1
quotasearch_timeout = 10
quotasearch_search_base = ou=users,dc=karavay-shops,dc=ru
quotasearch_query_filter = (&(objectClass=mailAccount)(mail=%s)(mailAccess=enable))
quotasearch_result_attribute = mailQuota
quotasearch_scope = sub
quotasearch_bind_dn = cn=postfix,ou=services,dc=karavay-shops,dc=ru
quotasearch_bind_pw = goldstar
# Определяет таблицу транспортов, отвечающих за тот или иной домен. В
# конце добавлена таблица, определяющая внешний транспорт - внешний
# smtp-сервер, сервер, на который будет отправлена почта, не
# определившаяся ни к локальной ни к виртуальной доставке
transport_maps = ldap:transport, hash:/etc/postfix/transport
transport_server_host = 127.0.0.1
transport_timeout = 10
transport_search_base = ou=transports,ou=mail,dc=karavay-shops,dc=ru
transport_query_filter = (&(objectClass=mailDomainTransport)(mailDomain=%s))
transport_result_attribute = mailTransport
transport_scope = one
transport_bind_dn = cn=postfix,ou=services,dc=karavay-shops,dc=ru
transport_bind_pw = goldstar
# Таблицы псевдонимов: почта направленная к псевдониму должна быть
# перенаправлена на существующего пользователя (без замены заголовков, в
# отличие от табиц перезаписи
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
# Определяет систему через которую будет производится фильтрация почты
# по содержимому, эта система должна быть описана в master.cf
# content_filter = smtp-amavis:[127.0.0.1]:10024
# Иногда бывает необходимо переназначить строку приветствия сервера
# Отвечает за строку, которая указывается в заголовках письма - как сервер
# пересылающий почту
# mail_name = MSExchange
# Отвечает за показываемую версию сервера
# mail_version = 0.1
# Можно сформировать свое приветствие, показываемое, например, при
# подсоединении к серверу через telnet
# smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
# Управление отладкой (я не трогал)
debug_peer_level = 1
debug_peer_list = 127.0.0.1 192.168.2.254
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
xxgdb $daemon_directory/$process_name $process_id & sleep 5
# Пост-установочная конфигурационная информация
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.0.13/samples
readme_directory = /usr/share/doc/postfix-2.0.13/README_FILES
end main.cf Теперь необходимо создать файл transport следующего содержания:
begin transport * smtp:mail.ptlan.com
end transport Создать его hash-файл
$ /usr/sbin/postmap transport
Необходимо также построить таблицу псевдонимов - внести нужные
изменения в alias. Там строки типа: "алиас: получатель", определяющие
если почта пришла к пользователю (часто несуществующему) "алиас", то
перенаправить ее на "получатель". Затем,
$ /usr/sbin/postalias alias
Теперь можно запустить (или перезапустить) почтовый сервер:
$ /sbin/service postfix restart
Проверяю работоспособность:
$ cat anything.txt | mail -s "test" koal
В /var/log/maillog должно появиться
Mar 5 16:42:32 bridge postfix/virtual[29988]: 2E933386A: to=<Kolotov.Alexan***@m*****.com>,
relay=virtual, delay=7, status=sent (maildir)
или еще одна проверка:
$ telnet bridge 25
Trying 192.168.2.254...
Connected to bridge.
Escape character is '^]'.
220 smtp.karavay-shops.ru ESMTP Postfix
helo localhost
250 smtp.karavay-shops.ru
mail from: koal
250 Ok
rcpt to: tany@m*****.com
250 Ok
data
354 End data with <CR><LF>.<CR><LF>
superpupermegatest
.
250 Ok: queued as 44919386A
quit
221 Bye
Connection closed by foreign host.
Следующий на очереди Courier IMAP.
C уважением, Kolotov Alexandr aka mr. Эбола
отвечать: akmypo***@m*****.ru
ICQ: 100349254
| Registered Linux user # 236664 |
-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.kirovlug-list@subscribe.ru
Отписаться: mailto:comp.soft.linux.kirovlug--unsub@subscribe.ru
http://subscribe.ru/ mailto:ask@subscribe.ru