Как установить свой собственный почтовый сервер

27 июля, 2021

Приветствую тебя, мой одинокий гость. Сегодня я расскажу об установке собственного почтового сервера. Ты спросишь — а накуя? Как тебе вообще пришла такая идея, когда кругом полно всяких бесплатных гмайлов? Ну, меня не особо радует когда они теряют письма, не нравится тот факт, что они шарятся в моей почте, Cовсем плохо когда нормальная почта начинает падать в спам, а конкретный спам они начинают тебе слать как типа нормальную почту. Конкретный пц когда ихние роботы тебя заблокируют. Ну и вообще: установил потому что могу.

Оглядываясь назад, в начало 2000-х, каждый сисадмин считал своим делом установить почтовый сервер, но потом их развратили бесплатные почтовые сервисы для доменов. Для всех, кому насрать на свою приватность, потеряло смысл держать свой почтовик. Мне тоже, довольно таки долго, но настал момент это исправить.

Было интересно, насколько всё изменилось в этой области за все эти годы. Стала ли установка проще? Или наоборот, сложнее? Попробовав, я могу сказать: ничего особо не изменилось. Установка почтового сервера до сих пор сложна (если не заниматься этим каждый день). Что-то стало проще, что-то — сложнее, но в общем и целом всё как было, так и осталось.

Несколько полезных ссылок по теме, актуальных на данный момент:

Но, в любом случае, готовым рецептам следовать нельзя. Со временем что-нибудь может поменяться, как, например, случилось с конфигурацией OpenSMTPD, и большинство статеек в итернете потеряло смысл. Но, официальная документация всегда остаётся лучшим источником, даже если она трудна для понимания (многим проектам до сих пор нужен хороший технический писатель). Вот, например,

Этот пост основан на моих заметках, что я делал в ходе установки. Это была серия проб и ошибок, поэтому я перегруппировал последовательность действий, на случай если бы я делал всё заново и быстро.

Пакеты

Вначале надо установить нужные пакеты. Я использую <a href="https://www.freebsd.org/">FreeBSD</a>, и первым делом надо вырубить древний sendmail, который они до сих пор держат в системе. Добавляем в /etc/rc.conf такие строчки:

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"

Я не помню, то-ли я перезагружался после этого, то-ли просто остановил сервис sendmail. Делайте как вам нравится, главное проверьте, чтобы sendmail не был запущен.

И тогда устанавливаем пакеты:

pkg install opensmtpd rspamd opensmtpd-filter-rspamd dovecot

Rspamd

Сервер SMTP зависит от Rspamd, так что лучше начать с настройки Rspamd. Создаём каталог:

mkdir /usr/local/etc/rspamd/local.d

Rspamd генерирует подписи DKIM, что в наше время необходимо, так что дополнительные сервисы, типа DKIM proxy не нужны. Нам надо сгенерировать ключи для DKIM. Сначала создаём для них каталог:

mkdir /usr/local/etc/mail/dkim

(каталог /usr/local/etc специфичен для FreeBSD, в Линуксе конфигурация не разделена, поэтому пользуемся /etc)

Генерируем ключи DKIM:

openssl genrsa -out /usr/local/etc/mail/dkim/declassed.art.key 2048
openssl rsa -in /usr/local/etc/mail/dkim/declassed.art.key -pubout -out /usr/local/etc/mail/dkim/declassed.art.key.pub

Создаём файл конфигурации /usr/local/etc/rspamd/local.d/dkim_signing.conf:

allow_username_mismatch = true;

domain {
    declassed.art {
        path = "/usr/local/etc/mail/dkim/declassed.art.key";
        selector = "20210512";
    }
    # add more domains to this section if necessary
}

Устанавливаем правильные права доступа:

chgrp -R rspamd /usr/local/etc/mail/dkim
chmod -R g+r /usr/local/etc/mail/dkim

SMTPD

После изучения вопроса я остановился на OpenSMTPD. Пацаны сделали вещь, которая сильно облегчает жизнь.

Вот файл конфигурации для OpenSMTPD, /usr/local/etc/mail/smtpd.conf:

local_if=lo0
ext_if=vtnet0

pki mail.declassed.art cert "/etc/mail/certificates/mail.declassed.art.crt"
pki mail.declassed.art key "/etc/mail/certificates/mail.declassed.art.key"

table aliases file:/etc/mail/aliases
table domains file:/etc/mail/domains
table passwd file:/etc/mail/passwd
table virtuals file:/etc/mail/virtuals

filter   "rdns" phase connect match   !rdns disconnect "550 DNS error"
filter "fcrdns" phase connect match !fcrdns disconnect "550 DNS error"
filter "rspamd" proc-exec "opensmtpd-filter-rspamd"

listen on $local_if
listen on $ext_if port 25 tls pki mail.declassed.art filter "rspamd"
listen on $ext_if mask-src port 587 tls-require pki mail.declassed.art auth &lt;passwd&gt; filter "rspamd"

