Итак, инфраструктура для почтового сервера, который я хочу расположить в домашней сети развернута, т.е. есть VPS система на которой белый IP адрес, привязано доменное имя @ekzorchik.com, у провайдера прописана PTR запись, а у меня на DNS хостинге запись A, MX.

Предварительные действия:

  • Покупаем DNS-имя, к примеру, у меня ekzorchik.com
  • Покупаем VPS систему на базе Ubuntu 20.04 по ссылке

Моя домашняя инфраструктура

  • Mikrotik rb2011UiAS-2Hnd-IN (Роутер, созданы VLANы)
  • Сервер на базе (Supermicro SYS-5019S-M: Debian 10 + Proxmox 6, ZFS разделы, 64Gb оперативной памяти (2 модуля 378A4G43MB1-CTD))
  • Создана виртуальная машина с осью Ubuntu 18.04 Server на которой по заметке
  • Поднимем WireGuard VPN туннель на Ubuntu 20.04

настроен туннель до VPS системы

Будущая схема работы почтового сервера

Приступаю к реализации собственного почтового сервера на выше указанной схеме

Шаг №1: Подключаюсь по SSH к своей VPS системе mail.ekzorchik.com:

root@ekzorchik:~# cat /etc/hosts | grep ekzorchik
#127.0.1.1 mail.ekzorchik.com mail
2.57.186.62     mail.ekzorchik.com mail

Шаг №2: Настраиваю проброс портов необходимых для работы почтового сервера на узле mail.ekzorchik.com (OS: Ubuntu 20.04 Server):

sudo firewall-cmd --zone=external --add-forward-port=port=25:proto=tcp:toport=25:toaddr=172.33.2.14 --permanent
sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=80:toaddr=172.33.2.14 --permanent
sudo firewall-cmd --zone=external --add-forward-port=port=143:proto=tcp:toport=143:toaddr=172.33.2.14 --permanent
sudo firewall-cmd --zone=external --add-forward-port=port=443:proto=tcp:toport=443:toaddr=172.33.2.14 --permanent
sudo firewall-cmd --zone=external --add-forward-port=port=465:proto=tcp:toport=465:toaddr=172.33.2.14 --permanent
sudo firewall-cmd --zone=external --add-forward-port=port=587:proto=tcp:toport=587:toaddr=172.33.2.14 --permanent
sudo firewall-cmd --zone=external --add-forward-port=port=993:proto=tcp:toport=993:toaddr=172.33.2.14 --permanent
sudo firewall-cmd --reload

Шаг №3: Подключаюсь к системе через WireGuard VPN туннель на Ubuntu 18.04:

root@ekzorchik:~# ssh -l ekzorchik 10.0.0.2
ekzorchik@srv-client:~$ uname -a && lsb_release -a
Linux srv-client 4.15.0-200-generic #211-Ubuntu SMP Thu Nov 24 18:16:04 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.6 LTS
Release:        18.04
Codename:       bionic
ekzorchik@srv-client:~$

Шаг №4: Изменяю имя хоста системы Ubuntu 18.04 Server:

ekzorchik@srv-client:~$ sudo nano /etc/hosts
#127.0.0.1      localhost
127.0.0.1       mail.polygon.local mail localhost
ekzorchik@srv-client:~$ sudo nano /etc/hostname
mail.polygon.local
ekzorchik@srv-client:~$ sudo reboot

Шаг №5: Т.к. я уже имел дело установленным почтовым сервере на базе iRedmail где правда у меня был внешний статический IP адрес (Белый адрес), то в рамках этой заметки рассмотрю установку именно его и той же самой версии:

ekzorchik@mail:~$ wget https://github.com/iredmail/iRedMail/archive/1.4.2.tar.gz

ekzorchik@mail:~$ tar zxf 1.4.2.tar.gz

ekzorchik@mail:~$ cd iRedMail-1.4.2/

ekzorchik@mail:~/iRedMail-1.4.2$ chmod +x iRedMail.sh

ekzorchik@mail:~/iRedMail-1.4.2$ sudo ./iRedMail.sh

[ INFO ] Checking new version of iRedMail ...

<< ERROR >> Your iRedMail version (1.4.2) is out of date, please

<< ERROR >> download the latest version and try again:

<< ERROR >> http://www.iredmail.org/download.html

ekzorchik@mail:~/iRedMail-1.4.2$

