Итак, инфраструктура для почтового сервера, который я хочу расположить в домашней сети развернута, т.е. есть 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
ожидаю, т.к. идет установка пакетов необходимых для развертывания почтового сервера…
************************************************************************* * 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
окно что «Подключение не защищено» это нормально, т.к. у нас сейчас сертификат самоподписанный.
Нажимаю "Дополнительные" - "Перейти на сайт mail.ekzorchik.com (небезопасно)"
и меня встречает окно авторизации в Web
-панель Управления вашими домена и учетными записями, авторизуюсь
- Username: postmaster@domainname
- Password: пароль который вы задавали при установке
iredmail
через скрипт инсталляции
язык я оставляю по умолчанию English (US)
и нажимаю Login
И вот минималистический интерфейс администрирования Вашим почтовым сервисом
Шаг №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
для хранения доступов
и нажимаю «Войти»
и вот после успешной аутентификации я в личном кабинете своего почтового ящика под учетной записью support@ekzorchik.com
Шаг №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:
Шаг №15:
Гарантируем доставку почты, чтобы это сделать Вам нужно обратиться к заметке " Поднимаем почтовой сервис для домена @ekzorchik.com на базе iRedMail"
смотрите с шага "Шаг №16"
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.2
(в OS: 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.