Настройка почтового сервера Postfix + Dovecot + MySQL на CentOS 4.5
Введение
В этом руководстве описан полный процесс настройки почтового сервера, где Postfix отвечает за SMTP, Dovecot — за IMAP и POP3, а информация о пользователях и доменах хранится в MySQL. Подходит для развёртывания в провайдерских или корпоративных средах с виртуальными пользователями (без системных учётных записей для каждого почтового ящика).
Целевая версия ОС: CentOS 4.5 (инструкции отражают нюансы старых пакетов и репозиториев). При использовании более новых версий пакетов возможны отличия в путях и опциях конфигурации.
Important: Перед началом убедитесь, что у вас есть доступ root и резервные копии текущих конфигураций.
Структура руководства
- Предварительные требования
- Установка пакетов
- Настройка SMTP-AUTH и TLS
- Создание базы данных MySQL и таблиц для виртуальных доменов/пользователей
- Конфигурация Postfix с доступом к MySQL
- Конфигурация Dovecot для виртуальных пользователей
- Настройка веб‑интерфейса (SquirrelMail) и phpMyAdmin
- Запуск сервисов, тестирование и отладка
- Рекомендации по безопасности, миграции и эксплуатационному обслуживанию
- Чек‑листы и критерии приёмки
Предварительные требования
- Настройте hostname и IP: пример в руководстве использует cnode1.rnd.pk → 172.16.4.80 (eth0). Вы можете назначить свои значения.
- Создайте алиас интерфейса eth0:0 с адресом 172.16.4.81 (можно выбрать другие адреса).
- Добавьте соответствующие записи в /etc/hosts. Пример файла /etc/hosts:
127.0.0.1 localhost.localdomain localhost
172.16.4.80 cnode1.rnd cnode1
172.16.4.81 mail.rnd mailNote: Для корректной работы SMTP/HELO лучше, чтобы myhostname совпадал с PTR-записью или был корректно сопоставлен DNS.
Установка необходимых пакетов
Требуемые компоненты: dovecot (с поддержкой БД), postfix (с поддержкой MySQL), mysql-server и squirrelmail.
- Установка dovecot. Внимание: при установке postfix раньше dovecot могут возникнуть конфликты пакетов. Устанавливайте dovecot первым.
yum install -y dovecot Это установит dovecot вместе с зависимостями (включая клиента MySQL и/или PostgreSQL при наличии в репозиториях).
- Установка postfix с поддержкой mysql и mysql-server из centosplus репозитория:
yum --enablerepo=centosplus install postfix mysql-server- Установка веб‑клиента SquirrelMail:
yum install -y squirrelmail После установки переходим к конфигурации.
Настройка SMTP-AUTH и TLS для Postfix
Сначала настроим параметры SASL для smtpd. Отредактируйте файл /usr/lib/sasl2/smtpd.conf:
vi /usr/lib/sasl2/smtpd.conf Содержимое должно быть примерно таким:
pwcheck_method: saslauthd
mech_list: plain loginДалее создайте каталог для сертификатов и закройте на него доступ:
mkdir -p /etc/ssl/mycompany/mailserver/
cd /etc/ssl/mycompany/mailserver/ Сгенерируйте закрытый ключ, запрос и самоподписанный сертификат:
openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024
chmod 600 smtpd.key
openssl req -new -key smtpd.key -out smtpd.csr
openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt
openssl rsa -in smtpd.key -out smtpd.key.unencrypted
mv -f smtpd.key.unencrypted smtpd.key
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650 Private keys и сертификаты созданы. Позже укажем Postfix использовать эти файлы.
Important: Для боевого сервера предпочтительнее использовать сертификат от доверенного центра сертификации (CA), а не самоподписанный.
MySQL: создание базы и таблиц для виртуальной почты
Установим пароль для root и создадим базу mail и пользователя mail с нужными правами.
Установка пароля root:
mysqladmin -u root password newpassword Замените newpassword на надёжный пароль.
Подключаемся к MySQL:
mysql -u root -p Внутри MySQL создаём базу и пользователя:
CREATE DATABASE mail;
GRANT ALL PRIVILEGES ON mail.* TO 'mail'@'localhost' IDENTIFIED BY 'mail';
FLUSH PRIVILEGES;
quitУстановим пароль для пользователя mail (опционально, если нужно изменить):
msqladmin -u mail password newpassword Затем подключаемся от имени mail и создаём таблицы domain, mailbox и alias. Примеры SQL ниже (выполняйте в mysql>):
mysql -u mail -p
show databases;
USE mail;- Таблица доменов:
CREATE TABLE domain (
domain varchar(255) NOT NULL default '',
description varchar(255) NOT NULL default '',
aliases int(10) NOT NULL default '0',
mailboxes int(10) NOT NULL default '0',
maxquota int(10) NOT NULL default '0',
transport varchar(255) default NULL,
backupmx tinyint(1) NOT NULL default '0',
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 (domain),
KEY domain (domain)
) TYPE=MyISAM COMMENT=' Virtual Domains';- Таблица почтовых ящиков:
CREATE TABLE mailbox (
username varchar(255) NOT NULL default '',
password varchar(255) NOT NULL default '',
name varchar(255) NOT NULL default '',
maildir varchar(255) NOT NULL default '',
quota int(10) NOT NULL default '0',
domain varchar(255) NOT NULL default '',
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 (username),
KEY username (username)
) TYPE=MyISAM COMMENT='Virtual Mailboxes';- Таблица алиасов:
CREATE TABLE alias (
address varchar(255) NOT NULL default '',
goto text NOT NULL,
domain varchar(255) NOT NULL default '',
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 address (address)
) TYPE=MyISAM COMMENT='Virtual Aliases';После создания таблиц выйдите из mysql:
quit Notes: В новых установках рекомендуется использовать InnoDB и корректные схемы кодировок (utf8/utf8mb4). В этом руководстве используется MyISAM, как в оригинале для CentOS 4.5.
Postfix: интеграция с MySQL
Postfix будет делать SQL‑запросы для определения доменов, ящиков, алиасов и квот. Создайте файлы конфигурации в /etc/postfix, содержащие параметры подключения к базе данных.
- Файл для алиасов (перенаправления):
vi /etc/postfix/mysql_virtual_alias_maps.cf Содержимое:
user = mail
password = mail
hosts = localhost
dbname = mail
table = alias
select_field = goto
where_field = address
additional_conditions = and active = '1'
#query = SELECT goto FROM alias WHERE address='%s' AND active = '1'- Файл для виртуальных доменов:
vi /etc/postfix/mysql_virtual_domains_maps.cf Содержимое:
user = mail
password = mail
hosts = localhost
dbname = mail
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'
#query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'- Файл для отображения письма на физическую директорию ящика:
vi /etc/postfix/mysql_virtual_mailbox_maps.cf Содержимое:
user = mail
password = mail
hosts = localhost
dbname = mail
table = mailbox
select_field = CONCAT(domain,'/',maildir)
where_field = username
additional_conditions = and active = '1'
#query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'- Файл для отображения квот:
vi /etc/postfix/mysql_virtual_mailbox_limit_maps.cf Содержимое:
user = mail
password = mail
hosts = localhost
dbname = mail
table = mailbox
select_field = quota
where_field = username
additional_conditions = and active = '1'
#query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'Важно: права доступа к файлам /etc/postfix/*.cf должны быть ограничены (root только), чтобы защитить пароли базы данных.
Основная конфигурация Postfix (main.cf)
Сделайте резервную копию и создайте новый main.cf:
mv /etc/postfix/main.cf /etc/postfix/main.cf.orig
vi /etc/postfix/main.cf Пример содержимого (переведённая и адаптированная версия оригинальной конфигурации):
############## Postfix###############
smtpd_banner = $myhostname
biff = no
append_dot_mydomain = no
relayhost =
mynetworks = 172.16.4.81
inet_interfaces = 172.16.4.81
mailbox_size_limit = 0
recipient_delimiter = +
alias_database = hash:/etc/postfix/aliases
alias_maps = $alias_database
myhostname = cnode1.rnd
mydomain = rnd
myorigin = $myhostname
mydestination = $myhostname, localhost.$mydomain, $transport_maps
mail_spool_directory = /var/spool/mail
debug_peer_level = 2
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
xxgdb $daemon_directory/$process_name $process_id & sleep 5
disable_vrfy_command = no
readme_directory = /usr/share/doc/postfix-2.2.10/README_FILES
sample_directory = /usr/share/doc/postfix-2.2.10/samples
sendmail_path = /usr/sbin/sendmail
html_directory = no
setgid_group = postdrop
command_directory = /usr/sbin
manpage_directory = /usr/share/man
daemon_directory = /usr/libexec/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
queue_directory = /var/spool/postfix
mail_owner = postfix
unknown_local_recipient_reject_code = 450
####################postfix section ends here###############Параметры в секции выше следует адаптировать под вашу сеть и требования. Например, mynetworks и inet_interfaces — это IP‑адреса хоста/интерфейсов, с которых разрешена пересылка.
Поддержка виртуальных пользователей в Postfix
Создайте системного пользователя для виртуальных почтовых ящиков и задайте права на директорию /var/vmail:
useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c “Virtual mailbox” vmail
chmod 770 /var/vmail/
chown vmail:mail /var/vmail Добавьте в main.cf блок виртуальных настройок:
#######################Virtual Domains Users and mailboxes###############
virtual_mailbox_domains = mysql:$config_directory/mysql_virtual_domains_maps.cf
virtual_mailbox_base = /var/vmail
virtual_mailbox_maps = mysql:$config_directory/mysql_virtual_mailbox_maps.cf
virtual_alias_maps = mysql:$config_directory/mysql_virtual_alias_maps.cf
virtual_minimum_uid = 150
virtual_uid_maps = static:150
virtual_gid_maps = static:12
##############################Virtual section of main.cf ends##############Обратите внимание: UID/GID и директории должны соответствовать реальному пользователю vmail и группе mail на системе.
Включение SASL/TLS в Postfix
Отредактируйте main.cf и добавьте параметры для SASL и TLS. Обратите внимание на пути к сертификатам (в примере /etc/ssl/rnd/mailserver — обновите под своё расположение сертификатов):
vi /etc/postfix.main.cf Содержимое для включения SASL/TLS:
#################### SASL/TLS Authentication###########################
######SASL PART#########
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_local_domain =
smtpd_recipient_restriction = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
######TLS PART###########
smptpd_tls_cert_file = /etc/ssl/rnd/mailserver/smtpd.crt
smtpd_tls_key_file = /etc/ssl/rnd/mailserver/smtpd.key
smtpd_tls_CAfile = /etc/ssl/rnd/mailserver/cacert.pem
smtp_tls_auth_only = no
smtp_use_tls = yes
smtpd_use_tls = yes
smtpd_tls_received_header = no
smtp_tls_note_starttls_offer = yes
smtpd_tls_loglevel = 1
tls_random_source = dev:/dev/urandom
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_recieved_header = yes
###########################SASL/TLS Authentication ends here#############Внимание: в строчке smptpd_tls_cert_file есть опечатка smptpd — проверьте орфографию в вашей версии Postfix и используйте корректные параметры smtpd_tls_cert_file и smtpd_tls_key_file.
После изменений выполните:
cp /etc/aliases* /etc/postfix/
newaliases Конфигурация Dovecot для виртуальных пользователей
Создаём файл /etc/dovecot-mysql.conf для подключения аутентификации к БД:
vi /etc/dovecot-mysql.conf Пример содержимого:
######dove-mysql.conf should look like this##########
db_host = 127.0.0.1
db_port = 3306
db = mail
db_user = mail
db_passwd = mail
db_client_flags = 0
default_pass_scheme = PLAIN
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n' as mail, 150 AS uid, 12 AS gid, concat('dirsize:storage=',quota) AS quota FROM mailbox WHERE username ='%u' AND active ='1'
####################ends here####################Затем переименуем оригинальный конфиг dovecot и создадим новый /etc/dovecot.conf:
mv /etc/dovecot.conf /etc/dovecot.conf.orig
vi /etc/dovecot.conf Пример содержимого:
##############dovecot configured to work with virtual users############
base_dir = /var/run/dovecot/
protocols = imap pop3 imaps pop3s
imap_listen = [::]
pop3_listen = [::]
login_dir = /var/run/dovecot-login
login = imap
login = pop3
default_mail_env = mbox:/var/vmail/%d/%n
mbox_locks = fcntl
log_timestamp = "%Y-%m-%d %H:%M:%S "
log_path = /var/log/maillog
mail_extra_groups = mail
first_valid_uid = 150
last_valid_uid = 150
maildir_copy_with_hardlinks = yes
auth = mysql_auth
auth_userdb = mysql /etc/dovecot-mysql.conf
auth_passdb = mysql /etc/dovecot-mysql.conf
####################################ends here######################Ограничьте права доступа к конфигурационным файлам Dovecot и установите владельца:
chmod 600 /etc/dovecot/*.conf
chown vmail /etc/dovecot/*.conf Note: default_pass_scheme = PLAIN подразумевает, что пароли в таблице mailbox хранятся в виде plain text. Для безопасности храните пароли в хэшах (например, SHA256 или CRAM) и настраивайте соответствующий default_pass_scheme и SQL-запросы.
Настройка SquirrelMail (веб‑почта)
Перейдите в директорию конфигурации и запустите интерактивный конфигуратор:
cd /usr/share/squirrelmail/config/
/conf.pl Следуйте меню и укажите организационные данные, сервер IMAP и SMTP (например, mail.rnd:143 и mail.rnd:25). SquirrelMail создаст config.php, который используйте для веб‑доступа к почтовым ящикам.
Конфигурация HTTP (Apache) для SquirrelMail и phpMyAdmin
Добавьте виртуальный хост в /etc/httpd/conf/httpd.conf для доступа по имени:
vi /etc/httpd/conf/httpd.confДобавьте блок:
DocumentRoot /usr/share/squirrelmail
ServerName mail.rnd
phpMyAdmin можно установить из репозитория DAG (или другого доступного репозитория):
yum install -y phpmyadmin php-mysql По умолчанию phpMyAdmin доступен через /etc/httpd/conf.d/phpmyadmin.conf. Если нужно, создайте виртуальный хост:
DocumentRoot /usr/share/phpmyadmin
ServerName localhost.localdomin
После этого в браузере откройте http://127.0.0.1 или http://mail.rnd и войдите в SquirrelMail / phpMyAdmin.
Создание виртуальных доменов и пользователей в MySQL
Подключаемся как пользователь mail и вносим данные:
mysql -u mail -p
USE mail; Добавление домена:
INSERT INTO domain (domain,description,aliases,mailboxes,maxquota,transport,backupmx,active) VALUES ('mail.rnd','Virtual domain','10','10', '0','virtual', '0','1');Добавление пользователей:
INSERT INTO mailbox (username,password,name,maildir,quota,domain,active) VALUES ('[email protected]','mypassword', 'John Smith ','john/', '0','mail.rnd','1');
INSERT INTO mailbox (username,password,name,maildir,quota,domain,active) VALUES ('[email protected]','mypassword', 'Mike Tyson','mike/', '0','mail.rnd','1');
quit Important: Не храните реальные пароли в базе в открытом виде в продакшне. Используйте хэширование (например, CRYPT, MD5-CRYPT, SHA256-CRYPT) и настройте Dovecot на соответствующую схему паролей.
Запуск сервисов и автозапуск при загрузке
Сделаем сервисы автозапускаемыми и запустим их сейчас:
chkconfig –level 235 mysqld on
chkconfig –level 235 saslauthd on
chkconfig –level 235 postfix on
chkconfig –level 235 dovecot on
chkconfig –level 235 httpd on
/etc/init.d/saslauthd start
/etc/init.d/mysqld start
/etc/init.d/postfix start
/etc/init.d/dovecot start
/etc/init.d/httpd start После старта проверьте логи (/var/log/maillog, /var/log/messages, /var/log/httpd/error_log) для подтверждения успешного запуска.
Тестирование
- Откройте http://mail.rnd в браузере и войдите под [email protected] / mypassword.
- Отправьте письмо с одного виртуального ящика на другой и проверьте доставку и хранение в /var/vmail/
/ . - Проверьте отправку через SMTP с авторизацией (STARTTLS) и приём через IMAP/POP3 с TLS.
Troubleshooting — частые проблемы и как их решать
- Сертификат TLS не загружается: проверьте пути в main.cf, права доступа к файлам сертификатов, корректность формата PEM.
- SASL не аутентифицирует: убедитесь, что saslauthd запущен и настроен, что smtpd использует правильный pwcheck_method, и что /usr/lib/sasl2/smtpd.conf корректен.
- Postfix не видит виртуальные домены: проверьте доступ к /etc/postfix/mysql_virtual_domains_maps.cf и права доступа; выполните ручный SQL‑запрос от имени user mail.
- Dovecot не может авторизовать пользователя: проверьте password_query и user_query в /etc/dovecot-mysql.conf; попробуйте выполнить SQL‑запрос вручную.
- Почта не доставляется на локальный диск: проверьте права /var/vmail и соответствие uid/gid с virtual_uid_maps в main.cf.
Усиление безопасности (рекомендации)
- Используйте сертификаты от доверенных CA; избегайте самоподписанных сертификатов в производстве.
- Храните пароли в БД в хэшированном виде и настраивайте Dovecot с соответствующей схемой паролей.
- Ограничьте права на файлы конфигурации и файлы с паролями базы данных (600, root:vmail или root:root).
- Настройте брандмауэр (iptables/Firewalld) для разрешения только нужных портов (25, 465/587, 143/993, 110/995, 80/443) и IP‑фильтрацию для административного доступа.
- Включите журналирование и регулярный ротационный архив логов.
- Настройте backup/restore политики для базы данных и почтовых директорий.
Миграция и совместимость
- При переходе с этой схемы на более новую (Postfix/Dovecot в современных дистрибутивах) обратите внимание на смену путей конфигурации, форматов паролей и поддержку unix‑socket vs tcp для MySQL.
- Для миграции учётных записей извлекайте данные из таблицы mailbox и domain и применяйте преобразование паролей по необходимости.
Когда такой подход не подходит (counterexamples)
- Если вам нужно хранить почту в системных аккаунтах (каждому пользователю отдельная системная учётная запись), то схема виртуальных пользователей через MySQL избыточна.
- Если требуется высокая доступность и масштабирование на уровне десятков тысяч почтовых ящиков, имеет смысл рассмотреть специализированные решения и кластеризацию (например, использование имейл‑кластера, распределённых хранилищ и профессиональных почтовых платформ).
Альтернативные подходы
- Вместо MySQL можно использовать LDAP для хранения виртуальных пользователей и доменов.
- Для веб‑почты современная альтернатива SquirrelMail — Roundcube или RainLoop.
- Для защиты входящей почты рассмотрите интеграцию с Postgrey (greylisting) и антивирус/антиспам фильтрами (Amavis, SpamAssassin, ClamAV).
Краткая методология развёртывания (мини‑SOP)
- Подготовка сервера: hostname, /etc/hosts, обновления пакетов и базовая безопасность.
- Установка dovecot, postfix, mysql-server, squirrelmail.
- Создание SSL/TLS сертификатов и конфигурация saslauthd.
- Создание базы mail и таблиц domain/mailbox/alias.
- Подготовка файлов /etc/postfix/*.cf для SQL‑запросов.
- Конфигурация main.cf и dovecot.conf.
- Создание системного пользователя vmail и директорий /var/vmail.
- Настройка веб‑серверов и phpMyAdmin.
- Тестирование, логирование и отладка.
- Настройка бэкапов и политики безопасности.
Роль‑основанные чек‑листы
Администратор сети:
- Установить и настроить сетевые интерфейсы и DNS/PTR.
- Настроить брандмауэр и мониторинг.
DBA / админ БД:
- Создать базу mail и пользователя mail.
- Контролировать бэкапы базы данных.
Системный администратор почты:
- Настроить Postfix/Dovecot конфигурации и сертификаты.
- Проверить права на /var/vmail и конфигурационные файлы.
Оператор веб‑интерфейса:
- Установить SquirrelMail / phpMyAdmin и настроить виртуальные хосты Apache.
Критерии приёмки
- Веб‑интерфейс SquirrelMail доступен и позволяет залогиниться.
- Письмо отправляется с [email protected] и доставляется в [email protected].
- TLS соединения работают для SMTP (STARTTLS) и IMAPS/POP3S.
- Логи не содержат критических ошибок при старте сервисов.
Тест‑кейсы и приёмочные проверки
- Авторизация через SMTP с STARTTLS и отправка письма на внешний адрес (проверить заголовки).
- Вход в IMAP через TLS и чтение сообщения, пометка сообщения как прочитанного.
- Проверка работы алиаса (перенаправление с одного адреса на другой).
- Попытка входа системным пользователем (UID ≠ 150) — доступ должен быть запрещён.
Итог и рекомендации
Это руководство даёт последовательные шаги для развёртывания почтового сервера с виртуальными пользователями на CentOS 4.5 с Postfix и Dovecot, используя MySQL для хранения учётных записей. В продакшне дополнительно выполните следующие действия:
- Перенести хранение паролей на безопасные хэши.
- Заказать сертификаты у доверенного CA.
- Настроить антивирус/антиспам фильтрацию.
- Автоматизировать бэкап и мониторинг.
Summary: Развёртывание возможно на базе приведённых конфигураций, но требуется адаптация под вашу среду и усиление безопасности прежде чем запускать в продакшн.
Полезные ссылки
http://workaround.org/articles/ispmail-etch/#step-2-create-the-database-and-user
http://www.nomoa.com/articles/Setting_up_your_own_Mail_Server
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone