ПОЧТОВЫЙ СЕРВЕР IREDMAIL

iRedMail postfix logo2

 

Редакция 2024

Обожаю такие продукты. Они как будто специально разработаны заботливыми людьми для самых маленьких и тупых. Я раньше думал, что почтовый сервер - это невероятно-сложная штука, как в Винде, так и в Linux. Теперь оказывается что его может установить практически любая обезьяна, причем весь процесс займет около пяти минут. Примечательно, я как-то ввставлял заказ на фрилансе на решение этой задачи на Odroid XU-4, а это было в довоенные времена, и там большинство ответивших чуваков хотели 2 килорубля. Уже не помню, почему, но тогда мне это показалось слишком много. Держу пари, они не учитывали того маленького нюанса, что на компьютерах с arm-архитектурой  iRedMail  не работает, однако, если вручную с нуля поднимать Postfix, Dovecot, fail2ban, Roundcube и прочие компоненты сервиса, то это, пожалуй, даже маловато. Теперь у меня таких проблем нет, мне повезло урвать по-дешевке несколько материнских плат intel nuc core i5  и похоже, что корейский одноплатник скоро отправится на покой.

 

Итак, приступим.

Во-первых, для работы с внешним миром, нам нужно правильно прописать DNS записи. В моем случае это выглядит так:

mail.madmentat.ru. 	A 	31.134.139.98
mail.madmentat.ru. 	MX 	10 mail.madmentat.ru.
mail.madmentat.ru. 	PTR 	31.134.139.98

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

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

sudo nano /etc/hostname

mail

Еще надо подправить

sudo nano /etc/hosts

127.0.0.1 localhost
127.0.1.1 mail

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Здесь исходная строка "127.0.0.1 localhost" заменена на "127.0.0.1 mail.madmentat.ru mail localhost". Все что касается ipv6, можно нахуй удалить.

Теперь не помешает убедиться, что у нас хватит оперативки и объема файла подкачки.

sudo apt install htop

sudo htop

Если все оперативки больше 2 Гб и файл подкачки больше 1 Гб, тогда все ок. Для машины с 2-мя абонентами хватит. Однако для большего количества следует руководствоваться следующими рекомендциями:

Оперативная память:

  • Минимальный объем: 4 Гб для небольшого сервера с 100-200 абонентами.
  • Рекомендованный объем: 8 Гб для средних серверов с 500-1000 абонентами.
  • Для крупных серверов: Рекомендуется 16 Гб и выше, в зависимости от нагрузки.


Своп-файл:

  • Размер своп-файла: В идеале, размер своп-файла должен быть равен объему оперативной памяти или даже в 2 раза больше.

 

Кроме того, есть условная формула:

Объем оперативной памяти (Гб) = (количество абонентов / 100) *2

То есть,

Для 500 абонентов: (500 / 100) * 2 = 10 Гб
Для 1000 абонентов: (1000 / 100) * 2 = 20 Гб

О том, как настроить своп-файл, можно прочитать здесь.

 

Наконец, займемся непосредственно установкой iRedMail. На сегодня актуальная версия 1.7.1. И устанавливается она на самую свежую Убунту. То есть, 24.04 в нашем случае.

wget -O iRedMail-1.7.1.tar.gz https://github.com/iredmail/iRedMail/archive/refs/tags/1.7.1.tar.gz

Далее переходим в папку Downloads

cd ~/Downloads

tar -zxvf iRedMail-1.7.1.tar.gz

cd iRedMail-1.7.1

chmod +x iRedMail.sh

sudo ./iRedMail.sh

Имеем в виду, что для веб-морды нужен веб-сервер и тут главное не запутаться. Если вы собираетесь делать веб-морду на nginx, а на компе установлен, например, Апач, то Апач надо остановить или вовсе деинсталировать. Я лично предпочел установить iRedMail на отдельный комп, без всяких лишних сервисов, на nginx. В ходе установки особых сложностей возникнуть не должно, там все предельно ясно.

