Настройка Dovecot

Заключительная часть базовой настройки почтового сервера. Который будет выполнять полноценную работу: функции приема, хранения и отправки сообщений. Обеспечивать возможность подключения через почтовые клиенты.

pacman -S dovecot
# dovecot --version
2.4.2 (0962ed2104)

Включаем автозагрузку:

systemctl enable dovecot

Создай пользователя и группу vmail:

getent passwd vmail || useradd -r -d /srv/mail -s /usr/bin/nologin vmail
getent group vmail  || groupadd -r vmail
usermod -g vmail vmail 2>/dev/null || true

Назначим права на каталог почты:

install -d -o vmail -g vmail -m 0770 /srv/mail
chown -R vmail:vmail /srv/mail

Открываем конфигурационный файл:

nano /etc/dovecot/dovecot.conf

Сотрите все содержимое файла и добавьте параметры ниже.

# -------------------------------------------------------------------
# Include / modular config
# -------------------------------------------------------------------
!include_try conf.d/*.conf


# -------------------------------------------------------------------
# Protocols
# Enable the required protocols:
# - IMAP for mailbox access
# - LMTP for local mail delivery (e.g., from Postfix)
# -------------------------------------------------------------------
protocols {
  imap = yes
  lmtp = yes
}


# -------------------------------------------------------------------
# Mail storage (Maildir)
# Store mail in Maildir format under user's home directory
# -------------------------------------------------------------------
mail_driver = maildir
mail_path = ~/Maildir

namespace inbox {
  inbox = yes
  separator = /

  mailbox Trash {
    auto = create
    special_use = \Trash
  }
}

# -------------------------------------------------------------------
# Authentication (virtual users from file, no PAM)
# IMPORTANT:
# Do NOT use PAM to avoid binding authentication to system users.
# Authenticate virtual users from a password file instead.
# -------------------------------------------------------------------
auth_username_format = %{user | username}
auth_mechanisms = plain login

passdb passwd-file {
  passwd_file_path = /etc/dovecot/passwd
}

userdb static {
  fields {
    uid  = vmail
    gid  = vmail
    home = /srv/mail/%{user | username}
  }
}

# -------------------------------------------------------------------
# TLS / SSL
# Require TLS and use Let's Encrypt certificates
# -------------------------------------------------------------------
ssl = required
ssl_server {
  cert_file = /etc/letsencrypt/live/mx.codebeer.ru/fullchain.pem
  key_file  = /etc/letsencrypt/live/mx.codebeer.ru/privkey.pem
  dh_file   = /etc/dovecot/dh.pem
}

ssl_server_prefer_ciphers = server
ssl_min_protocol = TLSv1.2


# -------------------------------------------------------------------
# Services / sockets for Postfix integration
# -------------------------------------------------------------------
# LMTP socket for Postfix -> Dovecot delivery (to Maildir)
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
}

# SASL auth socket for Postfix (submission/587)
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}

Обратите внимание на строки:

cert_file = /etc/letsencrypt/live/mx.codebeer.ru/fullchain.pem
key_file  = /etc/letsencrypt/live/mx.codebeer.ru/privkey.pem

Здесь нужно указать свой путь к файлам сертификата и ключа.

Далее необходимо сгенерировать сертификат Диффи-Хелмана:

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

Откройте /etc/postfix/main.cf
Добавьте в конец файла:

local_transport = lmtp:unix:private/dovecot-lmtp
local_recipient_maps =

Примените настройки:

postfix check
systemctl reload postfix

Далее необходимо создать файл с логинами и паролями, для подключения пользователей к почтовому серверу.
В примере ниже, я создаю аккаунт admin:

PASS='yFUTHESZIoqvLtFkbqiXbPypxIUQfcPL'
HASH="$(doveadm pw -s BLF-CRYPT -p "$PASS")"

printf "admin:%s\n" "$HASH" | tee /etc/dovecot/passwd >/dev/null
chown root:dovecot /etc/dovecot/passwd
chmod 640 /etc/dovecot/passwd

Перезапускаем Dovecot

systemctl restart dovecot

Включаем автозагрузку Dovecot, делаем рестарт сервиса, проверяем состояние процесса.

mkdir -p /etc/systemd/system/dovecot.service.d

cat > /etc/systemd/system/dovecot.service.d/restart.conf <<'EOF'
[Unit]
StartLimitIntervalSec=300
StartLimitBurst=5

[Service]
Restart=on-failure
RestartSec=5s
EOF

Применяем настройки:

systemctl daemon-reload
systemctl restart dovecot

Проверим, что Dovecot подымается после падения:

kill -9 $(pidof dovecot | awk '{print $1}')
sleep 2
systemctl --no-pager -l status dovecot
journalctl -u dovecot -n 30 --no-pager

После настройки необходимо выполнить базовую проверку работы авторизации:

doveadm auth test 'admin' 'ТВОЙ_ПАРОЛЬ'

Должно отобразится сообщение:

passdb: admin auth succeeded
extra fields:
  user=admin

Отправка тестового сообщения:

echo test | sendmail -v [email protected]
Mail Delivery Status Report will be mailed to .
# find /srv/mail/admin/Maildir -maxdepth 2 -type f \( -path '*/new/*' -o -path '*/cur/*' \) | tail
/srv/mail/admin/Maildir/cur/1770504820.M330643P8692.mx.codebeer.ru,S=1006,W=1029:2,a
/srv/mail/admin/Maildir/cur/1770504816.M697890P8676.mx.codebeer.ru,S=1006,W=1029:2,a

Postfix настройка OpenDKIM

В этой записи я опишу процесс настройки OpenDKIM для почтового сервера Postfix. Следует отменить, этот этап настроек следует выполнять очень внимательно. Можно запутаться на этапе подготовки к генерации ключей. Поэтому я выделил эту задачу в отдельный пост.

Устанавливаем OpenDKIM и копируем базовый настройки файл:

pacman -S opendkim
install -d /etc/opendkim

Создайте файл:

nano /etc/opendkim/opendkim.conf

Скопируйте в конец файла либо примените настройки к следующему виду:

Mode                    sv
SendReports yes
KeyTable                refile:/etc/opendkim/KeyTable
SigningTable            refile:/etc/opendkim/SigningTable
ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts
Socket                  local:/run/opendkim/opendkim.sock
UMask                   002

Создайте файл /etc/opendkim/SigningTable. Селектор можно выбрать любой, у меня — mail, домен — codebeer.ru меняете на ваш.
Имя DKIM-записи в DNS всегда такое <selector>._domainkey.<domain>

*@codebeer.ru mail._domainkey.codebeer.ru

Создайте файл /etc/opendkim/KeyTable

mail._domainkey.codebeer.ru  codebeer.ru:mail:/etc/opendkim/keys/codebeer.ru/mail.private

Аналогично селектор указываете такой же, как в предыдущем пункте, у меня mail, домен codebeer.ru, вы меняете значения на свои.

Создайте файл TrustedHosts

cat > /etc/opendkim/TrustedHosts <<'EOF'
127.0.0.1
localhost
::1
mx.codebeer.ru
EOF

Домен codebeer.ru меняете на ваш.

Далее генерируем ключи.

pacman -S perl
mkdir -p /etc/opendkim/keys/codebeer.ru
opendkim-genkey -b 2048 -d codebeer.ru -D /etc/opendkim/keys/codebeer.ru -s mail -v

Назначаем права на файлы:

chown -R opendkim:opendkim /etc/opendkim/keys/codebeer.ru
chmod 0400 /etc/opendkim/keys/codebeer.ru/mail.private

Установите права на сокет, для этого добавьте postfix в группу opendkim:

gpasswd -a postfix opendkim

Добавляем OpenDKIM в автозагрузку и перезапускаем Postfix:

systemctl enable --now opendkim
systemctl restart postfix

Авто-перезапуск при падении opendkim:

mkdir -p /etc/systemd/system/opendkim.service.d

cat > /etc/systemd/system/opendkim.service.d/restart.conf <<'EOF'
[Unit]
StartLimitIntervalSec=300
StartLimitBurst=5

[Service]
Restart=on-failure
RestartSec=5s
EOF

Применяем настройки:

systemctl daemon-reload
systemctl restart opendkim

Убиваем процесс opendkim, что бы убедится что он подымится снова:

pkill -9 opendkim
sleep 2
systemctl status opendkim --no-pager

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

Добавляем в DNS TXT запись с именем mail._domainkey и значением:

cat /etc/opendkim/keys/codebeer.ru/mail.txt

Важно удалить все кавычки в середине текста. Запись должна выглядеть следующим образом:

"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuxfSSuNL66k9K7d/maqp39cMANuqlHthD+4w7F9ck0NOFbKoYwJxFL7XiZi2tQPM/8HdITuKPG/a9n2qiLtTWzKzv5bsoY4bnjkCzycRcV/uK8XrfZg6yni3UmaFuN10q6bJVZ77ePRIjqQGiHUrgTqTiS6X/EmxiMmPNUf5BQhDKw/N3rdf2gm8suVVP1je+YZrVqdnXesyEJl3SqBuIGZrp8x9BD5abkF4069BsSOm5OqLsr6Eioc/7zWTETraNcGbPROtNKQenEEmWnPpGFYgxtxcagSadm05vjVtKUIukGABot2UleLVsZDwiFGfnSmStvWXQmFWlu1Rtne9cwIDAQAB"

Тест ключа:

[root@mx opendkim]# opendkim-testkey -d codebeer.ru -s mail -vvv
opendkim-testkey: using default configfile /etc/opendkim/opendkim.conf
opendkim-testkey: checking key 'mail._domainkey.codebeer.ru'
opendkim-testkey: key not secure
opendkim-testkey: key OK

Следующий этап настройки Настройка Dovecot

Postfix настройка TLS шифрования

Продолжаем настройку нашего почтового сервера Postfix на Arch Linux. В этой статье я опишу процесс настройки TLS шифрования для Postfix. Сертификаты будем использовать от Let’s Encrypt. Для этого установим необходимые пакеты:

pacman -Syu certbot certbot-nginx nginx

Создадим каталог для конфигов Nginx:

mkdir -p /etc/nginx/conf.d

Далее необходимо добавить загрузку конфигов из каталога conf.d

nano /etc/nginx/nginx.conf

Внутри блока http { ... } в конце файла добавь строку:

include conf.d/*.conf;

Базовые настройки сайта для генерирования сертификатов от Let’s Encrypt. Не забываем менять домен на свой.

cat > /etc/nginx/conf.d/mx.codebeer.ru.conf <<'EOF'
server {
      listen 80;
      listen [::]:80;
      server_name mx.codebeer.ru;

      root /var/lib/letsencrypt;

      location ~ /.well-known/acme-challenge {
         allow all;
      }
}
EOF

Применяем настройки:

systemctl enable nginx
systemctl restart nginx

Авто-рестарт Nginx при падении:

mkdir -p /etc/systemd/system/nginx.service.d

cat > /etc/systemd/system/nginx.service.d/restart.conf <<'EOF'
[Unit]
StartLimitIntervalSec=300
StartLimitBurst=5

[Service]
Restart=on-failure
RestartSec=5s
EOF

Применяем настройки:

systemctl daemon-reload
systemctl restart nginx
systemctl --no-pager -l status nginx

Может высветится вот такое предупреждение:

Feb 07 00:10:05 mx.codebeer.ru systemd[1]: Starting nginx web server...
Feb 07 00:10:05 mx.codebeer.ru nginx[16960]: 2026/02/07 00:10:05 [warn] 16960#16960: could not build optimal types_hash, you should increase either types_hash_max_size: 1024 or types_hash_bucket_size: 64; ignoring types_hash_bucket_size
Feb 07 00:10:05 mx.codebeer.ru systemd[1]: Started nginx web server.

Предупреждение types_hash не критично, но лучше поправить:

nano /etc/nginx/nginx.conf

Внутри блока http { ... } добавить:

types_hash_max_size 2048;
types_hash_bucket_size 128;

Убьём процесс nginx, systemd должен поднять снова:

pkill -9 nginx
sleep 2
systemctl status nginx --no-pager

Nginx настроен. Теперь можно переходить непосредственно к выпуску сертификат:

certbot --nginx -d mx.codebeer.ru

В процессе вас попросят указать ваш email, принят правила сервиса и вы можете разрешить принимать информационную рассылку на ваш email или отказаться.

Сертификат и ключ будет записан по указанному пути:

/etc/letsencrypt/live/mx.codebeer.ru/fullchain.pem
/etc/letsencrypt/live/mx.codebeer.ru/privkey.pem

Дале включаем автоматический перевыпуск сертификата:

systemctl enable --now certbot-renew.timer
systemctl status certbot-renew.timer --no-pager
systemctl list-timers | grep certbot

После этого systemd будет запускать обновление сертификата по расписанию.

Включаем шифрование в Postfix

Нужно внести изменения в master.cf

nano /etc/postfix/master.cf

Добавить в файл:

submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

Прописываем TLS сертификат для Postfix:

postconf -e "smtpd_tls_cert_file = /etc/letsencrypt/live/mx.codebeer.ru/fullchain.pem"
postconf -e "smtpd_tls_key_file = /etc/letsencrypt/live/mx.codebeer.ru/privkey.pem"

Чтобы отключить небезопасные версии SSL/TLS, добавьте в конец файла /etc/postfix/main.cf:

smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

Далее отключим авторизацию на порте 25. Это нужно что бы подключаться к серверу можно было только через порты с шифрованием.

smtpd_tls_auth_only = yes

Применяем настройки:

postfix reload
systemctl restart postfix

Следующий этап настройки Postfix настройка OpenDKIM

Настройка Postfix на Arch Linux

Последнее время мне приглянулся дистрибутив Arch Linux. Вообще я симпатизирую «rolling release» философии — поддержка постоянного актуального состояния системы. Я пока не проверил на практике, насколько стабильно работает Arch Linux, но в целом идея замечательная. Сервера я использую в рабочих целях, поэтому, необходимо обеспечить стабильную работу системы. Проблема в том, что установка обновлений, есть угроза что-то сломать. Для компенсации этого недостатка, я намерен компенсировать регулярными бэкапами, что которые и так у меня регулярно выполняются. Сейчас я использую Alma Linux. Но мне надоели форки RHEL, поэтому, возникла задача на практике пощупать Arch Linux и понять, насколько эта система подходит мне для рабочей среды.

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

IPv4 у меня настроен на этапе установки Arch Linux, поэтому, мне останется только прописать настройки IPv6. На этом этапе я остановлюсь более подробно. В моем случае IPv6 адрес 2001:41d0:11c:c700::/56, а шлюз fe80:0000:0000:0000:0000:0000:0000:0001. В сокращенном виде шлюз fe80::1, его я и буду использовать далее.

Настройка IPv6

Сейчас нам необходимо прописать IPv6 на уровне настроек сети. У меня настройки хранятся в файле 20-ens18.network, имя конфига может отличаться от вашего.

nano /etc/systemd/network/20-ens18.network

В секцию [Network] нужно добавить IPv6 адрес и параметр IPv6AcceptRA=no

[Network]
Address=2001:41d0:11c:c700::777/64
IPv6AcceptRA=no

Далее ниже еще одну дублирующую секцию [Route]

[Route]
Gateway=fe80::1
GatewayOnLink=yes

В итоге конфиг стал выглядеть следующим образом:

[Match]
Name=ens18

[Network]
Address=51.51.5.15/32
Gateway=100.64.0.1
DNS=1.1.1.1
DNS=8.8.8.8

Address=2001:41d0:11c:c700::777/64
IPv6AcceptRA=no

[Route]
Gateway=100.64.0.1
GatewayOnLink=yes

[Route]
Gateway=fe80::1
GatewayOnLink=yes

Сохраняем файл и применяем настройки командой:

systemctl restart systemd-networkd

Проверяем, что IPv6 поднялся:

# ping -6 -c 3 2001:4860:4860::8888
PING 2001:4860:4860::8888 (2001:4860:4860::8888) 56 data bytes
64 bytes from 2001:4860:4860::8888: icmp_seq=1 ttl=112 time=4.52 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=2 ttl=112 time=4.52 ms
64 bytes from 2001:4860:4860::8888: icmp_seq=3 ttl=112 time=4.52 ms

Настройка синхронизации времени

Находим свой часовой пояс и меняем настройки синхронизации:

timedatectl list-timezones | grep -i helsinki
timedatectl set-timezone Europe/Helsinki

Включаем автоматическую синхронизацию времени:

timedatectl set-ntp true

Проверяем статус:

timedatectl
timedatectl timesync-status

Настройка DNS записей

На этом этапе необходимо создать A, AAAA и MX записи для нашего почтового домена. Я не буду подробно описывать этот процесс.

Прописываем SPF запись для всех ip с которых будет вестись отправка почты:

"v=spf1 ip4:1.1.1.1 -all"

Если у вас два или более почтовых сервера:

"v=spf1 ip4:1.1.1.1 ip4:2.2.2.2 -all"

Следует отметить, что для SPF записи нужно используются кавычки, как указано у меня в примере.

Установка Postfix

Устанавливаем Postfix, включаем автозапуск, проверяем статус:

pacman -Syu postfix postfix-lmdb
systemctl enable --now postfix
systemctl status postfix --no-pager

Проверить версию Postfix можно командой:

# postconf mail_version
mail_version = 3.10.7

Проверяем открытые порты:

# ss -lnpt | grep master
LISTEN 0      0            0.0.0.0:25        0.0.0.0:*    users:(("master",pid=11439,fd=13))

Видно, что с настройками по умолчанию используется только IPv4 адрес.

Убедимся, что имя хоста соответствует нашему почтовому домену:

# cat /etc/hostname
mx.codebeer.ru

Приводим /etc/hosts к следующему виду:

127.0.0.1   localhost
::1         localhost
51.51.5.15 mx.codebeer.ru mx

Далее набор настроек Postfix, которые необходимы для работы почтового сервера. Вам необходимо выполнить команды по порядку:

Базовая идентификация сервера:

postconf -e "inet_interfaces = all"
postconf -e "myhostname = mx.codebeer.ru"
postconf -e "mydomain = codebeer.ru"
postconf -e "myorigin = codebeer.ru"
postconf -e "mydestination = codebeer.ru, \$myhostname, localhost.\$mydomain, localhost"

Доверенные сети:

postconf -e "mynetworks = 127.0.0.0/8 [::1]/128"

Локальная доставка:

postconf -e "home_mailbox = Maildir/"

Ограничения на релей и получателей:

postconf -e "smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination"
postconf -e "smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination"

Лимиты размеров:

postconf -e "message_size_limit = 36700160"
postconf -e "mailbox_size_limit = 0"

SMTP AUTH (SASL через Dovecot):

postconf -e "smtpd_sasl_auth_enable = no"
postconf -e "smtpd_sasl_type = dovecot"
postconf -e "smtpd_sasl_path = private/auth"
postconf -e "smtpd_sasl_security_options = noanonymous"
postconf -e "smtpd_sasl_tls_security_options = noanonymous"

OpenDKIM:

postconf -e "milter_default_action = accept"
postconf -e "milter_protocol = 6"
postconf -e "smtpd_milters = unix:/run/opendkim/opendkim.sock"
postconf -e "non_smtpd_milters = unix:/run/opendkim/opendkim.sock"

TLS для исходящих соединений:

postconf -e "smtp_tls_security_level = may"
postconf -e "smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt"
postconf -e "smtp_tls_loglevel = 1"
postconf -e "smtp_tls_session_cache_database = btree:\${data_directory}/smtp_scache"
postconf -e 'smtp_tls_session_cache_database = lmdb:/var/lib/postfix/smtp_scache'
postconf -e 'smtpd_tls_session_cache_database = lmdb:/var/lib/postfix/smtpd_scache'

Теперь необходимо сгенерировать базу алиасов.

Для начала создадим алиас для root:

echo "root: admin" >> /etc/postfix/aliases

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

# postalias /etc/postfix/aliases
# ls -l /etc/postfix/aliases*
-rw-r--r-- 1 root root 11516 Dec  7 15:08 /etc/postfix/aliases
-rw-r--r-- 1 root root 20480 Feb  2 14:29 /etc/postfix/aliases.lmdb

Если нужно что бы Postfix работал только через IPv4 протокол:

postconf -e "inet_protocols = ipv4"

Для IPv4 и IPv6:

postconf -e "inet_protocols = all"

Применяем настройки Postfix:

systemctl restart postfix

Проверка, что Postfix слушает 25 порт:

# ss -lntp | grep ':25'
LISTEN 0      0            0.0.0.0:25        0.0.0.0:*    users:(("master",pid=15085,fd=13))
LISTEN 0      0                  *:25              *:*    users:(("master",pid=15085,fd=14))

Отправляем тестовое письмо на свою почту. Адрес в конце команды нужно поменять на свой.

echo "Test from mx.codebeer.ru" | sendmail -v [email protected]

Включить автоматический запуск Postfix в случае падения

Необходимо создать drop-in файл :

mkdir -p /etc/systemd/system/postfix.service.d

cat > /etc/systemd/system/postfix.service.d/restart.conf <<'EOF'
[Unit]
StartLimitIntervalSec=300
StartLimitBurst=5

[Service]
Restart=on-failure
RestartSec=5s
EOF

Применяем настройки:

systemctl daemon-reload
systemctl restart postfix

Проверяем работает ли автоматическое поднятие сервиса:

pkill -9 master
sleep 2
systemctl status postfix --no-pager

В случае проблем, для анализа причины и устранения используем лог:

journalctl -u postfix -n 200 --no-pager

Следующий этап настройки Postfix настройка TLS шифрования