srs key "hDaewwP4CZCQai7N5FLwzmUty+HYJEkgRxTVb7m4"
srs key backup "Q4U/gzSmRfWQPRdyO09JG0IE5RYNokWdtlxsZZIv"

action "RECV_LOCAL" mbox alias &lt;aliases&gt;
action "RECV" lmtp "/var/run/dovecot/lmtp" rcpt-to virtual &lt;virtuals&gt;
action "SEND" relay srs

match from any for domain &lt;domains&gt; action "RECV"
match from local for local action "RECV_LOCAL"
match from any auth for local action "RECV"
match from any auth for any action "SEND"

Первым делом надо получить от Let's Encrypt TLS сертификат для шифрования соединений SMTP. В принципе, никто не мешает приобрести сертификат от любой другой конторы, но Let's Encrypt пока единственные, кто раздаёт сертификаты бесплатно, и это лучше, чем пользоваться самоподписанными.

Хотя Let's Encrypt существует уже несколько лет, я им до этого не пользовался. Впрочем, было один раз пару лет назад, но я всё забыл. На работе мы пользовались платными сертификатами и обновляли их раз в год вручную.

Получение сертификата от Let's Encrypt достойно отдельного поста. Пока что скажу вкратце: я споткнулся на простом вопросе: нужен или нет адрес электронной почты чтобы создать аккаунт в Let's Encrypt? Для почтового сервера это как проблема яйца и курицы: если ты ставишь себе почтовик, почтового адреса у тебя ещё нет.

Все авторы, от Certbot до acme.sh говорят: "Глянь как легко пользоваться нашими поделками! Это занимает максимум 3 минуты!"

Но я за три минуты ответа на свой вопрос не нашёл. Я полез в RFC 8555 и в итоге написал своего собственного клиента для протокола ACME. И уже потом, когда я его написал, я нашёл опцию в Certbot, которая отключает запрос адреса email.

В любом случае, пользуйтесь тем, что вам нравится, главное — получить сертификат. Вот соответствующие строчки в /usr/local/etc/mail/smtpd.conf для него:

pki mail.declassed.art cert "/etc/mail/certificates/mail.declassed.art.crt"
pki mail.declassed.art key "/etc/mail/certificates/mail.declassed.art.key"

Не забудьте о правах на файлы. Секретный ключ не должен быть доступен всем подряд.

Следующий шаг — создание аккаунта vmail:

pw user add vmail -m -c "Virtual Mail" -d /var/vmail -s /sbin/nologin

Для Линукс это выглядело бы так:

useradd -m -c "Virtual Mail" -d /var/vmail -s /sbin/nologin vmail

Создаём aliases, domains, virtuals, passwd, которые упоминаются в конфигурации:

table aliases file:/etc/mail/aliases
table domains file:/etc/mail/domains
table passwd file:/etc/mail/passwd
table virtuals file:/etc/mail/virtuals

/etc/mail/aliases уже был у меня в системе, я только добавил в его начало:

root:   axy@declassed.art

/etc/mail/domains содержит список доменов, которые обслуживает сервер SMTP. В простейшем случае он содержит одну строчку:

declassed.art

/etc/mail/passwd содержит хэши паролей для сервера SMTP. К примеру,

axy@declassed.art $6$Bix2vmEWTs7OXCEQ$MoIypMnb5dVGNlD9Bogqf9hj1CGKf2x9deIKv3q.In7mI7sErPn/fZQU6n6/pImR9JXpQXDqP05S0m5eo11Ap/

Хэш пароля можно сгенерировать такой командой:

smtpctl encrypt

Для нескольких паролей это можно сделать одной командой:

cat file-with-passwords-only | smtpctl encrypt

Не совсем удобно управлять пользователями таким способом. Но я не знаю как по-другому, для меня сойдёт как есть.

Есть ещё одна проблема с паролями: Dovecot не может использовать тот же самый файл. Раньше мог, а теперь хочет то же самое, только в другом формате:

axy@declassed.art:$6$Bix2vmEWTs7OXCEQ$MoIypMnb5dVGNlD9Bogqf9hj1CGKf2x9deIKv3q.In7mI7sErPn/fZQU6n6/pImR9JXpQXDqP05S0m5eo11Ap/::::::

Так что для облегчения жизни нужен скрипт, чтобы генерировать файл паролей для Dovecot. Но, для меня опять же сойдёт как есть. Я пока что не предоставляю почту для широких масс и мне пофиг.

Ключи SRS — это просто случайные строки. Их можно сгенерировать такой командой:

head -c 30 /dev/urandom | base64

Эти ключи рекомендуют менять раз в год.

Записи DNS

Чтобы принимать почту необходима и достаточна запись MX. Пример:

declassed.art. IN MX 10 mail.declassed.art.

