ПОЧТОВЫЙ СЕРВЕР IREDMAIL
Редакция 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
Еще нужно подправить имя хоста, чтобы оно соответствовало опредеенному стандарту.
sudo nano /etc/hostname
Еще надо подправить
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. В ходе установки особых сложностей возникнуть не должно, там все предельно ясно.
Чтобы лыжи поехали, надо пробросить порты и ребутнуться.
25, 110, 80
sudo reboot now
Затем мы можем войти в админку
https://mail.madmentat.ru/iredadmin
Интерфейс настолько прост, что в нем разберется даже самый тугой дурак. Тут можно добавить пользователей.
Веб-интерфейс расположен по адресу https://mail.madmentat.ru/mail
Еще добавлю, что тут по умолчанию какие-то сложности с паролем, требуется обязательное наличие специальных символов. Так-то оно и хорошо, но лично я не такой параноик и предпочел бы иметь в этом отношении побольше свободы. Поэтому лично у себя решил подправить конфиг.
Настройки по умолчанию хранятся в файле 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
Ну вот и все? А нет! Проблема в том, что наш сервак теперь работает на 25-м порту, а это не по-феншуй. Нам надо чтобы работал метод шифрования STARTTLS. После команды "sudo certbot --nginx -d mail.madmentat.ru -d www.mail.madmentat.ru
" мы можем сразу видеть, куда установились сертификаты, там будет вывод путей в терминал.
madmentat@mail:~$ sudo certbot certonly --standalone -d ard-s.ru -d mail.ard-s.ru [sudo] password for madmentat: Saving debug log to /var/log/letsencrypt/letsencrypt.log Requesting a certificate for ard-s.ru and mail.ard-s.ru Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/ard-s.ru-0001/fullchain.pem Key is saved at: /etc/letsencrypt/live/ard-s.ru-0001/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.
Их надо скопировать куда-нибудь в блокнотик, чтобы потом вставить в конфиг 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 smtp_tls_cert_file=/etc/letsencrypt/live/ard-s.ru-0001/fullchain.pem smtp_tls_key_file=/etc/letsencrypt/live/ard-s.ru-0001/privkey.pem # Запрет отправки без шифрования 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.ard-s.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