ekzorchik@mail:~/iRedMail-1.4.2$ sudo su -

root@mail:~# CHECK_NEW_IREDMAIL=NO bash /home/ekzorchik/iRedMail-1.4.2/iRedMail.sh

Нажимаю Yes

  • Please specify a directory used to store user mailboxes. Default is: /var/vmail нажимаю Next
  • Choose a web server you want to run: оставляю по дефолту Next и нажимаю Next
  • Choose preferred backend used to store mail accounts: выбираю MariaDB и клавишу ПРОБЕЛ, а затем нажимаю Next
  • Please specify password for MySQL administrator root on server 127.0.0.1: указываю PASSWORD и нажимаю Next
  • Please specify your first mail domain name: указываю ekzorchik.com и нажимаю Next
  • Please specify password for the mail domain administrator: указываю PASSWORD (это для учетной записи postmaster@ekzorchik.com) и нажимаю Next
  • Устанавливаем компоненты: выбираю Roundcubemail, netdata, iredAdmin, Fail2ban и нажимаю Next

Continue? нажимаю клавишу y

Continue? нажимаю клавишу y

ожидаю, т.к. идет установка пакетов необходимых для развертывания почтового сервера…

*************************************************************************
* iRedMail-1.4.2 installation and configuration complete.
*************************************************************************

< Question > Would you like to use firewall rules provided by iRedMail?
< Question > File: /etc/nftables.conf, with SSHD ports: 22. [Y|n][ INFO ] Copy firewall sample rules.
< Question > Restart firewall now (with ssh ports: 22)? [y|N]y
********************************************************************
* URLs of installed web applications:
*
* - Roundcube webmail: https://mail.polygon.local/mail/
* - netdata (monitor): https://mail.polygon.local/netdata/
*
* - Web admin panel (iRedAdmin): https://mail.polygon.local/iredadmin/
*
* You can login to above links with below credential:
*
* - Username: postmaster@ekzorchik.com
* - Password: PASSWORD
*
*
********************************************************************
* Congratulations, mail server setup completed successfully. Please
* read below file for more information:
*
*   - /home/ekzorchik/iRedMail-1.4.2/iRedMail.tips
*
* And it's sent to your mail account postmaster@ekzorchik.com.
*
********************* WARNING **************************************
*
* Please reboot your system to enable all mail services.
*
********************************************************************
root@mail:~#
root@mail:~# exit
logout
ekzorchik@mail:~/iRedMail-1.4.2$ cd ~

Шаг №6: Вношу изменения в main.cf сервиса Postfix:

ekzorchik@mail:~$ sudo nano /etc/postfix/main.cf
# hostname
#myhostname = mail.polygon.local
#myorigin = mail.polygon.local
#mydomain = mail.polygon.local
myhostname = ekzorchik.com
myorigin   = mail.ekzorchik.com
mydomain   = ekzorchik.com
ekzorchik@mail:~$ sudo systemctl restart postfix
ekzorchik@mail:~$

Шаг №7: Согласно мастеру установки iRedmail чтобы все сервисы заработали, систему нужно перезагрузить, перезагружаю:

ekzorchik@mail:~$ sudo reboot
Connection to 10.0.0.2 closed by remote host.
Connection to 10.0.0.2 closed.
root@ekzorchik:~#

Шаг №8: Проверяю, что могу авторизоваться в Web-панели администрирования своего развернутого почтового сервиса на своих ресурсах:

запускаю браузер и обращаюсь на URL: https://mail.ekzorchik.com/iredadmin

окно что «Подключение не защищено» это нормально, т.к. у нас сейчас сертификат самоподписанный.

Доступ в /iredadmin идет пока через самоподписанный сертификат

Нажимаю "Дополнительные" - "Перейти на сайт mail.ekzorchik.com (небезопасно)" и меня встречает окно авторизации в Web-панель Управления вашими домена и учетными записями, авторизуюсь

  • Username: postmaster@domainname
  • Password: пароль который вы задавали при установке iredmail через скрипт инсталляции

язык я оставляю по умолчанию English (US) и нажимаю Login

Авторизуюсь в https://mail.ekzorchik.ru/iredadmin

И вот минималистический интерфейс администрирования Вашим почтовым сервисом

Я успешно авторизован в iRedadmin Web-панели администрирования

