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

Обновлено: 03.04.2025

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

....

Администратор сайта


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

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

Рейтинг:

Самое читаемое:
Внешний отчет для УТ 11.5 по кредиторской задолженности!
Внешний отчет для УТ 11.5 по кредиторской задолженности!
отчет по кредиторской задолжен ....
03.04.2025
Эталоны Windows
Эталоны Windows
....
03.04.2025
Контакты
Контакты
как найти программиста? =) ....
03.04.2025
Установка OwnCloud на Linux Debian 11 или 12
Установка OwnCloud на Linux Debian 11 или 12
Отличное облачное решение для ....
03.04.2025
Windows PE
Windows PE
Спасение утопающих в руках уто ....
03.04.2025
Брут http-авторизации на PHP
Брут http-авторизации на PHP
Взлом HTTP-авторизации ....
03.04.2025
Обновляем Debian с 11 на 12!
Обновляем Debian с 11 на 12!
Обновляем операционку почти бе ....
03.04.2025
1С Бухгалтерия - ошибка формата потока (3.0.88.22)
1С Бухгалтерия - ошибка формата потока (3.0.88.22)
1С Бухгалтерия - ошибка формат ....
03.04.2025
Не Play Market-ом единым
Не Play Market-ом единым
Свободное ПО для Android ....
03.04.2025
Настройка spamassassin для работы с MySQL
Настройка spamassassin для работы с MySQL
Боремся со спамом ....
03.04.2025
Как разблокировать системный реестр Windows
Как разблокировать системный реестр Windows
Если нельзя, но очень хочется ....
03.04.2025
Как установить mod_rewrite
Как установить mod_rewrite
Всякие редиректы и ЧПУ ....
03.04.2025
Программы восстановления удаленных файлов
Программы восстановления удаленных файлов
Реанимируем почти убитое ....
03.04.2025
Life Hack - удаление файлов в Windows
Life Hack - удаление файлов в Windows
как удалить не удаляемый файл ....
03.04.2025
В браузерах лезет реклама
В браузерах лезет реклама
Убираем рекламные вирусы ....
03.04.2025
О куках
О куках
....
03.04.2025
Школа 66
Школа 66
заказать модуль обращение граж ....
03.04.2025
Популярные цвета Flat UI
Популярные цвета Flat UI
Цвета Flat UI ....
03.04.2025
Бесплатные программы для работы с разделами жесткого диска
Бесплатные программы для работы с разделами жесткого диска
краткий обзор бесплатных прогр ....
03.04.2025