time

Настройка почтового сервера Postfix + MySQL, Dovecot

Настроим почтовый сервер (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 разделены на два файла

  • main.cf - содержит параметры, используемые при обработке почты;
  • master.cf - содержит параметры, используемые при работе 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 сервера в черный список.

Дополнительное чтиво

Надежный безлимитный хостинг.

blog comments powered by Disqus