Шаг №9: Создаю почтовые ящики через Web-интерфейс /iredadmin:

https://mail.ekzorchik.com/iredadmin - user&pass (postmaster@ekzorchik.com&password) — нажимаю +Add.. - User

  • Add mail user under domain: ekzorchik.com
  • Mail address: support
  • New password: использую сгенерированный пароль
  • Confirm new password: повторяю сгенерированный пароль
  • Display Name: support
  • Preferred language: English (US)
  • Mailbox Quota: 1024MB

и нажимаю Add

  • Enable this account: отмечаю галочкой
  • Mailbox Quota: 1024 MB
  • Preferred language: English (US)
  • Time zone: произвольно заполняю, к примеру Europe/Moscow (GMT +03:00)
  • User/Employee ID: support

и нажимаю Save changes

Шаг №10: Теперь я могу авторизоваться в созданном почтовом ящике через Web-интерфейс посредством URL адреса: https://mail.ekzorchik.ru/mail

  • Username: support@ekzorchik.com
  • Password: указываю сгенерированный пароль

На заметку: советую использовать Keepass2 для хранения доступов

и нажимаю «Войти»

Авторизуюсь в почтовом ящике https://mail.ekzorchik.com/mail

и вот после успешной аутентификации я в личном кабинете своего почтового ящика под учетной записью support@ekzorchik.com

Я в почтовом ящике его Web-версии

Шаг №11: Сейчас буду устанавливать сертификат Lets Encrypted дабы уйти от Web-строки при обращении к iRedMail что сертификат у меня самоподписанный:

