Ако не сте следили статиите за Debian 12, горещо препоръчвам да ги прочетете, защото тази тема е продължение на предните. За пояснение: ● инсталирахме Debaian 12 ● настроихме Debian 12 ТУК ● настроихме DNS сървъра ТУК ● инсталирахме и настроихме Apache ТУК ● инсталирахме и настроихме MySQL и PHPMyAdmin ТУК Следва да създадем сървър за електронна поща с виртуални домейни и виртуални пощенски кутии. За целта пренасочваме следните портове, ако сме зад рутер или ги освобождаваме в защитната стена ако сме с реално IP върху сървъра. TCP - 25 - SMTP TCP - 587 - SMTP Start TLS TCP - 465 - SMTP SSL TCP - 110 - POP3 TCP - 995 - POP3 SSL TCP - 143 - IMAP Start TLS TCP - 993 - IMAP SSL TCP - 589 - IMAP4 SSL Дълго се колебаех как да започна темата. Дали да продължа от елементарния сървъра за електронна поща или да почна отначало да го изграждам. Спрях се на втория вариант. В първия вариант има създадени много зависимости докато ги върнем в изходно състояние и след това да почнем виртуализацията, ще стане много объркващо. Затова предпочетох да започнем на чисто.
mysql create database pfdb; grant all on pfdb.* to 'pfadmin'@'localhost' identified by 'adminpass'; grant select on pfdb.* to 'pfuser'@'127.0.0.1' identified by 'pfpass'; quit
Създадохме база pfdb, потребители pfadmin и pfuser боравещи с нея. Съответно потребителите имат пароли adminpass и pfpass.
Таблица за виртуалните домейни.
mysql use pfdb; CREATE TABLE IF NOT EXISTS `virtual_domains` ( `id` int(11) NOT NULL auto_increment, `name` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Таблица за виртуалните потребители
CREATE TABLE IF NOT EXISTS `virtual_users` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `email` varchar(100) NOT NULL, `password` varchar(150) NOT NULL, `quota` bigint(11) NOT NULL DEFAULT 0, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Таблица за виртуалните алиаси
CREATE TABLE IF NOT EXISTS `virtual_aliases` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `source` varchar(100) NOT NULL, `destination` varchar(100) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; quit
Ползвайте doveadm pw -s BLF-CRYPT за да генерирате парола която искате за вашия потребител. В случая е tachko@my.tlan.net.
doveadm pw -s BLF-CRYPT -u tachko@my.tlan.net
В случая не можете да генерирате парола, защото нямате инсталиран Dovecot и затова нямате doveadm. На по-късен етап пак ще се върнем към този проблем
mysql REPLACE INTO pfdb.virtual_domains (id,name) VALUES ('1','my.tlan.net'); REPLACE INTO pfdb.virtual_users (id,domain_id,password,email) VALUES ('1', '1', '{BLF-CRYPT}$2y$05$p57BhtF4M5mIPV3iuOuEGOM22Lta09nMQbSNnz7Oun2IwFma7Mu5a', 'tachko@my.tlan.net'), ('2', '1', '{BLF-CRYPT}$2y$05$p57BhtF4M5mIPV3iuOuEGOM22Lta09nMQbSNnz7Oun2IwFma7Mu5a', 'cccp@my.tlan.net'); REPLACE INTO pfdb.virtual_aliases (id,domain_id,source,destination) VALUES ('1', '1', 'cccp@my.tlan.net', 'tachko@my.tlan.net'); quit
За начало да инсталираме PostFix и допълнението му за работа с MySQL.
apt install postfix postfix-mysql -y
Внимание !!! Ползваме пълното име на хоста (FQDN), защото работим с виртуални домейни. Домейна ни е my.tlan.net, а FQDN ns1.my.tlan.net. Освен postfix инсталирахме и postfix-mysql, който ни е нужен за PostFix да взема данни от MySQL. Правим копие на конфигурационните файлове за PostFix.
cp /etc/postfix/main.cf /etc/postfix/main.cf.original cp /etc/postfix/master.cf /etc/postfix/master.cf.original
Проверяваме как работи.
telnet gmail-smtp-in.l.google.com 25 Trying 142.251.18.27... Connected to gmail-smtp-in.l.google.com. Escape character is '^]'. 220 mx.google.com ESMTP f10-20020a50a6ca000000b00571d8dfdb52si15011805edc.83 - gsmtp quit 221 2.0.0 closing connection f10-20020a50a6ca000000b00571d8dfdb52si15011805edc.83 - gsmtp Connection closed by foreign host.
Всичко е наред продължаваме.
virtual_mailbox_domains - виртуални домейни
postconf virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf nano /etc/postfix/mysql-virtual-mailbox-domains.cf user = pfuser password = pfpass hosts = 127.0.0.1 dbname = pfdb query = SELECT 1 FROM virtual_domains WHERE name='%s' postmap -q my.tlan.net mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf 1
virtual_mailbox_maps - виртуални пощенски кутии
postconf virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf nano /etc/postfix/mysql-virtual-mailbox-maps.cf user = pfuser password = pfpass hosts = 127.0.0.1 dbname = pfdb query = SELECT 1 FROM virtual_users WHERE email='%s' postmap -q tachko@my.tlan.net mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf 1
virtual_alias_maps - виртуални псевдоними
postconf virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf nano /etc/postfix/mysql-virtual-alias-maps.cf user = pfuser password = pfpass hosts = 127.0.0.1 dbname = pfdb query = SELECT destination FROM virtual_aliases WHERE source='%s' postmap -q cccp@my.tlan.net mysql:/etc/postfix/mysql-virtual-alias-maps.cf tachko@my.tlan.net
Има обаче един много важен момент. Примерно решавате всичко което идва до @my.tlan.net да се препраща до tachko@my.tlan.net. До тука добре. Това ще се изпълни, но тъй като @my.tlan.net е специфичен псевдоним той е с най-висок приоритет и това ще спре на практика пощата до другите потребители и само tachko@my.tlan.net ще получава поща. За да се избегне това се прави трик. Описват се в алиасите потребителите да получават поща до себе си -------------------------------------------------------------------------------------------------- Адрес Дестинация -------------------------------------------------------------------------------------------------- @my.tachko.com tachko@my.tlan.net tit@my.tlan.net tit@my.tlan.net Поради всичко това е нужно да създадем още един конфигурационен ред в /etc/postfix/main.cf., той на практика ще препокрие горният, който създадохме за виртуалните псевдоними.
postconf virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf nano /etc/postfix/mysql-email2email.cf user = pfuser password = pfpass hosts = 127.0.0.1 dbname = pfdb query = SELECT email FROM virtual_users WHERE email='%s' postmap -q tachko@my.tlan.net mysql:/etc/postfix/mysql-email2email.cf tachko@my.tlan.net
Уверете се, че само „root“ и „postfix“ потребителят могат да четат „.cf“ файловете – все пак паролата за вашата база данни се съхранява там:
chgrp postfix /etc/postfix/mysql-*.cf chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf
Сега да направим няколко теста на PostFix Теста започва в: 7 мин. и 15 сек.
telnet my.tlan.net 25 Trying 185.163.245.186... Connected to my.tlan.net. Escape character is '^]'. 220 ns1.my.tlan.net ESMTP Postfix (Debian/GNU) ehlo my.tlan.net 250-ns1.my.tlan.net 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250-DSN 250-SMTPUTF8 250 CHUNKING mail from:<tachko@my.tlan.net> 250 2.1.0 Ok rcpt to:<tachko@tachko.com> 454 4.7.1 <tachko@tachko.com>: Relay access denied
Имаме грешка. Този код за грешка се наблюдава в регистрационните файлове на сървъра, когато сървърът на получателя временно не може да получава имейли. Да я поправим:
nano /etc/postfix/main.cf mydestination = $myhostname, ns1.my.tlan.net, my.tlan.net, localhost.my.tlan.net, , localhost mynetworks = 127.0.0.0/8 192.168.11.0/24 185.163.245.186/32 [::ffff:127.0.0.0]/104 [::1]/128 service postfix restart
ВНИМАНИЕ !!!. редакцията на mydestination e само за този тест.
Ако не ползвате виртуални домейни, стандартно се работи във вида локален домейн:
mydestination = example.org, example.com, example.net
Никога не изброявайте домейните в mydestination при виртуалните домейни. Ползвайте пълното име на хоста на сървъра или просто задайте mydestination=localhost. Пример:
mydestination = $myhostname, localhost
И най-вече:
mydestination = localhost
Виртуалните домейни се описват чрез virtual_mailbox_domains = example.org, example.com, a още по-добре в база данни както направихме по-рано с virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf. Това беше много важно уточнение.
telnet my.tlan.net 25 Trying 185.163.245.186... Connected to my.tlan.net. Escape character is '^]'. 220 ns1.my.tlan.net ESMTP Postfix (Debian/GNU) ehlo my.tlan.net 250-ns1.my.tlan.net 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250-DSN 250-SMTPUTF8 250 CHUNKING mail from:<tachko@my.tlan.net> 250 2.1.0 Ok rcpt to:<tachko@tachko.com> 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> Изпращам поща от tachko@my.tlan.net . 250 2.0.0 Ok: queued as D8260140D1A quit
Теста мина успешно. Сега ако отворим пощата на tachko@tachko.com ще видим писмо от непознат подател. Да върнем нещата за работа с виртуални домейни.
nano /etc/postfix/main.cf # mydestination = $myhostname, ns1.my.tlan.net, my.tlan.net, localhost.my.tlan.net, , localhost mydestination = localhost
Започваме с инсталацията.
apt install dovecot-mysql dovecot-pop3d dovecot-imapd dovecot-managesieved dovecot-lmtpd -y
Пълната конфигурация на Dovecot може да се види с:
doveconf -a
Много дълго за разглеждане. Можете примерно цялата конфигурация да я запишете във файл и да я разгледате с nano.
doveconf -a >> /home/cccp/dovecot.conf nano /home/cccp/dovecot.conf
Много е дълъг файла. Можете да отделите това което Ви вълнува с grep.
doveconf -a | grep mail_location mail_location = mbox:~/mail:INBOX=/var/mail/%u
Много полезен инструмент ползвайте го. И едно леко отклонение. Ако се сещате малко по-нагоре попълнихме базата pfdb с данни за домейни, потребители и алиаси. Когато създадохме потребителя tachko@my.tlan.net за парола ползвахме най-различни символи. Сега ще покажа как я генерирахме.
doveadm pw -s BLF-CRYPT -u tachko@my.tlan.net Enter new password: Iceman Retype new password: Iceman {BLF-CRYPT}$2y$05$p57BhtF4M5mIPV3iuOuEGOM22Lta09nMQbSNnz7Oun2IwFma7Mu5a
Не е проблем ако тогава сте сложили моята парола. Генерирайте сега Вашата парола и да попълним базата с Вашите данни.
mysql REPLACE INTO pfdb.virtual_users (id,domain_id,password,email) VALUES ('1', '1', 'ВАШАТА ПАРОЛА', 'ВАШИЯ МЕЙЛ АДРЕС 1'), ('2', '1', 'ВАШАТА ПАРОЛА', 'ВАШИЯ МЕЙЛ АДРЕС 2'); quit
Продължаваме с Dovecot. Запазваме оригиналните конфигурационни файлове
cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.original cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.original cp /etc/dovecot/conf.d/auth-sql.conf.ext /etc/dovecot/conf.d/auth-sql.conf.ext.original cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.original cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.original cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.original cp /etc/dovecot/conf.d/15-mailboxes.conf /etc/dovecot/conf.d/15-mailboxes.conf.original cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.original cp /etc/dovecot/conf.d/20-lmtp.conf /etc/dovecot/conf.d/20-lmtp.conf.origianal cp /etc/dovecot/conf.d/15-lda.conf /etc/dovecot/conf.d/15-lda.conf.original cp /etc/dovecot/conf.d/90-quota.conf /etc/dovecot/conf.d/90-quota.conf.original
Преди да почнем същинското конфигуриране да създадем потребител който да притежава всички виртуални пощенски кутии. Това се прави с цел защита. Уверете се, че нямате потребител и група с ID 5000. Ако това ID се използва ползвайте друго но по-голямо от 1000.
groupadd -g 5000 vmail useradd -g vmail -u 5000 vmail -d /var/vmail -m chown -R vmail:vmail /var/vmail
nano /etc/dovecot/dovecot.conf
# Търсим наличието на:
!include conf.d/*.conf
nano /etc/dovecot/conf.d/10-auth.conf
### Търсим реда:
auth_mechanisms = plain
### login се ползва заради Outlook XP или Vista. Трябва да изглежда:
auth_mechanisms = plain login
### Търсим пасажа:
!include auth-system.conf.ext
#!include auth-sql.conf.ext
#!include auth-ldap.conf.ext
(\) означава, че командата продължава на следващия ред. Фиксираме ограничения
chown root:root /etc/dovecot/dovecot-sql.conf.ext chmod go= /etc/dovecot/dovecot-sql.conf.ext
Рестартираме Dovecot.
systemctl restart dovecot
Да погледнем логовете.
cat /var/log/mail.log 2024-04-21T07:43:02.467432-04:00 ns1 dovecot: master: Warning: Killed with signal 15 (by pid=5698 uid=0 code=kill) 2024-04-21T07:43:03.574299-04:00 ns1 dovecot: log(5682): Warning: Killed with signal 15 (by pid=1 uid=0 code=kill) 2024-04-21T07:43:03.613287-04:00 ns1 dovecot: master: Dovecot v2.3.19.1 (9b53102964) starting up for imap, lmtp, sieve, pop3 (core dumps disabled) journalctl | grep imap Apr 20 00:25:42 my dovecot[18869]: master: Dovecot v2.3.19.1 (9b53102964) starting up for imap, lmtp, sieve, pop3 (core dumps disabled) journalctl -u dovecot
По същия начин и за Postfix
journalctl -u postfix Apr 19 23:56:37 my systemd[1]: Starting postfix.service - Postfix Mail Transport Agent... Apr 19 23:56:37 my systemd[1]: Finished postfix.service - Postfix Mail Transport Agent.
Работата с journalctl е доста неудобна но какво да се прави, това е тенденцията.
nano /etc/dovecot/conf.d/10-master.conf service lmtp { # unix_listener lmtp { #mode = 0666 # } unix_listener /var/spool/postfix/private/dovecot-lmtp { group = postfix mode = 0600 user = postfix }
Рестартираме и проверяваме Dovecot.
systemctl restart dovecot systemctl status dovecot
postconf virtual_transport=lmtp:unix:private/dovecot-lmtp
nano /etc/dovecot/conf.d/20-lmtp.conf protocol lmtp { # Space separated list of plugins to load (default is global mail_plugins). #mail_plugins = $mail_plugins mail_plugins = $mail_plugins sieve } systemctl restart dovecot systemctl status dovecot
По принцип сега трябва да покажа дефиниране на квоти, но за сега ще отложим тази задача. Първо ще пуснем сървъра да праща и получава писма, а след това ще го надграждаме.
За да тестваме по-нататък са ни необходими програмите swaks и mutt. Да ги инсталираме.
apt install swaks mutt -y
Да пробваме да пратим писмо през SWAKS
swaks --server localhost --to tachko@my.tlan.net
Да проверим дали е пристигнало писмото използвайки IMAP протокола. За целта ще ползваме простия но много мощен IMAP клиент наречен mutt
mutt -f imaps://tachko@my.tlan.net@ ns1.my.tlan.net
Навярно ще Ви е трудно да свикнете с програмата затова по-добре да инсталираме един IMAP WEB базиран клиент.
Инсталиране на Roundcube от изходни файлове можете да прочетете на: https://tlan.net/menu/linux/debian/debian12/simplemail/simplemail12.php. По специално в частта Инсталиране на Roundcube. Първо да проверим дали всички пакети на PHP и Apache са инсталирани.
apt install apache2 apache2-utils -y apt install php libapache2-mod-php php-mysql php-net-ldap2 php-net-ldap3 php-imagick php-common php-gd php-imap php-json php-curl php-zip php-xml php-mbstring php-bz2 php-intl php-gmp php-net-smtp php-mail-mime -y
Сега ще инсталираме и самия Roundcube, но този път от репозиторите. Просто за разнообразие.
apt install -y roundcube roundcube-plugins roundcube-plugins-extra roundcube-mysql
Създаваме парола за администриране на базата на Roundcube.
Повтаряме паролата за съвпадение. Ако по-някаква причина сте сменили паролата на базата данни за Roundcube, то трябва да промените файла за връзка на Roundcube с базата данни.
nano /etc/roundcube/debian-db.php $dbuser='roundcube'; $dbpass='rcpaSS'; $basepath=''; $dbname='roundcube'; $dbserver='localhost'; $dbport='3306'; $dbtype='mysql';
Първото нещо което трябва да оправим е да позволим на Apache да го достига.
nano /etc/apache2/conf-available/roundcube.conf # Those aliases do not work properly with several hosts on your apache server # Uncomment them to use it or adapt them to your configuration # Alias /roundcube /var/lib/roundcube/public_html Alias /roundcube /var/lib/roundcube/public_html a2enconf roundcube service apache2 restart
И ако напишем в браузъра: https://my.tlan.net/roundcube/ Ще се отвори страницата за влизане в Roundcube. Можем да влезем примерно като tachko@my.tlan.net и ще си видим входящата поща и т.н. За сега обаче това не стига. Инсталирахме добавки и трябва да ги включим. Да проверим на кои портове и как влязохме в Roundcube.
nano /etc/roundcube/config.inc.php $config['imap_host'] = ["localhost:143"]; $config['smtp_host'] = 'localhost:587'; $config['imap_host'] = ["tls://my.tlan.net:143"]; $config['smtp_host'] = 'tls://my.tlan.net:587';
Да добавим допълненията password и managesieve.
nano /etc/roundcube/config.inc.php $config['plugins'] = [ // 'archive', // 'zipdownload', 'managesieve', 'password', ];
nano /etc/roundcube/plugins/password/config.inc.php <?php // Empty configuration for password // See /usr/share/roundcube/plugins/password/config.inc.php.dist for instructio> // Check the access right of the file if you put sensitive information in it. // $config=array(); // Използваме SQL. $config['password_driver'] = 'sql'; // Паролите да са по-дълги от 5 знака $config['password_minimum_length'] = 5; // Това ще презапише паролата в базата данни, дори ако не е променена. $config['password_force_save'] = true; // Криптографският алгоритъм за кодиране на паролата. $config['password_algorithm'] = 'blowfish-crypt'; // Добавете пред всяка парола този низ, така че Dovecot да знае как сме шифровали паролата. $config['password_algorithm_prefix'] = '{CRYPT}'; // Информация за връзка с локалната база данни. $config['password_db_dsn'] = 'mysql://pfadmin:adminpass@localhost/pfdb'; // SQL заявката, която се изпълнява за запис на новия хеш на паролата в базата данни. %P е контейнер за хеша на новата парола. И %u е влезлият потребител и удобно съвпада с имейл адреса. $config['password_query'] = "UPDATE virtual_users SET password=%P WHERE email=%u"; ?>
Файла отговарящ за плъгина за пароли да е собственост на root:www-data. Правата върху файла също да се променят.
chown root:www-data /etc/roundcube/plugins/password/config.inc.php chmod u=rw,g=r,o= /etc/roundcube/plugins/password/config.inc.php
Това допълнение наречено Sieve е правило от страна на сървъра. Dovecot изпълнява тези правила всеки път когато влезе нов мейл. Тук ще кажем на Roundcube как да има достъп до тези правила.
nano /etc/roundcube/plugins/managesieve/config.inc.php <?php // Empty configuration for password // See /usr/share/roundcube/plugins/password/config.inc.php.dist for instructio> // Check the access right of the file if you put sensitive information in it. // $config=array(); // Roundcube с кой сървър да говори: $config['managesieve_host'] = 'localhost'; ?>
Влезте в Roundcube https://my.tlan.net/roundcube като tachko@my.tlan.net
Филтрите се създават успешно. Да проверим:
nano /var/vmail/my.tlan.net/tachko/sieve/Roundcube.sieve # rule:[Трие TEST съобщения] if allof (header :contains "subject" "test") { discard; }
На практика се създаде файл: /var/vmail/my.tlan.net/tachko/sieve/Roundcube.sieve. За сега спираме с допълненията към Roundcube.
До тук трябва да има изградена структура на място където ще се разполагат писмата. Да проверим:
find /var/vmail
Има създадена структура Maildir за съхранение на писмата.
postfix check
Понякога се появяват следните грешки: “error: open database /etc/aliases.db: No such file or directory“? - изпълнете командата newaliases за да създадете нов машинен файл от псевдоними в /etc/aliases. “postfix/postfix-script: warning: symlink leaves directory: /etc/postfix/./makedefs.out“ - не обръщайте внимание на грешката, просто е бъг на Debian 12.
Отваряме втори терминал и в него пишем:
tail -f /var/log/mail.log
Така в реално време ще следим какво се записва в мейл лога. На първия терминал пишем:
swaks --to tachko@my.tlan.net --server localhost
В лога ще се появят надписи най-различни на вид. В крайна сметка трябва да се появи файл в: /var/vmail/my.tlan.net/tachko/Maildir/new/. Файла трябва да прилича нещо подобно на: '1714839033.M44886P8841.ns1,S=700,W=720:2,'. Този файл на практика е писмото което получихме. Можем да разгледаме пощата с помощта на mutt.
mutt -f /var/vmail/my.tlan.net/tachko/Maildir/
Мощен инструмент, можете да се задълбаете повече в способностите му. По същия начин можете да проверите пощата си чрез Roundcube или използвайки настолен мейл клиент.
До тук можем да получаваме поща но не можем да пращаме. Ако сте чели предните статии за елементарен пощенски съръвр ще попитате , та нали PostFix върши тази работа? Това е така, но първо сте написали писмо примерно през някой клиент, след това писмото е записано на сървъра. Dovecot достига до писмото и го вижда, но PostFix не го вижда и не знае какво да изпрати. За целта трябва да накараме Dovecot да препрати писмото до PostFix. Същевременно PostFix ще научи от Dovecot кой е собственика на писмото и за къде да ходи. Грубо казано Dovecot ще удостовери PostFix.
postconf smtpd_sasl_type=dovecot postconf smtpd_sasl_path=private/auth postconf smtpd_sasl_auth_enable=yes
postconf smtpd_tls_security_level=may postconf smtpd_tls_auth_only=yes postconf smtpd_tls_cert_file=/etc/letsencrypt/live/my.tlan.net/fullchain.pem postconf smtpd_tls_key_file=/etc/letsencrypt/live/my.tlan.net/privkey.pem postconf smtp_tls_security_level=may
Горните настройки позволяват криптирани входящи (smtpd_) и изходящи (smtp_) връзки. Но не ги налагат. Така че, ако отдалечен пощенски сървър не е с активирано криптиране, ние пак ще приемаме техните имейли. Може да се изкушите да наложите криптиране, но това би отхвърлило комуникацията по имейл със сървъри, които са конфигурирани без криптиране.
Ако ползваме telnet localhost smtp ще се свържем с ТСР на порт 25 да говорим по SMTP. Ние работим вече с криптиране. Независимо от всичко да опитаме:
telnet localhost smtp Trying ::1... Connected to localhost. Escape character is '^]'. 220 ns1.my.tlan.net ESMTP Postfix (Debian/GNU) ehlo my.tlan.net 250-ns1.my.tlan.net 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250-DSN 250-SMTPUTF8 250 CHUNKING quit 221 2.0.0 Bye Connection closed by foreign host.
Липва обаче ред със съдържание: 250-AUTH PLAIN LOGIN. Това е така защото нямаме криптирана връзка. Да направим теста наново:
telnet localhost smtp Trying ::1... Connected to localhost. Escape character is '^]'. 220 ns1.my.tlan.net ESMTP Postfix (Debian/GNU) ehlo my.tlan.net 250-mailtest 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250-DSN 250-SMTPUTF8 250 CHUNKING STARTTLS 220 2.0.0 Ready to start TLS quit
Теста по този начин е до тук, защото няма как да говорим със сървъра шифровано по този начин. За целта ползваме openssl.
openssl s_client -connect localhost:25 -starttls smtp ### Ще видите много много текст........ ehlo my.tlan.net 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN AUTH PLAIN AHRhY2hrb0BteS50bGFuLm5ldABJY2VtYW4= 235 2.7.0 Authentication successful quit
Кода за аутентикация го създаохме чрез:
printf '\0tachko@my.tlan.net\0Iceman' | base64 AHRhY2hrb0BteS50bGFuLm5ldABJY2VtYW4=
SMTP работи на порт 25. Тук ползваме не криптирана връзка. За нашата цел е необходимо да работим по TCP на порт 587. За целта:
nano /etc/postfix/master.cf #127.0.0.1:submission inet n - y - - smtpd #submission inet n - y - - smtpd submission inet n - y - - 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_reject_unlisted_recipient=no -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_relay_restrictions= -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING # -o syslog_name=postfix/submission # -o smtpd_tls_security_level=encrypt systemctl restart postfix
Вече можете да изпращате през порт 587 криптирано. Да проверим дали порта е активен. За целта ни е необходим netstat, който първо трябва да го инсталираме.
apt install net-tools -y netstat -ntulp | grep master tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 17197/master tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN 17197/master tcp6 0 0 :::25 :::* LISTEN 17197/master tcp6 0 0 :::587 :::* LISTEN 17197/master
Всичко е правилно. PostFix "слуша" на порт 587. Да изпратим криптирана тестова поща. За целта обаче трябва да инсталираме libnet-ssleay-perl.
apt install -y libnet-ssleay-perl swaks --server localhost --to tachko@my.tlan.net --port 587 -tls --auth-user tachko@my.tlan.net --auth-password Iceman
postconf smtpd_sender_login_maps=mysql:/etc/postfix/mysql-email2email.cf nano /etc/postfix/master.cf #127.0.0.1:submission inet n - y - - smtpd #submission inet n - y - - smtpd submission inet n - y - - 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_reject_unlisted_recipient=no -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_relay_restrictions= -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING -o smtpd_sender_restrictions=reject_sender_login_mismatch,permit_sasl_authenticated,reject # -o syslog_name=postfix/submission # -o smtpd_tls_security_level=encrypt systemctl restart postfix
Пробваме да пратим фалшив мейл
swaks --server localhost --from tachko@my.tachko.com --to tachko@my.tlan.net --port 587 -tls --auth-user tachko@my.tlan.net --auth-password Iceman
В mail.log трябва да прочетете нещо такова:
<~* 553 5.7.1 <tachko@my.tachko.com>: Sender address rejected: not owned by user tachko@my.tlan.net
Вече имаме пълноценен сървър за пощенски услуги. Следват няколко надстройки за ефективност и безопасност на работата му.
Квотите са ограничения на размера за потребителите. Можете да се уверите, че потребителите не губят произволно количество дисково пространство, а са принудени да почистват стари имейли от време на време. Какво се случва: ● Postfix трябва да отхвърля нови имейли, ако пощенската кутия на потребителя е над квотата. ● Dovecot трябва да следи квотата и колко потребителят вече е изразходвал от нея.
nano /etc/dovecot/conf.d/90-quota.conf ### Най-отгоре слагаме следното: plugin { quota = count:User quota quota_vsizes = yes quota_status_success = DUNNO quota_status_nouser = DUNNO quota_status_overquota = "452 4.2.2 Mailbox is full and cannot receive any more emails" } service quota-status { executable = /usr/lib/dovecot/quota-status -p postfix unix_listener /var/spool/postfix/private/quota-status { user = postfix } } systemctl restart dovecot
postconf smtpd_recipient_restrictions=reject_unauth_destination,"check_policy_service unix:private/quota-status"
Първо да ограничим размера на пощенската кутия на tachko@my.tlan.net на 5КВ.
mysql pfdb update virtual_users set quota=4000 where email='tachko@my.tlan.net'; quit
И самия тест:
swaks --server localhost --to tachko@my.tlan.net
Повторете изпращането на писма докато напълните кутията. Да си призная доста трябва да повторите операцията. По-лесния вариант е пращате от друг мейл писмо с прикачен файл по-голям от 5КВ. В резултат ще се получи следното съобщение във /var/log/mail.log:
2024-05-04T20:40:50.994052-04:00 ns1 postfix/smtpd[18212]: NOQUEUE: reject: RCPT from unknown[109.160.80.230]: 452 4.2.2 <tachko@my.tlan.net>: Recipient address rejected: Mailbox is full and cannot receive any more emails; from=<tachko@tachko.com> to=<tachko@my.tlan.net> proto=ESMTP helo=<mail.tachko.com>
Квотите работят, но потребителите трябва да са предупредени, че са надхвърлили лимита.
nano /etc/dovecot/conf.d/90-quota.conf plugin { quota = count:User quota quota_vsizes = yes quota_status_success = DUNNO quota_status_nouser = DUNNO quota_status_overquota = "452 4.2.2 Mailbox is full and cannot receive any more emails" } service quota-status { executable = /usr/lib/dovecot/quota-status -p postfix unix_listener /var/spool/postfix/private/quota-status { user = postfix } } plugin { quota_warning = storage=95%% quota-warning 95 %u quota_warning2 = storage=80%% quota-warning 80 %u } service quota-warning { executable = script /usr/local/bin/quota-warning.sh unix_listener quota-warning { user = vmail group = vmail mode = 0660 } }
За да работи плъгина се нуждаем от скрипт.
nano /usr/local/bin/quota-warning.sh #!/bin/sh PERCENT=$1 USER=$2 cat << EOF | /usr/lib/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing" From: postmaster@ns1.my.tlan.net Subject: Quota warning - $PERCENT% reached Your mailbox can only store a limited amount of emails. Currently it is $PERCENT% full. If you reach 100% then new emails cannot be stored. Thanks for your understanding. EOF chmod +x /usr/local/bin/quota-warning.sh systemctl restart dovecot
С това приключваме темата квоти.
Една от най-досадните теми които трябва да разгледам.
Тази тема я подхващам защото все по-често сървърите за електронна поща изискват Вие да имате както прав MX запис на домейна така и реверсивен. Пример: my.tlan.net MX preference = 10, mail exchanger = ns1.my.tlan.net my.tlan.net A 185.163.245.186 185.163.245.186 PTR my.tlan.net Това беше важно уточнение за да можем да преминем към следващата защита.
Подправянето на изпращача на имейл е действието на преструване, че контролирате имейл адреса на някой друг. Това е често срещан проблем при фишинга . Измамниците изпращат имейли с адрес на изпращача примерно something@paypal.com и се надяват, че получателят ще падне по него и ще им се довери. Всъщност SMTP не се интересува кой адрес на подател изпращате. Много доставчици на пощенски услуги налагат да изпращате имейли само с вашия собствен имейл адрес. Но някои не го правят. А на спамерите и измамниците очевидно не им пука въобще.
И така, преди приблизително десет години беше замислен нов метод, който добавяше криптографски подпис към заглавката на имейл, който получателят можеше да провери, за да провери автентичността на подателя и целостта на имейла. Подписът се създава с помощта на частен ключ, който има само изпращащият имейл сървър. След това може да бъде проверен от получателя чрез изтегляне на съответния публичен ключ от DNS зоната на изпращащия домейн и извършване на проверка на подписа. Това работи много подобно на PGP или S/MIME подписване – само на ниво домейн. Вашият пощенски сървър може автоматично да подписва всички изходящи имейли. Методът, който се използва днес, се нарича Domain Keys Identified Mail – или накратко: DKIM . Да вземем пример. Току-що изпратих имейл от GMail до личния си имейл акаунт на собствения си имейл сървър. Google използва DKIM подписване, така че имейлът получи тази допълнителна заглавка от пощенските сървъри на Google:
Received: by mail-lj1-f180.google.com with SMTP id 38308e7fff4ca-2e242b1df60so13255061fa.1 for <tachko@my.tlan.net>; Sun, 05 May 2024 04:41:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1714909283; x=1715514083; darn=my.tlan.net; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=FrAj/Bua85Zw/uU5cXA7aBmqGiCYVacze3wOEZAEyWk=; b=YpSFSyozoHNlmx5Ol75QNjrwqHP10Wg14JdGSgYZJGQoQ2kM3iALyb90U86vFccmDL /zlVmrUZ7yEcu3YDssvDn7BxytdP81zJnEqspVe/ktpXk5Lt4q9nV6pWbN2iYn78tazP mym/seQEg9JUw7uhJwq7k3981iVdUpDlwmeF09YStyR5KY0edfiHW803Pi88LK8iH5B/ WZyVK8U4I/F6A1xh8HSAig4xsMdBUt6upyEzFS7N1l4Q1L2eQxWtrJQFRfzxuZIYTkQ+ Z6y33DKoNgwxmFkmqvVlFpH7V3NYhLiBoA7xQV6dX8jxft2hz4HLGKvKdHPfAmErao/p 1x+A==
Трябва ми публичният DKIM ключ на Google, за да проверя този подпис. Той се съхранява в тяхната DNS зона като TXT запис на „ 20230601._domainkey.google.com“. „ 20230601 “ е ключът за избор, който е споменат в подписа като „s= 20230601 “. Можете да използвате произволен брой ключове, стига да създадете подписите със съвпадащия частен ключ. Частта „_domainkey“ е стандартният поддомейн за DKIM ключове. Така че нека вземем този TXT запис:
dig +short 20230601._domainkey.google.com txt "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4zd3nfUoLHWFbfoPZzAb8bvjsFIIFsNypweLuPe4M+vAP1YxObFxRnpvLYz7Z+bORKLber5aGmgFF9iaufsH1z0+aw8Qex7uDaafzWoJOM/6lAS5iI0JggZiUkqNpRQLL7H6E7HcvOMC61nJcO4r0PwLDZKwEaCs8gUHiqRn/SS3wqEZX29v/VOUVcI4BjaOz" "OCLaz7V8Bkwmj4Rqq4kaLQQrbfpjas1naScHTAmzULj0Rdp+L1vVyGitm+dd460PcTIG3Pn+FYrgQQo2fvnTcGiFFuMa8cpxgfH3rJztf1YFehLWwJWgeXTriuIyuxUabGdRQu7vh7GrObTsHmIHwIDAQAB"
Това е публичният ключ, който мога да използвам за проверка на подписа. Автоматизирана проверка може да се извърши с помощта на инструмента „opendkim-testmsg“, както е описано по-късно. Мога да го стартирам и да поставя целия имейл, включително заглавките и тялото в него. Ако не се оплаква със съобщение за грешка, значи подписът е правилен. Звучи добре? Тогава нека приложим това и за нашия имейл домейн.
Както е обяснено по-горе, имате нужда от частен ключ, който ще използва вашият имейл сървър, и публичен ключ, който се добавя към вашата DNS зона. rspamd вече може да създава DKIM ключове. Все пак може да искате да инсталирате „dig“, което позволява да се правят заявки за DNS записи. Работи подобно на „nslookup“, но е по-гъвкав.
apt install dnsutils
https://workaround.org/ispmail-bookworm/prepare-the-database/