Почтовый linux-сервер

Установка и настройка почтового сервера.

Документ описывает установку и настройку почтового сервера со следующими компонентами:

  • Postfix - отвечает за отправку сообщений по протоколу SMTP
  • Dovecot - предоставляет доступ для пользователей к почте по протоколу IMAP и отвечает за авторизацию
  • Spamassassin - спам-фильтр
  • Postfix Admin - web-интерфейс для управления учетными данными пользователей
  • Roundcube - почтовый web-клиент
  • Nginx, PHP, Mysql - компоненты для обеспечения работы веб-интерфейсов и хранения учетных данных.

В данной документации используется последняя LTS-версия Ubuntu - 16.04
Для обозначений переменных условимся, что:
example.com - домен, почту которого мы будем обрабатывать
mail.example.com - имя сервера, на котором производится настройка
172.32.254.2 - ip-адрес сервера, на котором производится настройка.

Поскольку стандратная установка Ubuntu подразумевает работу от пользователя и выполнение команд, требующих root-прав, через sudo, то, чтобы не вводить ее перед каждой командой, запустите команду sudo один раз с параметром -s,

~$ sudo -s
~#

Необходимо установить корректное имя сервера, для этого запишем его в соответствующий файл

echo "mail.example.com" > /etc/hostname
hostname `cat /etc/hostname`

Так же необходимо указать имя и ip-адрес сервера в файле /etc/hosts

172.32.254.2 mail.example.com mail

Далее сгенерируем SSL-сертификаты сервера с новым доменным именем

apt-get install -y ssl-cert
make-ssl-cert generate-default-snakeoil --force-overwrite

Если у вас нет приобретенных сертификатов для вашего домена, вы можете, например, получить сертификаты в сервисе Let's Encrypt

Создадим ключ Диффи-Хелмана

openssl dhparam -out /etc/ssl/private/dhparams.pem 2048
chmod 600 /etc/ssl/private/dhparams.pem

Установим Web-сервер - nginx, php, mysql.

apt-get install nginx php7.0 php7.0-cli php7.0-fpm php7.0-mysql \
php7.0-curl php7.0-gd php7.0-gmp php7.0-imap php7.0-intl php7.0-json \
php7.0-mcrypt php7.0-readline php7.0-sqlite3 php7.0-xml php7.0-xsl \
php7.0-mbstring php7.0-zip mysql-server 

Другие необходимые пакеты установятся по зависимостям. В процессе установки вам будет предложено установить пароль root-пользователя в БД MySql. Установите его и надежно сохраните.

Создадим файл конфигурации для нашего домена в web-сервере Nginx
Каталог, в котором мы разместим файлы сайта - /var/www/mail.example.com/. Создайте его

mkdir /var/www/mail.example.com/

Вы можете выполнить команду nano -w /etc/apache2/sites-available/010-mail.example.com.conf для открытия пустого файла и вставить в него нижеприведенную конфигурацию.
Не забудьте верно указать пути к вашим SSL-сертификатам

/etc/nginx/sites-available/mail.example.com
# http всегда будет переадресовываться на https.
server {
        listen      80;
        server_name mail.example.com;
        rewrite     ^   https://$server_name$request_uri? permanent;
}
 
server {
        listen 443 ssl;
        server_name mail.example.com;
        root /var/www/mail.example.com;
 
        ssl                 on;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
        # Путь до файла с SSL-сертификатом
        ssl_certificate     /etc/ssl/mail_example_com.crt;
        # Путь до файла с закрытым ключем
        ssl_certificate_key /etc/ssl/mail_example_com.key;
        ssl_prefer_server_ciphers on;
        ssl_session_cache   shared:SSL:10m;
        ssl_session_timeout 10m;
 
        keepalive_timeout   70;
        client_max_body_size 10G;
        fastcgi_buffers 64 4K;
        gzip off;
 
        index index.php;
 
        location / {
                try_files $uri $uri/ =404;
        }
 
        location ~ \.php(?:$|/) {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
                include fastcgi_params;
                fastcgi_param HTTP_PROXY "";
                fastcgi_param HTTPS on;
                fastcgi_intercept_errors on;
        }
 
        location ~ /\.ht {
                deny all;
        }
 
        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }
 
        location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|swf)$ {
                access_log off;
        }
 
}

Включаем наш сайт в конфигурации Nginx (чтобы Nginx при запуске учитывал вышеприведенную конфигурацию). Скорректируйте имя файла в соответствии с вашими настройками.

ln -sf /etc/nginx/sites-available/mail.example.com /etc/nginx/sites-enabled/mail.example.com
  • Установка самого основного - Postfix и Dovecot:
apt-get install -y postfix postfix-mysql postfix-pcre dovecot-core dovecot-imapd dovecot-mysql dovecot-common dovecot-sieve

При установке postfix будут запрошены конфигурационные параметры - их можно оставить по умолчанию, т.к. в дальнейшем конфигурационный файл будет целиком изменен.

Создадим в MySQL БД для почтового сервера
(если вдруг вы установили mysql без пароля root, то параметр -p нужно убрать)

mysql -p -Bse "create database mail;"
mysql -p -Bse "grant all on mail.* to 'mail'@'localhost' identified by 'mailpassword';"

Пользователь для хранения почты

useradd -r -g mail -d /var/vmail -s /sbin/nologin -c "Virtual maildir handler" vmail
mkdir /var/vmail
chmod 770 /var/vmail
chown vmail:mail /var/vmail
  • Установка PostfixAdmin - интерфейса управления учетными записями

Скачайте последнюю версию PostfixAdmin по адресу https://sourceforge.net/projects/postfixadmin/ (на момент написания этого документа актуальная версия 3.0.2), затем распакуйте полученный архив в каталог /var/www/mail.example.com/mailadmin/ чтобы PostfixAdmin был вам доступен по адресу https://mail.example.com/mailadmin/

Создайте в каталоге с PostfixAdmin файл с именем config.local.php следующего содержания:

<?php
$CONF['database_type'] = 'mysqli';
$CONF['database_user'] = 'mail';
$CONF['database_password'] = 'mailpassword';
$CONF['database_name'] = 'mail';
$CONF['configured'] = true;
?>

Установите права на один из каталогов PostfixAdmin:

chown www-data:www-data templates_c

Затем перейдите по адресу https://mail.example.com/mailadmin/setup.php Будет создана структура базы данных и появится возможность создать супер-администратора и задать пароль для управления PostfixAdmin.