root@ekzorchik:~# ssh -l ekzorchik 10.0.0.2
ekzorchik@10.0.0.2's password:
Welcome to Ubuntu 18.04.6 LTS (GNU/Linux 4.15.0-200-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Mon Dec 26 14:01:56 2022 from 10.0.0.1
ekzorchik@mail:~$
ekzorchik@mail:~$ sudo apt-get install -y python-certbot-nginx
ekzorchik@mail:~$ sudo certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
No certs found.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ekzorchik@mail:~$

На заметку: Важно чтобы доступ к почтовому серверу mail.ekzorchik.com был открыт при обращении через 80/tcp

ekzorchik@mail:~$ sudo certbot certonly --webroot --agree-tos --email support@ekzorchik.ru -d mail.ekzorchik.com -w /var/www/html/
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for mail.ekzorchik.com
Using the webroot path /var/www/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/mail.ekzorchik.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/mail.ekzorchik.com/privkey.pem
   Your cert will expire on 2023-03-26. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

ekzorchik@mail:~$

Шаг №12: Чтобы полученный сертификат от Let's Encrypt обновлялся самостоятельно каждые 90 дней (по умолчанию) нужно:

ekzorchik@mail:~$ sudo crontab -e
@reboot /usr/sbin/ntpdate -s 0.pool.ntp.org > /dev/null
# iRedMail: Backup MySQL databases on 03:30 AM
30   3   *   *   *   /bin/bash /var/vmail/backup/backup_mysql.sh

# iRedAPD: Clean up expired tracking records hourly.
1   *   *   *   *   python3 /opt/iredapd/tools/cleanup_db.py >/dev/null

# iRedAPD: Convert SPF DNS record of specified domain names to IP
#          addresses/networks hourly.
2   *   *   *   *   python3 /opt/iredapd/tools/spf_to_greylist_whitelists.py >/dev/null

# iRedMail: Cleanup Amavisd database
1   2   *   *   *   python3 /opt/www/iredadmin/tools/cleanup_amavisd_db.py >/dev/null

# iRedAdmin: Clean up sql database.
1   *   *   *   *   python3 /opt/www/iredadmin/tools/cleanup_db.py >/dev/null 2>&1

# iRedAdmin: Delete mailboxes on file system which belong to removed accounts.
1   *   *   *   *   python3 /opt/www/iredadmin/tools/delete_mailboxes.py
# iRedMail: Cleanup Roundcube SQL database
2   2   *   *   *   /usr/bin/php /opt/www/roundcubemail/bin/cleandb.sh >/dev/null

# iRedMail: Cleanup Roundcube temporary files under 'temp/' directory
2   2   *   *   *   /usr/bin/php /opt/www/roundcubemail/bin/gc.sh >/dev/null
# Fail2ban: Unban IP addresses pending for removal (stored in SQL db).
* * * * * /bin/bash /usr/local/bin/fail2ban_banned_db unban_db
@daily letsencrypt renew --quiet && systemctl reload postfix dovecot nginx

Шаг №13: После получения сертификата TLS, давайте сконфигурируем nginx:

ekzorchik@mail:~$ sudo nano /etc/nginx/templates/ssl.tmpl
#ssl_certificate /etc/ssl/certs/iRedMail.crt;
#ssl_certificate_key /etc/ssl/private/iRedMail.key;
ssl_certificate /etc/letsencrypt/live/mail.ekzorchik.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mail.ekzorchik.com/privkey.pem;
ekzorchik@mail:~$ sudo systemctl restart nginx

Шаг №14: Проверяем что теперь доступ в Web-интерфейс администрирования ("/iredadmin") и Web-интерфейс почтового ящика ("/mail") идет исключительно через полученный сертификат от Let's Encrypted:

Доступ в ящик и Web-панель администрирования идет через Let's Encrypt

Шаг №15: Гарантируем доставку почты, чтобы это сделать Вам нужно обратиться к заметке " Поднимаем почтовой сервис для домена @ekzorchik.com на базе iRedMail" смотрите с шага "Шаг №16"

DKIM запись создал на хостинге где управляю DNS записями домена ekzorchik.com

ekzorchik@mail:~$ sudo amavisd-new testkeys
TESTING#1 ekzorchik.com: dkim._domainkey.ekzorchik.com => pass
ekzorchik@mail:~$

Проделав действия из заметки выше убираю перенаправление портов с портом 143, 587:

root@ekzorchik:~# sudo firewall-cmd --zone=external --remove-forward-port=port=143:proto=tcp:toport=143:toaddr=172.33.2.14 --permanent
success
root@ekzorchik:~# sudo firewall-cmd --zone=external --remove-forward-port=port=587:proto=tcp:toport=587:toaddr=172.33.2.14 --permanent
success
root@ekzorchik:~# sudo firewall-cmd --reload

Довожу, что настройки подключения к моему почтовому серверу:

Теперь настройки для подключения к почтовому серверу:

IMAP: mail.ekzorchik.com

Port: 993

SSL/TLS

SMTP: mail.ekzorchik.com

Port: 465

SSL/TLS

На заметку: от 27.12.2022

ekzorchik@mail:~$ sudo tail -f /var/log/syslog
Dec 27 13:40:20 mail postfix/relay/smtp[15526]: connect to mail.ekzorchik.com[2.57.186.62]:25: No route to host

ekzorchik@mail:~$ sudo nano /etc/postfix/main.cf
mynetworks = 127.0.0.1 [::1], 172.33.2.0/24
ekzorchik@mail:~$ sudo postconf
ошибок нет
ekzorchik@mail:~$ sudo systemctl restart postfix

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

На заметку: Важный нюанс по данной заметке, у меня в заметках используется утилита firewalld версии 0.8.2OS: Ubuntu 20.04 где Wireguard работает в качестве сервера — все работает, как и написано в заметках моего блога), а начиная с версии 1.0

root@ekzorchik:~# dpkg -l | grep firewalld | head -n 1
ii firewalld 0.8.2-1 all dynamically managed firewall with support for network zones
root@ekzorchik:~#

по умолчанию блокируется транзитный трафик между зонами хоть и включена настройка net.ipv4.ip_forward=1, это дело не меняет. А в Ubuntu 22.04 уже устанавливается версия firewalld = 1.1.1-1ubuntu1 и все применяя к ней исходя из моих заметок получается что не работает, т.е. если Вы на Ubuntu 22.04 Server поднимаете Wireguard-сервер, в этом случае нужно разрешить прохождение трафика с помощью policy object, к примеру создав правило: client-to-inet

firewall-cmd --permanent --new-policy client-to-inet
firewall-cmd --permanent --policy client-to-inet --set-target ACCEPT
firewall-cmd --permanent --policy client-to-inet --add-ingress-zone internal
firewall-cmd --permanent --policy client-to-inet --add-egress-zone external
firewall-cmd --reload

после интернет при подключении через Wireguard с клиентской системы к Ubuntu 22.04 Server (Wireguard-сервер) начинает работать, а туннель как устанавливался так и устанавливается.

На этом моя заметка завершена, с уважением автор блога Олло Александр aka ekzorchik.