Настроим почтовый сервер (MTA) и агент доставки электронной почты (MDA) под Ubuntu Server. В качестве MTA будет работать Postfix (SMTP-сервер) с хранением списка аккаунтов пользователей в БД MySQL, в качестве MDA – Dovecot (POP3/IMAP сервер).
Сравнение разных MTA: Postfix, QMail, Sendmail, Exim.
Архитектура современных почтовых систем:
Рисунок взят тут.
Для полноценной работы почтового сервера нужна MX запись в DNS, настройка bind-сервера.
Для начала установим имя хоста, на котором будет работать почтовый сервер
echo "server" > /etc/hostname hostname -F /etc/hostname
Обновим пакеты
sudo apt-get update && sudo apt-get upgrade
Установим Postfix, Dovevot, MySQL, OpenSSL, mutt, mailx, rcconf
sudo apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server dovecot-common
dovecot-imapd dovecot-pop3d postfix-tls libsasl2-2 libsasl2-modules libsasl2-modules-sql
sasl2-bin libpam-mysql openssl bsd-mailx mutt rcconf
В окне Postfix Configuration выбираем Internet Site, для полного доменного имени (FQDN) указываем hostname + domain, например, server.test.ua.
Сделаем первоначальную настройку mysql
mysql_secure_installation
Добавим mysql в автозагрузку (если нету)
# проверим статус sudo rcconf --list | grep mysql # добавим в автозагрузку sudo rcconf --on mysql
Подключимся к mysql и создадим базу для пользователей и доменов
mysql -uroot -p CREATE DATABASE postfix; USE postfix;
Создадим отдельного mysql-пользователя mailer для работы с базой
GRANT SELECT, INSERT, UPDATE, DELETE ON postfix.* TO 'mailer'@'localhost'
IDENTIFIED BY '_password_'; FLUSH PRIVILEGES;
Создадим таблицу для хранения виртульных доменов
CREATE TABLE domains (domain varchar(50) NOT NULL, PRIMARY KEY (domain) );
Создаим таблицу для хранения редиректов с ящика на ящик (forwarding)
CREATE TABLE forwardings (source varchar(80) NOT NULL, destination TEXT NOT NULL,
PRIMARY KEY (source) );
Создаим таблицу для хранения пользователей
CREATE TABLE users (email varchar(80) NOT NULL, password varchar(20) NOT NULL,
PRIMARY KEY (email) );
Создадим таблицу для транспортировки
CREATE TABLE transport ( domain varchar(128) NOT NULL default '',
transport varchar(128) NOT NULL default '', UNIQUE KEY domain (domain) );
Настроем postfix для работы в связке с mysql. Для этого нужно описать каждую из выше созданных таблиц.
Для виртуальных доменов
# sudo vim /etc/postfix/mysql-virtual_domains.cf user = mailer password = _password_ hosts = 127.0.0.1 dbname = postfix query = SELECT domain FROM domains WHERE domain='%s'
Для редиректов email → email
# sudo vim /etc/postfix/mysql-virtual_forwardings.cf user = mailer password = _password_ dbname = postfix query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1
Для почтовых ящиков
# sudo vim /etc/postfix/mysql-virtual_mailboxes.cf user = mailer password = password dbname = postfix query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
FROM users WHERE email='%s' hosts = 127.0.0.1
Для редиректов domain → email
# sudo vim /etc/postfix/mysql-virtual_email2email.cf user = mailer password = password dbname = postfix query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1
Изменем права и группу для созданных файлов
sudo chmod o= /etc/postfix/mysql-virtual_*.cf sudo chgrp postfix /etc/postfix/mysql-virtual_*.cf
Создадим системного пользователя vmail, в домашнем каталоге которого будут храниться аккаунты виртульных пользователей.
sudo groupadd -g 5000 vmail sudo useradd -g vmail -u 5000 vmail -d /home/vmail -m
Конфигурации postfix разделены на два файла
Команда postconf -e
позволяет добавлять настройки в файл /etc/postfix/main.cf, настройки применяются сражу же, без перезапуска postfix.
Для окончания настройки запустим ниже приведенные настройки в терминале. Не забудьте поменять myhostname на свой FQDN. Возможно понадобится root шел: sudo su.
postconf -e 'myhostname = server.test.ua' postconf -e 'mydestination = $myhostname, localhost, localhost.localdomain' postconf -e 'mynetworks = 127.0.0.0/8' postconf -e 'inet_interfaces = all' postconf -e 'message_size_limit = 256000' postconf -e 'virtual_alias_domains =' postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf,
mysql:/etc/postfix/mysql-virtual_email2email.cf' postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf' postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf' postconf -e 'virtual_mailbox_base = /home/vmail' postconf -e 'virtual_uid_maps = static:5000' postconf -e 'virtual_gid_maps = static:5000' postconf -e 'smtpd_sasl_type = dovecot' postconf -e 'smtpd_sasl_path = private/auth' postconf -e 'smtpd_sasl_auth_enable = yes' postconf -e 'broken_sasl_auth_clients = yes' postconf -e 'smtpd_sasl_authenticated_header = yes' postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,
reject_unauth_destination' postconf -e 'smtpd_use_tls = no' postconf -e 'smtpd_tls_cert_file = /etc/pki/dovecot/certs/dovecot.pem' postconf -e 'smtpd_tls_key_file = /etc/pki/dovecot/private/dovecot.pem' postconf -e 'virtual_create_maildirsize = yes' postconf -e 'virtual_maildir_extended = yes' postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps
$virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps
$relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps
$relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps' postconf -e 'virtual_transport = dovecot' postconf -e 'dovecot_destination_recipient_limit = 1'
Настройка SSL доступа в postfix описана тут.
Сообщим postfix'у что мы хотим использовать dovecot для сбора почты по IMAP или POP3, для этого добавим в конец файла /etc/postfix/master.cf
# sudo vim /etc/postfix/master.cf dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
Настроим dovecot, для этого изменим содержимое файла /etc/dovecot/dovecot.conf на
# sudo vim /etc/dovecot/dovecot.conf listen = 110,143 protocols = imap pop3 log_timestamp = "%Y-%m-%d %H:%M:%S " mail_location = maildir:/home/vmail/%d/%n ssl = no disable_plaintext_auth=no namespace private { separator = . prefix = INBOX. inbox = yes } protocol lda { log_path = /home/vmail/dovecot-deliver.log auth_socket_path = /var/run/dovecot/auth-master postmaster_address = proft@test.ua } protocol pop3 { pop3_uidl_format = %08Xu%08Xv listen = *:110 } protocol imap { listen = *:143 } auth default { user = root passdb sql { args = /etc/dovecot-sql.conf } userdb static { args = uid=1002 gid=1002 home=/home/vmail/%d/%n allow_all_users=yes } socket listen { master { path = /var/run/dovecot/auth-master mode = 0600 user = vmail } client { path = /var/spool/postfix/private/dovecot-auth mode = 0660 user = postfix group = postfix } } }
Настройка SSL доступа для dovecot описана тут.
Укажем dovecot на проверку авторизации через ранее созданную таблицу users в MySQL, для этого заменим содержимое /etc/dovecot-sql.conf на
# sudo vim /etc/dovecot-sql.conf driver = mysql connect = host=127.0.0.1 dbname=postfix user=mailer password=_password_ default_pass_scheme = CRYPT password_query = SELECT email as user, password FROM users WHERE email='%u';
Ограничим доступ к файлу
sudo chgrp dovecot /etc/dovecot-sql.conf sudo chmod o= /etc/dovecot-sql.conf
Проверим /var/log/maillog на отсутствие ошибок от dovecot.
tail -n50 /var/log/mail.log
Для суммарного анализа postfix лога есть удобная утилита pflogsumm:
sudo apt-get install pflogsumm pflogsumm /var/log/mail.log | less
Создадим тестовый домен и аккаунт пользователя в этом домене.
mysql -uroot -p postfix INSERT INTO domains (domain) VALUES ('test.ua'); INSERT INTO users (email, password) VALUES ('proft@test.ua', ENCRYPT('_password_'));
Отправим тестовое сообщение новому пользователю. Для завершения набора сообщения нажмите ctrl+d.
mailx proft@test.ua
Способ отправки письма с консоли
echo "message" | mailx -s "subject" proft@test.ua
Отправка письма с атачем
uuencode file file | mailx -s "subject" proft@test.ua
Еще можно протестировать работу почтового сервера с помощью swaks.
Утилита uuencode находиться в пакете sharutils (ubuntu, arch).
Проверим SMTP доступ
telnet localhost smtp ehlo test.ua mail from:rcpt to: data Hello world! . quit
Проверим POP3 доступ
telnet localhost pop3 user proft@test.ua pass _password_ list retr 1 quit
Проверим содержимое почтового ящика proft с помощью mutt
cd /home/vmail/test.ua/proft mutt -f .
В postfix письма храняться в разных очередях, которые находяться в /var/spool/postfix/. Для просмотра сообщения в читаемом виде есть утилита postcat, например прочитаем письмо из очереди active
postcat /var/spool/postfix/active/2602D7D828
Список отложенных писем для отправки можно просмотреть с помощью команды postqueue.
postqueue -p
Для очищения очереди из отложенных писем воспользуемся командой
sudo postsuper -d ALL deferred
Утилита postconf с ключем -n позволяет просмотреть настройки postfix отличающиеся от дефолтных
postconf -n
Для проверки правильности настроек и прав доступа на файлы выполним следующею команду, она должна вернуть пустой результат.
sudo postfix check
Укажем пользователя, который является root'ом на сервере и будет получать письма с ошибками, для этого редактируем /etc/aliases, что бы он выглядел приблизительно так
# sudo vim /etc/aliases postmaster: root root: proft@test.ua
Применим правки
newaliases service postfix restart
На сайте multirbl.valli.org можно проверить занесен ли ip сервера в черный список.