iredmail2

iredmail03

iredmail04

iredmail05

iredmail06

iredmail07

iredmail08

iredmail09

iredmail10

Чтобы лыжи поехали, надо пробросить порты и ребутнуться.

25, 110, 80

sudo reboot now

Затем мы можем войти в админку

https://mail.madmentat.ru/iredadmin

iredmail11

Интерфейс настолько прост, что в нем разберется даже самый тугой дурак. Тут можно добавить пользователей.

iredmail12

Веб-интерфейс расположен по адресу https://mail.madmentat.ru/mail

iredmail13

iredmail14

Еще добавлю, что тут по умолчанию какие-то сложности с паролем, требуется обязательное наличие специальных символов. Так-то оно и хорошо, но лично я не такой параноик и предпочел бы иметь в этом отношении побольше свободы. Поэтому лично у себя решил подправить конфиг.

Настройки по умолчанию хранятся в файле default-settings.py

sudo cat /opt/www/iredadmin/libs/default_settings.py | grep PASSWORD_HAS

PASSWORD_HAS_LETTER = True
PASSWORD_HAS_UPPERCASE = True
PASSWORD_HAS_NUMBER = True
PASSWORD_HAS_SPECIAL_CHAR = False

меняем "PASSWORD_HAS_SPECIAL_CHAR = True" на "PASSWORD_HAS_SPECIAL_CHAR = False"

sudo nano /opt/www/iredadmin/libs/default_settings.py

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

min_passwd_length = 3
max_passwd_length = 30

Теперь перезагрузим сервер.

sudo service uwsgi restart

sudo systemctl restart nginx

После установки iRedMail зачастую приходится поебать мозги с сертефикатам. Для этого мы обычно пользуемся услугами бесплатного сервиса Let's Encrypt. Для этого переходим в директорию "/etc/nginx/sites-enabled". Создаем там файл mail.conf

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

cd /etc/nginx/sites-enabled

sudo nano mail.conf

#
# Note: This file must be loaded before other virtual host config files,
#
# HTTPS
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    
    # Указываем server_name с нужными доменами
    server_name mail.madmentat.ru www.mail.madmentat.ru madmentat.ru www.madmentat.ru;

    root /var/www/html;
    index index.php index.html;

    include /etc/nginx/templates/misc.tmpl;
    include /etc/nginx/templates/ssl.tmpl;
    include /etc/nginx/templates/iredadmin.tmpl;
    include /etc/nginx/templates/roundcube.tmpl;
    include /etc/nginx/templates/sogo.tmpl;
    include /etc/nginx/templates/netdata.tmpl;
    include /etc/nginx/templates/php-catchall.tmpl;
    include /etc/nginx/templates/stub_status.tmpl;
}

Далее устанавливаем cerbot

sudo apt install certbot python3-certbot-nginx

Запускаем скрипт:

sudo certbot --nginx -d mail.madmentat.ru -d www.mail.madmentat.ru

Далее на всякий случай перезагружаемся.

sudo reboot now

Ну вот и все? А нет!

 

STARTTLLS

Проблема в том, что наш сервак теперь работает на 25-м порту, а это не по-феншуй. Получается, что любой бабуинс с wireshar-ком сможет перехватывать нашу корреспонденцию. Нам надо чтобы работал метод шифрования STARTTLS.

Сразу отмечу, что если у вас NAT и какая-то сложная система с реверс-прокси, на котором установлены сертификата сайта и т. д., то надо бы учесть, что для следующего этапа нам потребуется временно поменять проброс портов с реверс-прокси напрямую на почтовик, а этом может быть чречато некоторыми проблемами с доступом к веб-ресурсам вашей внутренней сети. Я лично спасся тем, что использую Anydesk. Правда, там пришлось попариться с черным экраном после перезагрузки, потому что по-хорошему надо бы чтобы пользователь залогинился на локальном хосте, а тут хренушки, пользоватля рядом нет... Сервак физически расположен на другом конце города, на ночь глядя ехать не резон... В итоге справился, подправил конфиг xorg и вернул доступ... По-хорошему, вам лучше не повторять моих ошибок и позаботиться об альтернативном вариенте удаленного доступа заранее. Не важно, что там у вас - Винбокс, например, извне или еще что-то - должен быть способ изменить правила проброса портов.