Имя mail.declassed.art должно разрешаться в конкретный IP адрес, неважно как. После добавления записи MX можно запустить smtpd и попробовать принять почту. Процесс в целом завершится ошибкой, потому что Dovecot ещё не работает и письмо не может быть доставлено получателю, но конкретно приём почты должен пройти без ошибок, это можно проверить в логах.

Остальные записи DNS нужны для отправки почты, чтобы получатели не трактовали письма как спам.

Добавляем запись SPF:

declassed.art. IN TXT "v=spf1 mx -all"

Добавляем запись DKIM:

20210512._domainkey.declassed.art. IN TXT ("v=DKIM1; t=s; h=sha256; p=long long long public
                                        key from file /usr/local/etc/mail/dkim/declassed.art.key.pub;")

Здесь мы разбиваем значение TXT на несколько строк, потому что в конфигурации зоны сервера BIND строки не могут быть длиннее 256 символов. 20210512 — это селектор, который мы указывали в файле /usr/local/etc/rspamd/local.d/dkim_signing.conf

Добавляем запись DMARC:

_dmarc.declassed.art. IN TXT  "v=DMARC1;p=reject;aspf=s;adkim=s;pct=100;fo=1;ruf=mailto:axy@declassed.art;"

Здесь задаётся довольно жёсткая конфигурация, в основном, для выявления собственных косяков.

Dovecot

Копируем образец конфигурации:

cp -a /usr/local/etc/dovecot/example-config/* /usr/local/etc/dovecot/

Генерируем параметры для протокола Диффи-Хеллмана:

openssl dhparam -out /usr/local/etc/dovecot/dh.pem 4096

Создаём файл паролей /etc/mail/passwd.dovecot из /etc/mail/passwd (см. выше).

Правим конфигурацию:

/usr/local/etc/dovecot/dovecot.conf
-----------------------------------

#protocols = imap pop3 lmtp submission
+protocols = imap lmtp


/usr/local/etc/dovecot/conf.d/10-auth.conf
------------------------------------------

-!include auth-system.conf.ext
+#!include auth-system.conf.ext

+
+passdb {
+  driver = passwd-file
+  args = scheme=SHA512-CRYPT username_format=%Lu /etc/mail/passwd.dovecot
+}
+
+userdb {
+  driver = passwd-file
+  args = username_format=%Lu /etc/mail/passwd.dovecot
+  override_fields = uid=vmail gid=vmail home=/var/vmail/%Lu
+}


/usr/local/etc/dovecot/conf.d/10-mail.conf
------------------------------------------

-#mail_location =
+mail_location = maildir:~/Maildir


/usr/local/etc/dovecot/conf.d/10-master.conf
--------------------------------------------

service lmtp {
unix_listener lmtp {
    #mode = 0666
+    user  = vmail
+    group = vmail
}


/usr/local/etc/dovecot/conf.d/10-ssl.conf
-----------------------------------------

#ssl = yes
+ssl = required

-ssl_cert = &lt;/etc/ssl/certs/dovecot.pem
-ssl_key = &lt;/etc/ssl/private/dovecot.pem
+ssl_cert = &lt;/etc/mail/certificates/mail.declassed.art.crt
+ssl_key = &lt;/etc/mail/certificates/mail.declassed.art.key

-#ssl_dh = &lt;/usr/local/etc/dovecot/dh.pem
+ssl_dh = &lt;/usr/local/etc/dovecot/dh.pem

-#ssl_min_protocol = TLSv1
+ssl_min_protocol = TLSv1.2

#ssl_prefer_server_ciphers = no
+ssl_prefer_server_ciphers = yes

Разрешаем и запускаем сервисы

Разрешаем запуск сервисов в /etc/rc.conf:

rspamd_enable="YES"
smtpd_enable="YES"
dovecot_enable="YES"

Запускаем:

service rspamd start
service dovecot start
service smtpd start

Как насчёт почтового клиента???

Я использую Thunderbird. В нём есть несколько недостатков, с которыми я сразу же столкнулся, но в общем и целом он работает нормально.

Ты, мой читатель, можешь использовать любой SMTP/IMAP клиент. Параметры соединения вполне обычные. Для SMTP: порт 587, STARTTLS. Для IMAP порт 993, SSL/TLS. Метод авторизации "Normal password" в обоих случаях.

Вэб клиенты мне не нравятся. Некоторые вполне ничего, но я хочу свой. В конце концов я пока ещё программист и мне нравится ковырятся с почтой. Но пока что на это нет времени.

Разные заметки

Не забыть настроить автообновление сертификата TLS.

Не забыть перегенерировать ключи DKIM раз в год.

Не забыть перегенерировать ключи SRS раз в год.

Не забыть настроить резервный SMTP релей.

Как проверить конфигурацию smtpd:

smtpd -n

Как проверить правильность записей DNS: отправить письмо на аккаунт gmail. Если оно попало в спам — посмотреть исходник сообщения. Там выводится статус проверки DKIM.

Comments

Loading...