Linux
  • << DEBIAN >>

  •   Сървър на отделни хостове
  •     DNS Сървър
  •     SQL Сървър
  •     WEB Сървър
  •     Пощенски Сървър
  •   PXE Server
  •   PXE UEFI Server - TFTP
  •   Debian 9
  •     Инсталиране на Debian 9
  •     Първоначални настройки (мрежа, VIM, Кирилизация)
  •     Инсталиране и настройка на SSH
  •     Инсталиране и настройка на DNS
  •     Инсталиране и настройка на NTP
  •     Инсталиране и настройка на Apache
  •     Инсталиране и настройка на MySQL (MariaDB)
  •     Инсталиране и настройка на PHPMyAdmin
  •     Инсталиране и настройка на собствен облак
  •     Инсталиране и настройка на SAMBA
  •     Инсталиране и настройка на FTP сървър
  •     Инсталиране и настройка на OSCAM
  •     Инсталиране и настройка на Mail server
  •       Първоначално конфигуриране на базата данни
  •       Инсталиране и конфигуриране на PostFix
  •       Инсталиране и конфигуриране на Dovecot
  •       PostFix дефинира Dovecot да удостоверява
  •       RoundCube
  •       Тестване доставката на поща
  •       Създаване на TLS криптиран ключ и сертификат
  •       WEB администриране
  •       Антиспам със SpamAssassin
  •       Антиспам с RSpmad
  •   Debian 11
  •     Как зарежда Linux
  •     Разпределение на диска при BIOS и UEFI
  •     Debian 11 на BIOS върху LVM и RAID
  •     Инсталиране на Debian 11 на BIOS и ZFS
  •     Инсталиране на Debian 11 на BIOS и ZFS-1
  •     Инсталиране на Debian 11 на UEFI и ZFS
  •     ZFS Замяна на развален огледален диск
  •     Ремонт на GRUB и INITRAMFS
  •   Debian 12
  •     Първоначални настройки
  •     DNS Сървър
  •     Инсталиране и настройка на Apache
  •     Инсталиране и настройка на Nginx
  •     MySQL и PHPMyAdmin
  •     Елементарен MAIL сървър
  •       Подобрение SSL/TLS, Maildir, LMTP
  •       Подобрение ВИРТУАЛИЗАЦИЯ без MySQL
  •       Подобрение ВИРТУАЛИЗАЦИЯ и MySQL
  •       Подобрение Антиспам - SpamAssasin
  •       Подобрение Антиспам - RSpamd
  •     Пълноценен MAIL сървър
  •     Пощенски сървър с iRedMail и PHPMyAdmin
  •     Сървър за отдалечен достъп - RustDESK
  • << UBUNTU >>
  •   Ubuntu SERVER 22.04
  •     Инсталиране на Ubuntu 22.04 Server
  •     Първоначални настройки на Ubuntu 22.04 Server
  •     DNS в Ubuntu 22.04 Server
  •     MySQL Apache PHPMyAdmin
  •     Пощенски сървър
  •       Пощенски сървър в опростен вариант
  •       PostFix, Dovecot по-подробно
  •   Ubuntu mini
  • Инсталиране и настройка на пощенски сървър с виртуални домейни и кутии

    Ако не сте следили статиите за 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 Дълго се колебаех как да започна темата. Дали да продължа от елементарния сървъра за електронна поща или да почна отначало да го изграждам. Спрях се на втория вариант. В първия вариант има създадени много зависимости докато ги върнем в изходно състояние и след това да почнем виртуализацията, ще стане много объркващо. Затова предпочетох да започнем на чисто.

    Подготовка на база данни

    Създаване на база pfdb за пощенския сървър и потребители боравещи с нея

    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.

    Създаване на таблици в базата pfdb

    Таблица за виртуалните домейни.

    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

    Инсталиране и конфигуриране на PostFix

    За начало да инсталираме PostFix и допълнението му за работа с MySQL.

    apt install postfix postfix-mysql -y

    Pic01

    Pic02

    Pic03

    Внимание !!! Ползваме пълното име на хоста (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.

    Всичко е наред продължаваме.

    PostFix взема данни от MySQL

    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

    Dovecot

    Инсталиране и настройка на Dovecot

    Започваме с инсталацията.

    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

    Конфигуриране на Dovecot.

    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 ### Трябва да изглежда: #!include auth-system.conf.ext !include auth-sql.conf.ext #!include auth-ldap.conf.ext nano /etc/dovecot/conf.d/10-mail.conf mail_location = mbox:~/mail:INBOX=/var/mail/%u ### променяме на: # mail_location = mbox:~/mail:INBOX=/var/mail/%u mail_location = maildir:~/Maildir mail_plugins = quota ### Много внимавайте пред /Maildir да има знака ~ ### Сега ще се създадат пощенски кутии в /home/{име на потребителя}/Maildir и т.н. ### В последствие ще бъдат във /var/vmail/...и т.н. nano /etc/dovecot/conf.d/10-master.conf # Postfix smtp-auth #unix_listener /var/spool/postfix/private/auth { # mode = 0666 #} ### Трябва да изглежда: unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } nano /etc/dovecot/conf.d/10-ssl.conf ### Търсим ssl_cert = </etc/dovecot/private/dovecot.pem ssl_key = </etc/dovecot/private/dovecot.key ### Променяме на ssl_cert = </etc/letsencrypt/live/my.tlan.net/fullchain.pem ssl_key = </etc/letsencrypt/live/my.tlan.net/privkey.pem ### Търсим ssl = yes ### Променяме на ssl = required nano /etc/dovecot/conf.d/auth-sql.conf.ext ### Вълнуват ни секциите userdb и passdb ### Търсим userdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } nano /etc/dovecot/dovecot-sql.conf.ext ### Най-отгоре driver = mysql connect = \ host=127.0.0.1 \ dbname=pfdb \ user=pfuser \ password=pfpass user_query = SELECT email as user, \ concat('*:bytes=', quota) AS quota_rule, \ '/var/vmail/%d/%n' AS home, \ 5000 AS uid, 5000 AS gid \ FROM virtual_users WHERE email='%u' password_query = SELECT password FROM virtual_users WHERE email='%u' iterate_query = SELECT email AS user FROM virtual_users

    (\) означава, че командата продължава на следващия ред. Фиксираме ограничения

    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 е доста неудобна но какво да се прави, това е тенденцията.

    Postfix изпраща имейли до Dovecot

    Dovecot къде да слуша за LMTP връзки от Postfix

    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

    PostFix да доставя поща до Dovecot чрез LMTP

    postconf virtual_transport=lmtp:unix:private/dovecot-lmtp

    server-side правила за писмата

    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

    Инсталиране на 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

    Сега ще инсталираме и самия Roundcube, но този път от репозиторите. Просто за разнообразие.

    apt install -y roundcube roundcube-plugins roundcube-plugins-extra roundcube-mysql


    Pic04

    Pic05

    Създаваме парола за администриране на базата на Roundcube.

    Pic06

    Повтаряме паролата за съвпадение. Ако по-някаква причина сте сменили паролата на базата данни за 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

    Това допълнение наречено 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

    Pic01
    Pic02
    Pic03
    Pic04
    Pic05
    Pic06
    Pic07
    Pic08
    Pic09

    Филтрите се създават успешно. Да проверим:

    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

    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/

    Pic10

    Мощен инструмент, можете да се задълбаете повече в способностите му. По същия начин можете да проверите пощата си чрез Roundcube или използвайки настолен мейл клиент.

    Изпращане на поща

    Препредаване на изходящата поща през PostFix

    До тук можем да получаваме поща но не можем да пращаме. Ако сте чели предните статии за елементарен пощенски съръвр ще попитате , та нали PostFix върши тази работа? Това е така, но първо сте написали писмо примерно през някой клиент, след това писмото е записано на сървъра. Dovecot достига до писмото и го вижда, но PostFix не го вижда и не знае какво да изпрати. За целта трябва да накараме Dovecot да препрати писмото до PostFix. Същевременно PostFix ще научи от Dovecot кой е собственика на писмото и за къде да ходи. Грубо казано Dovecot ще удостовери PostFix.

    PostFix се удостоверява от Dovecot

    postconf smtpd_sasl_type=dovecot postconf smtpd_sasl_path=private/auth postconf smtpd_sasl_auth_enable=yes

    Активиране на криптиранията в PostFix

    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_) връзки. Но не ги налагат. Така че, ако отдалечен пощенски сървър не е с активирано криптиране, ние пак ще приемаме техните имейли. Може да се изкушите да наложите криптиране, но това би отхвърлило комуникацията по имейл със сървъри, които са конфигурирани без криптиране.

    Тест на 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=

    Порт за подаване на PostFix

    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 трябва да следи квотата и колко потребителят вече е изразходвал от нея.

    Услуга за квотна политика на 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

    Postfix ограничения за получатели

    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

    С това приключваме темата квоти.

    АНТИСПАМ

    Една от най-досадните теми които трябва да разгледам.

    Настройка на DNS записи

    Тази тема я подхващам защото все по-често сървърите за електронна поща изискват Вие да имате както прав 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 Това беше важно уточнение за да можем да преминем към следващата защита.

    Предотвратяване на подправяне с помощта на DKIM

    Подправянето на изпращача на имейл е действието на преструване, че контролирате имейл адреса на някой друг. Това е често срещан проблем при фишинга . Измамниците изпращат имейли с адрес на изпращача примерно something@paypal.com и се надяват, че получателят ще падне по него и ще им се довери. Всъщност SMTP не се интересува кой адрес на подател изпращате. Много доставчици на пощенски услуги налагат да изпращате имейли само с вашия собствен имейл адрес. Но някои не го правят. А на спамерите и измамниците очевидно не им пука въобще.

    Спуфинг случай без DKIM

    И така, преди приблизително десет години беше замислен нов метод, който добавяше криптографски подпис към заглавката на имейл, който получателят можеше да провери, за да провери автентичността на подателя и целостта на имейла. Подписът се създава с помощта на частен ключ, който има само изпращащият имейл сървър. След това може да бъде проверен от получателя чрез изтегляне на съответния публичен ключ от 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/