YurecNT

Настройка почтового сервера Postfix + Courier + spamassasin + roundcube Ч.1

Добрый день, друзья! Сегодня сентябрь 2023-го года и случился еще один античеловечный сюрприз... У меня раз есть свой домен - я в свое время прикрутил его к почтовику Яндекса и несколько лет успешно пользовался почтой... Но вот пришло письмо от Яндекса - если не буду им башлять - то на свою почту смогу только смотреть....

Мы же люди опытные, если халява закончилась в одном месте - можно найти в другом, а раз у меня уже есть домашний сервачек, то можно там замутить и почту!

Оглавление:

  1. Определение условий
  2. Понимание ДНС
  3. Структура почтового сервера
  4. Настройка MySQL (MariaDB)
  5. Настройка Postfix
  6. Настройка SASL
  7. Настройка Courier
  8. Настройка WEB-морды
  9. Настройка шифрования
  10. Настройка DKIM
  11. Настройка Spamassassin

Глава первая - определение условий:

Чтобы почта работала как часы, нужно:

  • Чтобы у вас был свой домен.

Но чтобы не просто был, а вы могли настраивать его ДНС-записи!

  • Чтобы у вас был свой сервер (можно даже VPS) под Linux.

Я настраиваю все на Debian-образных серверах, настройки на других ОС могут отличаться

  • Чтобы у вас был выделенный IP-адрес

Надо же почту как то принимать и куда-то привязать MX-запись домена

  • Чтобы у вас был дружелюбный провайдер.

Который поможет с настройкой PTR

Глава вторая - понимание DNS

 

Вот здесь все интереснее...

По факту как бы достаточно почтовому агенту указать IP сервера по имени домена - он с ним связывается и шлет туда письмо... Это можно проверить, просто указав в файле /etc/hosts связку IP с доменом.... И письма будут доходить, Но это в идеальном мире, в реальном же у вас может быть сайт с доменом site.ru и вы хотите почту info@site.ru, но сервер где лежит сайт не предполагает использования почты или же это может быть в абсолютно разных местах. И вот вы отправлете письмо на info@site.ru и сервер его не принимает, а если же вы настраиваете почтовик где-то на другом сервере - как указать почтовому агенту куда слать? Можно конечно сделать А запись в настройке домена - например 182.13.42.12 mail.site.ru но тогда и почта будет не info@site.ru, а info@mail.site.ru. Конечно это уже звучит не красиво...

Вот тут в дело вступает MX-запись!

Сперва как в примере выше - создаем запись А с указанием поддомена mail.site.ru на нужный нам IP, а затем создаем запись MX и в ней ставим приоритет (я обычно ставлю 5) и указываем поддомен mail.site.ru и тогда почтовый агент доставляет письмо куда надо - на нужный почтовый сервер.

В итоге у нас максимально короткий адрес info@site.ru и это не мешает работе сайта и обеспечивает работу почты!

Глава третья - структура почтового сервера

В Linux для отправки почты достаточно иметь sendmail и тогда с сайта на PHP почта будет уходить функцией mail(), но если нам нужен почтовый сервер для приемки и отправки почты - здесь уже сложнее.

К сожалению, нет такого крутого пакета, который просто поставил, завел пользователей и радуешься, тому какой ты крутой сис-админ...

И так, из чего же состоит почтовый сервер:

  1. Это почтовый агент, который отправляет и принимает письма, традиционно это Postfix
  2. Однако даже если сервер получил письмо - нужна какая то программа которая позволит его получить с этого сервера - это может быть Dovecot, но я традиционно использую Courier
  3. Чтобы наш почтовый сервер не стал случайно системой рассылки спама - мы должны сделать авторизацию - для этого служит пакет saslauthd (далее по тексту sasl)
  4. Настройки доменов, пользователей и допустим пересылки удобнее хранить в SQL, чем каждому пользователю создавать учетку на сервере, к сожалению, тут в дело вступает MySQL... Почему к сожалению - я бы предпочел SQLITE, но пока что не нашел способа подружить все это.
  5. Следующий важный компонент - веб-сервер! Тут опять же его разобьем на два компонента - PHP и Nginx (здесь же мы имеем полное право не использовать MySQL)
  6. Ну мы вполне можем обойтись и без веб-сервера, если будем использовать десктопные почтовые клиенты и легко умеем работать с MySQL из консоли. Однако, если нам нужна веб-морда (традиционно это Roundcube - следующий компонент), то и веб-сервер нам тоже нужен...
  7. Имея адрес info@site.ru через пару месяцев работы с почтой вы будете тратить 90% времени на удаление спама! По этому - следующий компонент - Spamassasin - именно он будет отвечать за метку Спам в заголоке письма.
  8. Как полезный и приятный бонус - спам фильтр должен как то обучаться и мы его научим - напишем PHP скрипт, который будет смотреть папку со спамом и обучать Spamassain.
  9. Я хоть и не параноик, но мы защитим все это SSL-сертификатами Certbot

Вот, наконец то закончился список из составляющих почтового сервера... Да, он достаточно длинный и все это нужно как то настроить... Мне тоже это не нравится, ведь чем сложнее система, тем она менее стабильна... Но, поверьте, все здесь будет хорошо! =)

Глава четвертая - настройка MariaDB

Здесь все зависит от сложности вашей задачи, у меня всего один сервер и админю его только я и у меня нет потребности создавать кучу паролей для MySQL, я сделал одного - user:123 к примеру

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

Здесь я облегчу задачу и приведу просто дамп своих таблиц - просто создайте базу данных (например mail и дальше по статье - тоже будет mail) и имортируйте дамп.

