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!

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


Рейтинг: 16

Обновлено: 09.10.2024

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

Евдокимов Юрий Владимирович

Я начал свою карьеру программистом в возрасте около 17 лет.

Изначально я хотел стать электриком, но что-то пошло не так - мне подарили первый компьютер... не рабочий... Сказали починишь - п ....

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


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

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

Рейтинг: 2

Поддержать автора


СБП (Сбер) 9221301778

Самое читаемое:
Все о загрузочных флешках, дисках и ссд
Все о загрузочных флешках, дисках и ссд
Загрузимся хоть с загрузочного ....
14.09.2024
Публикация базы данных 1С
Публикация базы данных 1С
Не большой мануал по настройке ....
09.09.2023
Бесплатные программы для работы с разделами жесткого диска
Бесплатные программы для работы с разделами жесткого диска
краткий обзор бесплатных прогр ....
17.05.2024
Windows XP SP 2 слетел драйвер дисковода CD/DVD (2015 г.)
Windows XP SP 2 слетел драйвер дисковода CD/DVD (2015 г.)
И такое бывало.... мало ли, пу ....
16.05.2024
Windows 3.11 - полный дистрибутив!
Windows 3.11 - полный дистрибутив!
старые окна ....
03.09.2023
Не Play Market-ом единым
Не Play Market-ом единым
Свободное ПО для Android ....
04.11.2023
1С Бухгалтерия - ошибка формата потока (3.0.88.22)
1С Бухгалтерия - ошибка формата потока (3.0.88.22)
1С Бухгалтерия - ошибка формат ....
16.05.2024
Как сбросить пароль Windows 7-10
Как сбросить пароль Windows 7-10
Входим в нее...... ....
17.08.2024
Установка OwnCloud на Linux Debian 11 или 12
Установка OwnCloud на Linux Debian 11 или 12
Отличное облачное решение для ....
17.05.2024
Frontol XPOS Настройка копии чека
Frontol XPOS Настройка копии чека
FrontolXPOS - настраиваем печа ....
16.05.2024
Простое лимитирование дискового пространства Linux
Простое лимитирование дискового пространства Linux
Разделяй и влавствуй над диско ....
09.10.2024
Убираем из адресной строки www
Убираем из адресной строки www
убираем зеркала сайтов исключа ....
13.08.2023
Многофункциональный обработчик кнопок JQuery
Многофункциональный обработчик кнопок JQuery
Многофункциональный обработчик ....
13.08.2023
В браузерах лезет реклама
В браузерах лезет реклама
Убираем рекламные вирусы ....
01.01.1970
Обновляем Debian с 11 на 12!
Обновляем Debian с 11 на 12!
Обновляем операционку почти бе ....
16.05.2024
Как разблокировать системный реестр Windows
Как разблокировать системный реестр Windows
Если нельзя, но очень хочется ....
16.05.2024
Windows PE
Windows PE
Спасение утопающих в руках уто ....
28.09.2024
QBasic 4.5
QBasic 4.5
Древние языки ....
13.09.2024
Брут http-авторизации на PHP
Брут http-авторизации на PHP
Взлом HTTP-авторизации ....
09.10.2024
Программы восстановления удаленных файлов
Программы восстановления удаленных файлов
Реанимируем почти убитое ....
16.05.2024
LanScope 2.9.1
LanScope 2.9.1
Простая программа для сканиров ....
11.08.2023
Опыт заработка на сайте
Опыт заработка на сайте
Можно ли нормально заработать ....
25.01.2023
Установка Debian и Ubuntu по сети через PXE
Установка Debian и Ubuntu по сети через PXE
бездисковая установка линукс! ....
16.05.2024
Как установить mod_rewrite
Как установить mod_rewrite
Всякие редиректы и ЧПУ ....
16.05.2024
Настройка spamassassin для работы с MySQL
Настройка spamassassin для работы с MySQL
Боремся со спамом ....
01.01.1970
Бесплатный SSL-сертификат и настройка Nginx
Бесплатный SSL-сертификат и настройка Nginx
Бесплатные ssl сертификаты ....
16.05.2024
Ускорение работы сайта
Ускорение работы сайта
Ускоряем сайт с помощью настро ....
26.05.2024
Python - самообучающийся чат-бот для Телеграмм
Python - самообучающийся чат-бот для Телеграмм
скачать бесплатно бота для тел ....
16.05.2024
PHP-скрипт антибот
PHP-скрипт антибот
Не даем шерстить сайт вредным ....
16.05.2024