Итак, вернемся к нашему почтовику. Устанавливаем сертификаты...

sudo certbot certonly --standalone -d madmentat.ru -d mail.madmentat.ru

Мы можем сразу видеть, куда установились сертификаты, там будет вывод путей в терминал.

madmentat@mail:~$ sudo certbot certonly --standalone -d madmentat.ru -d mail.madmentat.ru
[sudo] password for madmentat:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for madmentat.ru and madmentat.ru

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/madmentat.ru/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/madmentat.ru/privkey.pem
This certificate expires on 2025-02-16.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Вот они, наши пути:

/etc/letsencrypt/live/madmentat.ru/fullchain.pem
/etc/letsencrypt/live/madmentat.ru/privkey.pem

Их надо скопировать куда-нибудь в блокнотик, чтобы потом вставить в конфиг Postfix. Далее открываем main.cf:

sudo nano /etc/postfix/main.cf

Там ищем "smtpd_tls_cert_file" и остальные позиции через Ctrl+W.  Можно сразу заменить весь блок, касающийся TLS. Он должен выглядеть примерно так:

# Включаем поддержку TLS
smtpd_tls_cert_file=/etc/letsencrypt/live/ard-s.ru-0001/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/ard-s.ru-0001/privkey.pem
smtpd_use_tls=yes
smtpd_tls_auth_only=yes
smtp_tls_security_level=may

# Запрет отправки без шифрования
smtpd_tls_security_level=encrypt

Вот этот параметр "smtpd_tls_security_level" по умолчанию имеет значение "may", ищем его и меняем на "encrypt". Закрываем, сохраняемся. Теперь открываем файл master.cf:

sudo nano /etc/postfix/master.cf

В конец файла добавляем следующий блок:

# Поддержка STARTTLS на 587 порту
submission inet n - n - - smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

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

sudo postfix check

Если команда не вернет никакого ответа, это хорошо. Перезагружаем сервис:

sudo systemctl restart postfix

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

openssl s_client -connect mail.madmenytat.ru:587 -starttls smtp

Забавно, если у вас нет такой возможности... Как говорится, "стрелок без спичек как глаз без ресничек". У каждого нормального сисадмина есть какой-то доступный из интернета Linux, разве не так? )

Ответ будет что-то вроде:

madmentat@Mad-PC2:~$ openssl s_client -connect mail.ard-s.ru:587 -starttls smtp
CONNECTED(00000003)
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = E6
verify return:1
depth=0 CN = ard-s.ru
verify return:1
---
Certificate chain
 0 s:CN = ard-s.ru
   i:C = US, O = Let's Encrypt, CN = E6
 1 s:C = US, O = Let's Encrypt, CN = E6
   i:C = US, O = Internet Security Research Group, CN = ISRG Root X1
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDgTCCAwagAwIBAgISBDqEinnW5nEWL3mF2CT24E0ZMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
NjAeFw0yNDExMTgxMTU0MTFaFw0yNTAyMTYxMTU0MTBaMBMxETAPBgNVBAMTCGFy
ZC1zLnJ1MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENNf5L1ODbkUtZI7Snh1X
S4ttfD31XIbVzccmhE+nz/tDzEWDEOsPtPYPOKIvU4t7xj6Fnt+ShcCNnKi3PAEK
X6OCAhkwggIVMA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAQYI
KwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBHNVHQ4EFgQUXIifMeUTBwi6uWzAVU1/
FqQjJxAwHwYDVR0jBBgwFoAUkydGmAOpUWiOmNbEQkjbI79YlNIwVQYIKwYBBQUH
AQEESTBHMCEGCCsGAQUFBzABhhVodHRwOi7vZTYuby5sZW5jci5vcmcwIgYIKwYB
BQUHMAKGFmh0dHA6Ly9lNi5pLmxlbmNyLm9yZy8wIgYDVR0RBBswGYIIYXJkLXMu
cnWCDW1haWwuYXJkLXMucnUwEwYDVR0gBAwwCjAIBgZngQwBAgEwggEEBgorBgEE
AdZ5AgQCBIH1BIHyAPAAdgCi4wrkRe+9rZt+OO1HZ3dT14JbhJTXK14bLMS5UKRH
5wAAAZM/VRikAAAEAwBHMEUCIGxLH9PdWu6BVEfbJJV2TsCQorr++sYOg/TLiLvq
aigAAiEAmCG0qW2R26SEj83zkARAG3pfrb1dABZ8MsbScFxcdZIAdgDPEVbu1S58
r/OHW9lpLpvpGnFnSrAX7KwB0lt3zsw7CAAAAZM/VRjdAAAEAwBHMEUCIDYP7ZU2
/lQQxV9hbC3lkPtMd257JRo/QCqcudAes4ffAiEAyS4A8XJIbC7rgcGiYitfn1rE
vjuC6xv8Rnvnl5f6/P4wCgYIKoZIzj0EAwMDaQAwZgIxANvbvfSjkKC1aO+X4TQ6
XmWApP6G8zZn3HDB9T9EAMioi8Pusuq5xGEJBgaWc4bS4gIxANRkmerUBVPBUhTv
N0EAZWmi7OPLpc+WBTrBXNekRDP0KJUIPfE0/hX268Cm/9xd3w==
-----END CERTIFICATE-----
subject=CN = ard-s.ru

issuer=C = US, O = Let's Encrypt, CN = E6

