главная - Статьи - Почта - Postfix + Dovecot + MySQL
Настройка Postfix
Дата обновления: 12.08.2021Теги: Postfix Почтовый сервер Linux
Postfix стоит "на передовой" вашего почтового сервера. Именно он решает, что делать с почтой, которая попала к нему - Postfix может отдать ее на сохранение на локальной машине, переслать ее дальше или просто отбросить. Как правило, Postfix настраивается в связке с IMAP/POP сервером (например, Dovecot) и базой данных для хранения настроек, паролей пользователей и пр. (например, MySQL). В данном руководстве описывается настройка Postfix с прицелом именно на совместную работу с Dovecot и MySQL.
Итак, мы находимся в середине пути к успеху:
- (уже сделали!) MySQL - нам надо сразу сделать хранилище настроек, т.к. и Postfix и Dovecot будут "завязаны" на базу данных.
- (тоже сделали!) PostfixAdmin - аналогично, сразу создаем инструмент управления базой данных, проверяем, что пользователи добавляются и пр.
- Postfix - ставим MTA (Mail Transfer Agent) Postfix.
- (скоро будет делать) Dovecot - финал - хранение почты, авторизация и пр.
- (а может, и не будет делать вовсе) Только после этого можно думать про антивирусы, веб-интерфейсы типа Roundcube Mail.
Например, Postfix может не отправлять письма, особенно при условии авторизации для отправки через Dovecot. И еще много разных вариантов. Поэтому рекомендую отключить SELinux на время настройки.
Делается это разными способами:
- Временное отключение (до перезагрузки):
# setenforce 0
или
# echo 0 > /selinux/enforce
- Выключить насовсем - в файле
/etc/selinux/config
изменить параметр:SELINUX=disabled
Перезагрузить компьютер.
Установка Postfix
В данном случае речь пойдет о настройке Postfix версии 2.6.6, установленного из rpm в CentOS.
Установка сводится к одной команде:
> yum install postfix
Установка закончена, но настройка будет более интересной!
На всякий случай проверяем, поддерживает ли наш Postfix базы данных MySQL:
> postconf -m | grep mysql
mysql
Подготовительные действия
Создаем пользователя vmail (user id 5000) и группу vmail (group id 5000). Этот пользователь будет владельцем каталога почты /var/vmail.
> groupadd -g 5000 vmail
> useradd -g vmail -u 5000 vmail -d /home/vmail -m
Создаем каталог /var/vmail:
> mkdir /var/vmail
> chown -R vmail:vmail /var/vmail
Права 777 нужны на этапе отладки:
> chmod -R 777 /var/vmail
Подготовка сделана, можно переходить непосредственно к настройке. Основные настройки Postfix хранятся в двух файлах "/etc/postfix/main.cf
" и "/etc/postfix/master.cf
".
/etc/postfix/main.cf
Как правило, после установки главный файл настроек Postfix находится по адресу:
/etc/postfix/main.cf
Сделаем копию исходного файла конфигурации Postfix:
> cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
Думаю, будут удобнее сразу привести работающий пример этого файла.
Красным цветом я выделил то, над чем мне пришлось подумать.
Серым цветом выделил то, что как правило, уже есть в конфиге, либо не заставило меня ломать голову.
### Config ### Common config queue_directory = /var/spool/postfix command_directory = /usr/sbin daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix myhostname = centos6.virtual.local mydomain = virtual.local inet_interfaces = all inet_protocols = ipv4 mydestination = $myhostname, localhost.$mydomain, localhost, localhost.localdomain unknown_local_recipient_reject_code = 550 mynetworks = 127.0.0.0/8 #in_flow_delay = 1s alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases local_recipient_maps = $virtual_mailbox_maps, $virtual_alias_maps home_mailbox = Maildir/ mail_spool_directory = /var/spool/mail smtpd_banner = $myhostname ESMTP $mail_name debug_peer_level = 2 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $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 # The mail_owner parameter specifies the owner of the Postfix queue # and of most Postfix daemon processes. Specify the name of a user # account THAT DOES NOT SHARE ITS USER OR GROUP ID WITH OTHER ACCOUNTS # AND THAT OWNS NO OTHER FILES OR PROCESSES ON THE SYSTEM. In # particular, don't specify nobody or daemon. PLEASE USE A DEDICATED # USER. # mail_owner = postfix # setgid_group: The group for mail submission and queue management # commands. This must be a group name with a numerical group ID that # is not shared with other accounts, not even with the Postfix account. # setgid_group = postdrop html_directory = no manpage_directory = /usr/share/man sample_directory = /usr/share/doc/postfix-2.6.6/samples readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES virtual_transport = dovecot dovecot_destination_recipient_limit=1 ### Auth smtpd_sasl_auth_enable=yes broken_sasl_auth_clients = yes smtpd_sasl_security_options = noanonymous smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth # см. конфиг Dovecot ### Relay Domains: #relay_domains = mysql:/etc/postfix/sql/mysql_relay_domains.cf ### Virtual Domains: virtual_mailbox_base = /var/vmail virtual_mailbox_domains = mysql:/etc/postfix/sql/virtual_mailbox_domains.cf virtual_alias_maps = mysql:/etc/postfix/sql/virtual_alias_maps.cf virtual_mailbox_maps = mysql:/etc/postfix/sql/virtual_mailbox_maps.cf virtual_minimum_uid = 5000 virtual_minimum_gid = 5000 virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 ### Quotas # Квоты пока не проверял #virtual_create_maildirsize = yes #virtual_mailbox_extended = yes #virtual_mailbox_limit_maps = mysql:/etc/postfix/sql/mysql_virtual_mailbox_limit_maps.cf #virtual_mailbox_limit_override = yes #virtual_maildir_limit_message = "Sorry, the user's maildir has overdrawn his diskspace quota." #virtual_overquota_bounce = yes ### Restrictions smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unknown_reverse_client_hostname, permit smtpd_helo_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, reject_unknown_helo_hostname, permit smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_sender, reject_unknown_sender_domain, reject smtpd_recipient_restrictions = reject_non_fqdn_recipient, reject_unknown_recipient_domain, permit_sasl_authenticated, reject_unlisted_recipient, permit_mynetworks, reject_unauth_destination, reject smtpd_data_restrictions = permit_mynetworks, reject_unauth_pipelining, reject_multi_recipient_bounce, permit smtpd_etrn_restrictions = reject smtpd_helo_required = yes #strict_rfc821_envelopes = yes smtpd_discard_ehlo_keywords = etrn, silent-discard smtpd_forbidden_commands = CONNECT GET POST disable_vrfy_command = yes ### TLS smtpd_use_tls = yes smtpd_tls_cert_file = /etc/pki/dovecot/certs/dovecot.pem smtpd_tls_key_file = /etc/pki/dovecot/private/dovecot.pem smtp_tls_security_level=may smtpd_tls_mandatory_protocols=TLSv1, TLSv1.1, TLSv1.2, !SSLv2, !SSLv3 smtpd_tls_auth_only = yes smtp_tls_loglevel = 1 smtpd_tls_loglevel = 1 ### Secure headers # Погуглите на эту тему - интересно! #header_checks = regexp:/etc/postfix/header_checks
Вот он какой, здоровый, черт... Но по сути своей, здесь все не так сложно.
Давайте посмотрим описание настроек Postfix в конфигурационном файле.
Секция Config
В этой секции задаются пути до файлов конфигураций, переменные, имя пользователя, от которого запускается Postfix и пр. Как правило, содержимое этой секции задается по-умолчанию (раскидано по дефолтному конфигу) и не требует серьезной доработки. Эти параметры зависят от дистрибутива, если вы ставите из бинарника (например, rpm), от параметров при сборке из исходников и др.
Секция Auth
Здесь задаются параметры авторизации пользователей для отправки почты. Это обязательно, если у вас не локальный почтовый сервер и вы не собираетесь бесплатно рассылать спам!
- smtpd_sasl_security_options = noanonymous # не разрешаем никому отправлять почту с нашего сервера без авторизации!
- broken_sasl_auth_clients = yes # включаем поддержку "устаревших" почтовых клиентов, не поддерживающих RFC 2222.
- smtpd_sasl_type = dovecot # за авторизацию будет отвечать dovecot
- smtpd_sasl_path = private/auth # указывается относительный путь до сокета, для передачи функций аутентификации пользователей от Postfix серверу Dovecot. Полный путь до сокета складывается из пути до директории очереди Postfix + "private/auth" = "/var/spool/postfix" + "private/auth" = "/var/spool/postfix/private/auth".
Секция Relay Domains
"Домены для пересылки". Это самая короткая секция. Здесь указываются те домены, почту которых наш сервер будет стараться переслать дальше соответственно старшинству MX записей для этого домена. Например, это может быть использовано при создании резервного сервера.
- relay_domains = mysql:/etc/postfix/sql/mysql_relay_domains.cf
Секция Virtual Domains
Одна из ключевых секций конфигурации Postfix. В этой секции указывается, где брать информацию об учетных записях в виртуальных доменах, где хранится почта и пр.
- virtual_mailbox_base указывает, где хранится почта (физическое расположение на сервере).
- virtual_mailbox_domains перечисляет виртуальные домены, которые может обслуживать этот сервер.
Содержимое файла/etc/postfix/sql/virtual_mailbox_domains.cf
:user = postfix
password = pass_FROM_postfix_user
hosts = localhost
dbname = mail
query = SELECT domain FROM domain WHERE domain='%s' AND transport <> 'relay' AND active = '1' - virtual_alias_maps - (мое толкование директивы virtual alias maps) Postfix ищет все алиасы (псевдонимы), куда можно отправить письмо. Если у одного пользователя есть несколько псевдонимов, то письмо будет отправлено по каждому псевдониму (alias).
Содержимое файла/etc/postfix/sql/virtual_alias_maps.cf
:
user = postfix
password = pass_FROM_postfix_user
hosts = localhost
dbname = mail
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'Небольшой экскурс: таблица "alias" в базе "mail" создается командой:
CREATE TABLE IF NOT EXISTS `alias` (
`address` varchar(255) NOT NULL,
`goto` text NOT NULL,
`domain` varchar(255) NOT NULL,
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`address`),
KEY `domain` (`domain`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Virtual Aliases';
и каждому полю "address" соответствует минимум один алиас (судя по дапму базы данных). По-умолчанию, значение "alias" равно значению "address". Я не видел ни одной записи в базе, в которой поле goto было бы пустым. - virtual_mailbox_maps
Разрешенные адреса получателей указаны в параметре virtual_mailbox_maps. SMTP сервер Postfix отклоняет недопустимые адреса получателей с сообщением "User unknown in virtual mailbox table" (Пользователь неизвестен в таблице виртуальных почтовых ящиков). Если параметр virtual_mailbox_maps пуст, то Postfix принимает адреса получателей, принадлежащие доменам из $virtual_mailbox_domains.
Содержимое файла/etc/postfix/sql/virtual_mailbox_maps.cf
:user = postfix
password = pass_FROM_postfix_user
hosts = localhost
dbname = mail
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1' - virtual_minimum_uid
По умолчанию владелец почтового ящика не может иметь UID меньше 5000. Это сделано для предотвращения возможности записи в файловую систему с правами системных учетных записей. Это значение можно изменить с помощью vrtual_minimum_uid. - virtual_uid_maps и virtual_gid_maps
Пользователи виртуальных доменов на то и виртуальные, они не могут что-то записать/удалить на жестком диске сервера. Чтобы сервер знал, от имени кого записывать файлы почты, существуют параметры virtual_uid_maps и virtual_gid_maps. Они указывают UID (user id) и GID (group id) пользователя из файла /etc/passwd, с правами которого будут записаны файлы почты.
Секция Quotas
Ограничения на размер почтового ящика и др.
- virtual_create_maildirsize
- virtual_mailbox_extended
- virtual_mailbox_limit_maps
- virtual_mailbox_limit_override
- virtual_maildir_limit_message - сообщение о превышении квоты.
- virtual_overquota_bounce - посылать или нет сообщение пользователю о превышении квоты.
Секция Restrictions
Дополнительно предлагаю ознакомиться с настройками ограничений Postfix (в новом окне).
Мы же не хотим, чтобы мы погрязли в спаме?
- smtpd_sender_restrictions - проверка адреса отправителя (т.е. проверяются те, кто пытается отправить письмо на наш сервер).
permit_mynetworks - разрешаем отправлять нам из нашей же сети (логично)
permit_sasl_authenticated - разрешаем отправлять тем, кто прошел проверку паролем (если виртуальный домен один, это означает, что один коллега шлет письма другому коллеге. На серверах с большим количеством доменов возможны ситуации, когда два незнакомых человека в разных доменах обслуживаются нашим почтовым сервером)
reject_non_fqdn_sender, reject_unknown_sender_domain - неправильные и несуществующие домены отвергаем - скорее всего, это спам или неправильно сконфигурированный почтовый сервер отправителя.
permit - почту от всех остальных все-таки принимаем! В эту категорию войдут все нормальные люди. Можете проверить, поставьтеreject
и попробуйте написать письмо на этот сервер с другого сервера. Вы должны будете получить сообщение об ошибке доставки.
- smtpd_recipient_restrictions - для кого можно принимать почту.
reject_non_fqdn_recipient - нельзя принимать почту для неправильных доменов
reject_unknown_recipient_domain - нельзя принимать почту для несуществующих доменов
permit_sasl_authenticated - можно принимать почту для авторизовавшихся
reject_unlisted_recipient -
permit_mynetworks - можно принимать почту для тех, кто из нашей сети
reject_unauth_destination -
permit_auth_destination -
reject
Секция TLS
Шифрование сеансов связи с сервером от атак Man-in-the-Middle, от перехвата пароля... В настоящее время уже необходимость, нежели чрезмерность. Практически все крупные бесплатные почтовые системы реализовали TLS или SSL. А мы чем хуже?
Секция Secure headers
Не обязательная, но - полезная секция. Например, можно удалить информацию об IP-адресе в локальной сети, если таковая фигурирует в отправленных письмах, или о том, какой почтовый клиент вы используете (X-Mailer).
Настраиваем /etc/postfix/master.cf
Сейчас мы будем переходить к настройке Dovecot, поэтому сразу пропишем в конфиге Postfix, что Dovecot отвечает за локальную доставку почты.
Редактируем /etc/postfix/master.cf.
В конец файла /etc/postfix/master.cf добавляем две строки:
dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -d $(recipient)
Перед flags два пробела! Это очень важно. Работать иначе не будет.
Дополнительная информация
Переходим к настройке Dovecot...
Авторизуйтесь для добавления комментариев!