Я расскажу про установку и настройку postfix на centos 7, причем только тех модулей и дополнений, которые сам считаю нужными и полезными на почтовом сервере.
Статьи Время чтения: 5 минуты Просмотров: 505
Онлайн-курс по Kubernetes – для разработчиков, администраторов, технических лидеров, которые хотят изучить современную платформу для микросервисов Kubernetes. ... Я буду настраивать почтовый сервер на ОС linux, а точнее на CentOS 7. За основу будет взят postfix, который присутствует в этой системе из коробки. Инструкция получится универсальной, можно использовать и для других дистрибутивов. Все основные конфиги легко переносятся на разные системы, требуя минимальной правки, в основном путей.
Как вам может быть известно, я не очень доверяю SaaS-решениям. Причин тому больше одной. SaaS’ы оставляют за собой право менять Terms of Service в любой момент как им вздумается. SaaS’ы сливают персональные данные. SaaS’ы меняют пользовательский интерфейс и функционал на свое усмотрение. Наконец, если вы используете SaaS’ы от какого-нибудь Google, то однажды получив в них бан за любое нарушение ToS (который, напомню, постоянно меняется), назад вы больше никогда не разбанитесь. В прошлой статье мы решали описанные проблемы, поднимая / перенося на VDS свой блог. Сегодня же мы попробуем разобраться, как с нуля поднять собственный почтовый сервер с TLS, спам-фильтром и списками рассылок.
Примечание: Описанные далее действия производились на Centos7. Однако для других версий Ubuntu, ровно как и для других дистрибутивов Linux, последовательность шагов должна не сильно отличаться.
Примем за рабочую теорию, что у вас есть выделенный сервер (VDS) и указывающее на него доменное имя. Далее в качестве примера я буду использовать домен mail.blanet.ru. Если VDS у вас нет, сейчас есть множество VDS-провайдеров, предоставляющих их за смешные деньги. На момент написания этих строк я предпочитаю пользоваться DigitalOcean. При регистрации в DigitalOcean по моей реферальной ссылке вы получаете на счет 10$, что позволит бесплатно пользоваться VDS в течение двух месяцев.
В /etc/hosts прописываем Fully Qualified Domain Name (FQDN):
178.250.244.94 mail.blanet.ru mail
Ставим необходимые пакеты:
sudo yum install mysql-server mysql-client postfix3 postfix3-mysql dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql
При установке Postfix на вопрос «General type of mail configuration» говорим «Internet Site». На вопрос о доменном имени отвечаем «mail.blanet.ru».
Postfix представляет собой Mail Transfer Agent (MTA), он будет отвечать за отправку и получение почты по SMTP. Dovecot будет предоставлять доступ к письмам по протоколу IMAP (также поддерживается ныне устаревший POP3). СУБД MySQL будет использоваться для хранения информации о доменах, пользователях и алиасах. Вместо MySQL с тем же успехом можно взять и MariaDB.
В MySQL создаем пользователя и базу данных:
mysql --user root --password
mysql> CREATE DATABASE mail;
mysql> CREATE USER 'mail'@'localhost' IDENTIFIED BY 'ПАРОЛЬ_ОТ_БД';
mysql> GRANT ALL ON mail.* TO 'mail'@'localhost';
mysql> exit
Заходим под новым пользователем:
mysql mail --user mail --password
Создаем следующие таблицы:
CREATE TABLE `virtual_domains` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `virtual_users` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL,
`password` VARCHAR(106) NOT NULL,
`email` VARCHAR(120) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `virtual_aliases` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL,
`source` VARCHAR(100) NOT NULL,
`destination` VARCHAR(100) NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Вводим информацию о доменах, пользователях и алиасах:
INSERT INTO virtual_domains (`id`, `name`) VALUES (1, 'blanet.ru');
INSERT INTO virtual_users (`id`, `domain_id`, `email`, `password`)
VALUES (1, 1, 'mail@blanet.ru',
ENCRYPT('ПАРОЛЬ_ДЛЯ_ПОЧТЫ', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))));
INSERT INTO virtual_aliases
(`id`, `domain_id`, `source`, `destination`)
VALUES (1, 1, 'postmaster@blanet.ru', 'mail@blanet.ru');
В колонке destination таблицы virtual_aliases можно указывать несколько получателей через запятую, в том числе и на всяких gmail.com. Таким образом, можно создавать списки рассылки. Если алиасы образуют цепочку, например postmaster@blanet.ru → mail@blanet.ru → somebody@example.org, то это тоже превосходно работает.
Для создания хэша пароля даем команду:
doveadm pw -s SHA512-CRYPT
Вводим 2 раза пароль.
Получаем hash. Его и вносим в БД взамен существующему
Правим /etc/postfix/main.cf:
# дописываем или изменяем:
# пока что без TLS
smtpd_use_tls=no
myhostname = mail.blanet.ru
mydestination = localhost
virtual_transport = lmtp:unix:private/dovecot-lmtp
# то, что пока нет таких файлов - это ОК
virtual_mailbox_domains = mysql:/etc/postfix/mysql-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-users.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-aliases.cf
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,⏎
permit_mynetworks,reject_unauth_destination
# увеличиваем максимальный размер письма до 50 Мб
message_size_limit = 52428800
Создаем /etc/postfix/mysql-domains.cf:
hosts = 127.0.0.1
user = mail
password = ПАРОЛЬ_ОТ_БД
dbname = mail
query = SELECT 1 FROM virtual_domains WHERE name='%s'
…, а также /etc/postfix/mysql-users.cf:
hosts = 127.0.0.1
user = mail
password = ПАРОЛЬ_ОТ_БД
dbname = mail
query = SELECT 1 FROM virtual_users WHERE email='%s'
…, и наконец /etc/postfix/mysql-aliases.cf:
hosts = 127.0.0.1
user = mail
password = ПАРОЛЬ_ОТ_БД
dbname = mail
query = SELECT destination FROM virtual_aliases WHERE source='%s'
Поскольку файлы содержат пароль от базы, стоит выставить на них правильные права:
sudo chown postfix:postfix /etc/postfix/mysql-*.cf
sudo chmod o-rwx /etc/postfix/mysql-*.cf
Перезапускаем Postfix:
sudo service postfix restart
Проверяем, что он видит домены, пользователей и алиасы:
sudo postmap -q mail@blanet.ru mysql:/etc/postfix/mysql-users.cf
sudo postmap -q blanet.ru mysql:/etc/postfix/mysql-domains.cf
sudo postmap -q postmaster@blanet.ru mysql:/etc/postfix/mysql-aliases.cf
Ответы на команды должны быть такими:
1
1
mail@blanet.ru
Все, postfix настроен!
О настройке Dovecot я вам расскажу в статье "Установка Dovecot в Centos7"