---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: ECDSA
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 2580 bytes and written 418 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 256 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
250 DSN
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: E50A0028454615B5A3EAF540700E43A5A71B50EB865F7AC392D13D543EAAD04B
    Session-ID-ctx:
    Resumption PSK: 313086F159F8B62E866DDBD40877502C758D61A52A82934919BD325DCDA6C47552C58BCA86C8E45C0B5EDA78306DC993
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - 83 6c 8e 73 a4 89 37 4c-74 15 c6 71 e2 8b e5 56   .l.s..7Lt..q...V
    0010 - c5 2a 2a e0 d4 dc 7a 47-17 03 4f fb 71 b7 ad 11   ./*...zG..O.q...
    0020 - 52 a5 da ec f0 f3 c2 3f-4e 25 45 e6 cf 81 48 4a   R......?N%E...HJ
    0030 - b6 6f 00 50 2c f0 ea 20-17 f3 d2 31 e8 6a 7e 82   .o.P,.. ...1.j~.
    0040 - 34 e6 64 b0 0c 2f 5d bc-da cb 63 9f 90 cf cf 1e   4.d../]...c.....
    0050 - 28 3f ca 76 cd d1 c3 92-fa a6 ab c5 a4 12 c2 f1   (?.v............
    0060 - 1e 4d 50 55 fd 41 c2 ce-37 ce ca 72 97 71 e1 d8   .MPU.A..7..r.q..
    0070 - e8 df bf 5a b2 2f bf 87-65 fc ea 36 74 dc 58 ed   ...Z./..u..6t.X.
    0080 - ce 7c cb 26 9a 98 57 1e-bb a6 3c 55 85 86 04 bd   .|.&..W....U.w@..
    00b0 - 24 10 d6 04 1d a4 13 d8-e1 00 32 86 a8 ce 3c 49   $.........2...
00c0 - 0c f9 47 1d 8e d8 8a 89-f5 49 c2 7a 3f e1 85 bf ..G......I.z?... Start Time: 1731935398 Timeout : 7200 (sec) Verify return code: 0 (ok) Extended master secret: no Max Early Data: 0 --- read R BLOCK 421 4.4.2 mail.ard-s.ru Error: timeout exceeded closed

Ну и не забываем про "лыжи"... Имеется в виду то обстоятельство, что обязательно пробрасываем порт 587 через NAT.

sudo ufw allow 587/tcp

sudo ufw allow 993/tcp

sudo ufw allow 995/tcp

sudo ufw reload

sudo iptables -A INPUT -p tcp --dport 587 -j ACCEPT

sudo iptables -A INPUT -p tcp --dport 993 -j ACCEPT

sudo iptables -A INPUT -p tcp --dport 995 -j ACCEPT

Впринипе, этого достаточно для того, чтобы наш почтовый сервер заработал. Однако...

 

OPENDKIM

Чтобы наши письма гарантированно попадали в папку "входящие", а не в "спам", нам надо настроить еще один инструмент, который помогает другим серверам убедиться, что письмо пришло именно от вас, а не от какого-нибудь бабуина, который, например, подписывает свое письмо вашим обратным адресом, чтобы реализовать таким образом фишинговую атаку . В основе механизма защиты от подобных бабуинов, как и практически везде в ИТ, используется криптография.

sudo apt install opendkim -y

sudo su

mkdir /etc/opendkim

cd /etc/opendkim

opendkim-genkey -s dkimkey -d madmentat.ru

chown opendkim:opendkim dkimkey.private

ll

opendkim1

cat dkimkey.txt

Ответ будет примерно такой:

dkimkey._domainkey      IN      TXT     ( "v=DKIM1; h=sha256; k=rsa; "         
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1KjBod+ocsd56OzXqwC2e2ef1A1jyajOT3MwleJXrsp31ftN66oROQdkuxOKzHgqxIZdwDHSewnW6jQdUfeWyi3a3g0AfOjX05Mr9rh/UNkWrEkpPaLwUaQ3UeEjOMAG9M1yq7xNdWQLxCsa104LO9VF91YONzDnlShui5vjMKvFF88ArTY5aGxW8+BRgyFXe9RZLfOKoaVb/J" "LcwqyCoXoC6/PujHMUZNcFGQnwmXd9xysgEMNGMWhkWOz6E6HRWYzgdwOnY9l0rD420RvmEQq9SAjyXbtLvRQhnsGxX5NUCsbuKc05fyzsmr6pZIK1j6CAnqfQO7+XYwBmiPckewIDAQAB" ) ; ----- DKIM key dkimkey for madmentat.ru

Отмечу, на всякий случай, что dkimkey — это селектор DKIM (DomainKeys Identified Mail). Он используется для выбора конкретного ключа DKIM, который указывается в DNS-записи домена. Из этого всего нам надо составить выражение для записи на глобальном DNS-сервере. Оно должно иметь примерно следующий вид:

dkimkey._domainkey 	TXT 	"v=DKIM1; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1KjBod+ocsd56OzXqwC2e2af1A1jyajOT3MwleJXrsp31ftN66oROQdkuxOKzHgqxIZdwDHSewnW6jQdUfeWyi3a3g0AfOjX05Mr9rh/UNkWrEkpPaLwUaQ3UeEjOMAG9M1yq7xNdWQLxCsa104LO9VF91YONzDnlShui5vjMKvFF88ArTY5aGxW8+BRgyFXe9R" "ZLfOKoaVb/JLcwqyCoXoC6/PujHMUZNeFGQnwmXd9xwsgEMNGMWhkWOa6E6HRWYzgdwOnY9l0rD420RvtEQq9SAjyXbtLvRQhnsGxX5NUCsbuKc05fyasmr6pZIK1j6CAnqfQO7+XYwBmiPckewIDAQAB" 	600 

Тут все сводится к тому, чтобы убрать все лишнее, ковычки оставляем только по краям, да и те, наверно, не нужны в некоторых админ-панелях DNS-регистраторов. Здесь dkimkey._domainkey - имя, TXT - тип записи, а 600 - это параметр TTL, т. е., время жизни записи в кэше DNS-серверов. Теперь надо немного подождать, пока настройки вступят в силу, так как записи DNS-серверов обновляются не слишком уж часто, в моем случае, у hts.ru это где-то около 30 минут. Пока ждем, можно подправить конфиг opendkim. Однако предварительно сделаем копию.

cp /etc/opendkim.conf /etc/opendkim_old.conf

nano /etc/opendkim.conf

 Вот мой рабочий конфиг:

Syslog                  yes
SyslogSuccess           yes
Canonicalization        relaxed/simple
Mode                    sv
OversignHeaders         From
UserID                  opendkim:opendkim
UMask                   002
Socket                  inet:12345@127.0.0.1
PidFile                 /var/run/opendkim/opendkim.pid
TrustAnchorFile         /usr/share/dns/root.key
AutoRestart Yes
AutoRestartRate 10/1h
SignatureAlgorithm rsa-sha256
ExternalIgnoreList refile:/etc/opendkim/ThrustedHosts
InternalHosts      refile:/etc/opendkim/ThrustedHosts
KeyTable           refile:/etc/opendkim/KeyTable
SigningTable       refile:/etc/opendkim/SigningTable

Не советую чистить его таким же образом от комментариев. Я обычно делаю копии оригиналов, а этот вариант подготовил специально для статьи, чтобы более наглядно.

Далее

nano /etc/default/opendkim

opendkim2

Тут закомментируем строку 20 "SOCKET=local:RUNDIRopendkim.sock", раскоментируем строку 24 "SOCKET=inet:12345@127.0.0.1" и приводим ее к соответствующему виду - чтобы было как на скриншоте.

 

Теперь конфигурируем opendkim и интегрируем в postfix.

nano ThrustedHosts

127.0.0.1
localhost
*.madmentat.ru

На этом моменте, кстате, я здорово подзастрял, когда настраивал сервак первый раз... Попутал имя, создал "TrustedHosts", а в /etc/opendkim.conf указано именно ThrustedHosts. Потом долго офигевал, не мог понять почему эта сука не заводится... Надо быть внимательней, ребята. Надо чтобы все совпадало... Далее создаем файл KeyTable

nano KeyTable

dkimkey._domainkey.madmentat.ru madmentat.ru:dkimkey:/etc/opendkim/dkimkey.private

 Далее

nano SigningTable

*@madmentat.ru dkimkey._domainkey.madmentat.ru

 Далее

nano /etc/postfix/main.cf

В самый низ файла дописываем это:

#opendkim block
milter_protocol = 6
milter_default_action = accept
smtpd_milters = inet:127.0.0.1:12345
non_smtpd_milters = $smtpd_milters

systemctl restart postfix

systemctl restart opendkim

DNS

Так, теперь переходим в админ-панель нашего DNS-регистратора. Вот перед вами образец рабочей конфигурации. Здесь кое-что измененено в целях конспирации, однако суть должна быть ясна:

Имя записиТипДанныеTTL
madmentat.ru. A 31.134.139.98 86400
madmentat.ru. MX 10 mail.madmentat.ru. 1800
madmentat.ru. TXT "v=spf1 a mx ip4:31.134.139.98 ~all" 1800
dkimkey._domainkey TXT "v=DKIM1; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1KjBod+ocsd56OzXqwC2e2af1A1jyajOT3MwleJXrsp31ftN66oROQdkuxOKzHgqxIZdwDHSewnW6jQdUfeWyi3a3g0AfOjX05Mr9rh/UNkWrEkpPaLwUaQ3UeEjOMAG9M1yq7xNdWQLxCsa104LO9VF91YONzDnlShui5vjMKvFF88ArTY5aGxW8+BRgyFXe9R ZLfOKoaVb/JLcwqyCoXoC6/PujHMUZNcFGQnwmXd9xwsgEMNGMWhkWOa6E6HRWYzgdwOnY9l0rD420RvmEQq9SAjyXbtLvRQhnsGxX5NUCsbuKc05fyzsmr6pZIK1j6CAnqfQO7+XYwBmiPckewIDAQAB" 600
_dmarc.madmentat.ru. TXT "v=DMARC1; p=quarantine; rua=mailto:Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript." 1800
mail A 31.134.139.98 1800
mail.madmentat.ru. MX 10 mail.madmentat.ru. 1800

 

Пояснения к DNS записям для домена madmentat.ru:

  1. A-запись для madmentat.ru.

    • Запись: madmentat.ru. A 31.134.139.98 86400
    • Объяснение: Эта запись указывает, что домен madmentat.ru связан с IP-адресом 31.134.139.98. Запись типа A (Address) используется для указания конкретного IP-адреса, на который должен ссылаться домен. В данном случае, при запросе к этому домену, система будет перенаправлять на сервер по адресу 31.134.139.98. Время жизни (TTL) записи составляет 86400 секунд (24 часа).
  2. MX-запись для madmentat.ru.

    • Запись: madmentat.ru. MX 10 mail.madmentat.ru. 1800
    • Объяснение: MX-запись указывает, что почтовые сообщения для домена madmentat.ru должны быть направлены на сервер mail.madmentat.ru с приоритетом 10. Приоритет определяет порядок обработки почтовых серверов, где наименьшее число имеет наивысший приоритет. Время жизни этой записи составляет 1800 секунд (30 минут).
  3. TXT-запись для madmentat.ru. (SPF)

    • Запись: madmentat.ru. TXT "v=spf1 a mx ip4:31.134.139.98 ~all" 1800
    • Объяснение: Эта запись — SPF (Sender Policy Framework), которая используется для указания серверов, разрешенных для отправки электронной почты от имени домена madmentat.ru. В данном случае она разрешает отправку почты с IP-адреса 31.134.139.98 и всех серверов, указанных в MX-записях. Символ ~all означает "мягкое отклонение" сообщений от других серверов (не заблокировать, но отметить как подозрительные). TTL — 1800 секунд (30 минут).
  4. TXT-запись для dkimkey._domainkey.

    • Запись: dkimkey._domainkey TXT "v=DKIM1; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1KjBod+ocsd56OzXqwC2e2af1A1jyajOT3MwleJXrsp31ftN66oROQdkuxOKzHgqxIZdwDHSewnW6jQdUfeWyi3a3g0AfOjX05Mr9rh/UNkWrEkpPaLwUaQ3UeEjOMAG9M1yq7xNdWQLxCsa104LO9VF91YONzDnlShui5vjMKvFF88ArTY5aGxW8+BRgyFXe9R ZLfOKoaVb/JLcwqyCoXoC6/PujHMUZNcFGQnwmXd9xwsgEMNGMWhkWOa6E6HRWYzgdwOnY9l0rD420RvmEQq9SAjyXbtLvRQhnsGxX5NUCsbuKc05fyzsmr6pZIK1j6CAnqfQO7+XYwBmiPckewIDAQAB" 600
    • Объяснение: Эта запись использует технологию DKIM (DomainKeys Identified Mail), которая позволяет проверять подлинность отправителя электронной почты. Запись содержит публичный ключ, который используется для проверки цифровой подписи, прилагаемой к сообщениям, отправленным с домена madmentat.ru. Это помогает предотвратить подделку отправителей и защищает от фишинга и спама. TTL — 600 секунд (10 минут).
  5. TXT-запись для _dmarc.madmentat.ru.

    • Запись: _dmarc.madmentat.ru. TXT "v=DMARC1; p=quarantine; rua=mailto:Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript." 1800
    • Объяснение: DMARC (Domain-based Message Authentication, Reporting & Conformance) — это механизм аутентификации почты, который помогает предотвратить подделку отправителей и фишинговые атаки. В этой записи указано, что для домена madmentat.ru применяется политика "quarantine" (отправлять сомнительные письма в карантин) и предоставляется адрес для отчетности (rua), куда должны поступать отчеты об обработке почты. TTL — 1800 секунд (30 минут).
  6. A-запись для почтового сервера mail.madmentat.ru.

    • Запись: mail.madmentat.ru. A 31.134.139.98 1800
    • Объяснение: Эта A-запись указывает, что сервер mail.madmentat.ru привязан к IP-адресу 31.134.139.98, который также используется для других сервисов. TTL — 1800 секунд (30 минут).

Дополнительные записи для почтовых и других сервисов:

  1. MX-запись для почтового сервера mail.madmentat.ru.

    • Запись: mail.madmentat.ru. MX 10 mail.madmentat.ru. 1800
    • Объяснение: Эта запись подтверждает, что почтовые сообщения для домена madmentat.ru должны быть доставлены на сервер mail.madmentat.ru. Приоритет — 10, что обозначает нормальный приоритет для обработки почты. TTL — 1800 секунд (30 минут).
  2. Записи A для других субдоменов (например, ftp, hestia, mikrotik и т.д.)

    • Записи: ftp.madmentat.ru. A 31.134.139.98 1800, hestia.madmentat.ru. A 31.134.139.98 1800 и другие.
    • Объяснение: Эти A-записи указывают на тот же IP-адрес 31.134.139.98, что и для основного домена. Они используются для различных сервисов или приложений, например, FTP, веб-интерфейса для управления хостингом (Hestia), и других вспомогательных серверов. TTL — 1800 секунд (30 минут).

 

PTR

Данная запись, как уже упомяналось, делается именно на стороне провайдера. Она должна выглядеть примерно так:

31.134.139.98.in-addr.arpa.  IN PTR mail.madmentat.ru

Делать PTR непосредственно на madmentat.ru не рекомендуется. В большинстве случаев для почтовых серверов указывается именно домен с почтовым сервером, например mail.madmentat.ru. Это позволяет подтвердить, что почта действительно отправляется с этого домена и IP-адреса. Если вам нужно, чтобы оба домена (например, mail.madmentat.ru и madmentat.ru) указывали на один и тот же сервер, вы можете создать A-записи для mail.madmentat.ru и madmentat.ru, которые будут указывать на ваш IP-адрес (например, 31.134.139.98).

SPF

SPF (Sender Policy Framework) помогает бороться с поддельной электронной почтой, указывая, какие серверы могут отправлять почту от имени вашего домена. Вот основные опции для настройки SPF:

  1. v=spf1: Обязательное начало записи. Определяет версию SPF.
  2. a: Разрешает IP-адресу из A-записи домена отправлять почту.
  3. mx: Разрешает серверам, указанным в MX-записях, отправлять почту.
  4. ip4: и ip6:: Указывает конкретные IPv4/IPv6-адреса или диапазоны.
  5. include:: Добавляет правила другого домена (например, для сторонних сервисов).
  6. all: Завершает запись, определяя поведение по умолчанию. Примеры:
    • ~all: Разрешает, но помечает как сомнительные (soft fail).
    • -all: Отвергает все неуказанные источники (hard fail).
    • ?all: Нейтральный результат.
  7. ptr: Проверяет обратные DNS-записи (не рекомендуется).
  8. exists:: Разрешает отправку, если указанный домен существует.

Пример:

 v=spf1 a mx ip4:203.0.113.0/24 include:_spf.google.com ~all

 

 

Для проверки настроек будем использовать следующий сайт:

mail-tester.com

 

P.S.

Кстати, отмечу, что если у вас во внутренней сети за NAT-том расположен свой собственный DNS сервер с блэкджеком и шлюхами, то вам придется прописать какой-то форвардинг на какие-то глобальные сервера - например, на гугловские восьмерки. Иначе dkim не заработает... Да и остальное записи тоже. То есть, команда типа dig dkimkey._domainkey.ard-s.ru txt выдаст какую-нибудь хуйню вместо вашего публичного ключа.

Но это уже тема для отдельной статьи. Я лично как-то справился.