Примечание: Я брал этот материал, когда впервые настраивал почтовый сервер лет 15 назад. Однако он уже сильно устарел и будем делать как бы его основе, но в современных реалиях.

Раз я когда то брал какой то материал и по нему настраивал, но настраивал я под свои потребности, по этому я опишу то что важно и то что знаю:

Таблица domains -в ней просто список поддерживаемых доменов, которые сервер будет обслуживать, например site.ru

Таблица users - здесь хранится список пользователей:

  • email - полный почтовый адрес (info@site.ru),
  • password, зашифрованный средствами MySQL алгоритмом Encrypt
  • quota - как бы можно ограничивать юзерам объем почтового ящика, но я такой фигней не занимался, так как современные жесткие диск и SSD достаточно большого объема
  • p - я уже когда то позже добавил это поле где храню оригинал пароля, чтобы не забыть... Иначе придется его просто менять и все этому пользователю перенастраивать.

И еще одна важная таблица - forwardings, в ней хранятся правила пересылки - например, если один сотрудник ушел в отпуск и его почту временно кто-то другой должен получать или же надо службе безопасности читать все что приходит сотрудникам... Я же использую для контроля спама - пересылаю все письма на ящик spam@site.ru и смотрю, что автоматом не забанил spamassassin - баню руками (кнопкой "спам") и затем spamassassin уже обучается.

Глава пятая - настройка Postfix

Вот мы медленно и верно приближаемся к настройке самого почтового агента Postfix!

Для начала мы просто установим все пакеты связанные с почтой:

apt install postfix postfix-mysql courier-authdaemon courier-authlib-mysql courier-pop courier-imap libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql opendkim opendkim-tools mariadb-server nginx spamd spamassassin pyzor razor

Создаем файлы отвечающие за связку Postfix и MySQL, точнее описывающие, в какой таблице что находится:

mcedit /etc/postfix/mysql-virtual_domains.cf
user = user
password = 123
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts = 127.0.0.1
mcedit /etc/postfix/mysql-virtual_forwardings.cf
user = user
password = 123
dbname = mail
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1
mcedit /etc/postfix/mysql-virtual_mailboxes.cf
user = user
password = 123
dbname = mail
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'
hosts = 127.0.0.1
mcedit /etc/postfix/mysql-virtual_email2email.cf
user = user
password = 123
dbname = mail
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1
mcedit /etc/postfix/mysql-virtual_transports.cf
user = user
password = 123
dbname = mail
query = SELECT transport FROM transport WHERE domain='%s'
hosts = 127.0.0.1
mcedit /etc/postfix/mysql-virtual_mailbox_limit_maps.cf
user = user
password = 123
dbname = mail
query = SELECT quota FROM users WHERE email='%s'
hosts = 127.0.0.1

Соответственно user и 123 меняете на ваш пароль от MySQL

Изменяем права доступа и группа для этих файлов:

chmod o= /etc/postfix/mysql-virtual_*.cf
chgrp postfix /etc/postfix/mysql-virtual_*.cf

Создаем нового пользователя и группу с названием vmail с домашней директорией /home/vmail , где будут находится почтовые ящики:

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m

Сейчас мы настроим Postfix. Обязательно замените mail.site.ru на настоящий, иначе ваш почтовый сервер Postfix не сможет корректно работать! Просто в консоли под рутом вводим команды:

postconf -e 'myhostname = mail.site.ru'
postconf -e 'mydestination = mail.site.ru, localhost, localhost.localdomain' postconf -e 'mynetworks = 127.0.0.0/8'
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_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 = yes' postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert' postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key' postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf' postconf -e 'virtual_create_maildirsize = yes' postconf -e 'virtual_mailbox_extended = yes' postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf' postconf -e 'virtual_mailbox_limit_override = yes' postconf -e 'virtual_maildir_limit_message = "The user you are trying to reach is over quota."' postconf -e 'virtual_overquota_bounce = 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'

Если читать первоистояник - ту PDF, то на данном этапе мы должны сделать сертификаты SSL, но не будем! У нас позже будут единые для веб-морды и почты!

Глава шестая - настройка Sasl-авторизации

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

Для этого мы настроим saslauthd

Создадим каталог:

mkdir -p /var/spool/postfix/var/run/saslauthd

Отредактируем файл:

mcedit /etc/default/saslauthd

Добавим в него параметр

START=yes

Раньше по инструкции он был с параметром NO, но это было очень давно и параметра нет вообще (Debian 12), просто его дописываем.

Меняем параметр OPTIONS, чтобы он выглядел так:

OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

Создаем файл /etc/pam.d/smtp. И добавляем в него две строчки (обязательно используйте корректные значения относящиеся к вашей базе данных):

mcedit /etc/pam.d/smtp
auth required pam_mysql.so user=user passwd=123 host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=user passwd=123 host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1

Создаем файл /etc/postfix/sasl/smtpd.conf. Он должен быть подобного вида:

mcedit /etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd
mech_list: plain login pam
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: user
sql_passwd: 123
sql_database: mail
sql_select: select password from users where email = '%u@%r'

Добавляем пользователя postfix в группу sasl (это даст Postfix права доступа к saslauthd):

adduser postfix sasl

Перезапускаем Postfix и Saslauthd:

/etc/init.d/postfix restart
/etc/init.d/saslauthd restart

Добавляем демона saslauthd:

systemctl enable saslauthd
systemctl start saslauthd

Ну вот и все.... Мы настроили базу данных и почтовый агент Postfix!

Далее - будет далее - настраиваем остальные сервисы!


Рейтинг: 0 2

Обновлено: 26.04.2025

Информация об авторе

....


Все статьи автора

Благодарности:

Рейтинг:

Самое читаемое: