Добрый день, друзья! Сегодня сентябрь 2023-го года и случился еще один античеловечный сюрприз... У меня раз есть свой домен - я в свое время прикрутил его к почтовику Яндекса и несколько лет успешно пользовался почтой... Но вот пришло письмо от Яндекса - если не буду им башлять - то на свою почту смогу только смотреть....
Мы же люди опытные, если халява закончилась в одном месте - можно найти в другом, а раз у меня уже есть домашний сервачек, то можно там замутить и почту!
Оглавление:
- Определение условий
- Понимание ДНС
- Структура почтового сервера
- Настройка MySQL (MariaDB)
- Настройка Postfix
- Настройка SASL
- Настройка Courier
- Настройка WEB-морды
- Настройка шифрования
- Настройка DKIM
- Настройка 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(), но если нам нужен почтовый сервер для приемки и отправки почты - здесь уже сложнее.
К сожалению, нет такого крутого пакета, который просто поставил, завел пользователей и радуешься, тому какой ты крутой сис-админ...
И так, из чего же состоит почтовый сервер:
- Это почтовый агент, который отправляет и принимает письма, традиционно это Postfix
- Однако даже если сервер получил письмо - нужна какая то программа которая позволит его получить с этого сервера - это может быть Dovecot, но я традиционно использую Courier
- Чтобы наш почтовый сервер не стал случайно системой рассылки спама - мы должны сделать авторизацию - для этого служит пакет saslauthd (далее по тексту sasl)
- Настройки доменов, пользователей и допустим пересылки удобнее хранить в SQL, чем каждому пользователю создавать учетку на сервере, к сожалению, тут в дело вступает MySQL... Почему к сожалению - я бы предпочел SQLITE, но пока что не нашел способа подружить все это.
- Следующий важный компонент - веб-сервер! Тут опять же его разобьем на два компонента - PHP и Nginx (здесь же мы имеем полное право не использовать MySQL)
- Ну мы вполне можем обойтись и без веб-сервера, если будем использовать десктопные почтовые клиенты и легко умеем работать с MySQL из консоли. Однако, если нам нужна веб-морда (традиционно это Roundcube - следующий компонент), то и веб-сервер нам тоже нужен...
- Имея адрес info@site.ru через пару месяцев работы с почтой вы будете тратить 90% времени на удаление спама! По этому - следующий компонент - Spamassasin - именно он будет отвечать за метку Спам в заголоке письма.
- Как полезный и приятный бонус - спам фильтр должен как то обучаться и мы его научим - напишем PHP скрипт, который будет смотреть папку со спамом и обучать Spamassain.
- Я хоть и не параноик, но мы защитим все это 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!
Далее - будет далее - настраиваем остальные сервисы!
Рейтинг: 41
Обновлено: 03.12.2024