ТудаСюда, почтовый сервер на Ubuntе (Exim4+Dovecot+Postfixadmin)

Приветствую всех читателей. В данной публикации или инструкции хочу подробно пролить свет на установку (MTA/MDA) сервер.

* местами буду краток, местами подробным…

Наши ресурсы

Платформу для выполнения задачи взял из маленького одно платного компьютера Odroid C1+ на базе Ubuntu 20 версии, купленный домен на хостинге в нашем случае medianet.pp.ua, статический ip адрес от интернет провайдера.

Постановка задачи:

348251fcf500c7cf60bf6e9b1b6a93bf.jpg

На базе операционной системы Linux Ubuntu не ниже 18.04 LTS или Debian подобной необходимо развернуть почтовый сервер Exim4 в качестве MTA, Dovecot в качестве MTA. Веб морда админа для добавления учетных записей пользователей, Postfixadmin. База данных Mysql для учета аккаунтов. Настройка Dkim+SPF для нормальной работы с сервисами типа Gmail. Apache и прочие плюшки.

59d7a66c3b7807863df60374fb1fc38f.jpg

Приступаем к настройке и установке всех компонентов

В первую очередь необходимо убедиться, что наш сервер имеет правильное имя хоста.

$ hostname -f 

mx.example.com

В файле /etc/hostname необходимо убедиться, что имя хоста короткое т.е. Не FQDN.

mail

В файле /etc/hosts необходимо в первой записи хоста указать имя FQDN.

127.0.0.1 mail.medianet.pp.ua localhost mail.localhost

Выполняем проверку командой hostname -f, результат mail.medianet.pp.ua полная FQDN запись, можно продолжать дальше. Иногда после изменения записи необходимо перезагрузить систему.

Установка вспомогательных компонентов:

sudo apt-get update

sudo apt-get install mc

sudo apt-get install tasksell

Установленные компоненты можно рассматривать как обязательные)))

Установка LAMP сервера:

sudo tasksel install lamp-server
sudo apt-get install php-mbstring
sudo apt-get install php7.4-fpm
sudo apt-get install php-curl
sudo apt-get install php7.4-sqlite3 php7.4-dom
sudo apt-get install composer

lamp это набор компонентов необходимы для нашего сервера: Apache — веб-сервер,   MySQL — СУБД, PHP необходимы для работы Postfixadmin и Dovecot. Авторизация аккаунтов будет через запрос к базе данных Mysql.

Выполняем базовую настройку mysql в которой необходимо задать root пароль для входа и администрирования:

sudo mysql_secure_installation

Утилита спросит вас необходимо ли включить компонент для валидации (проверки) паролей. Данный плагин проверяет надежность вашего пароля. Если вы решите настроить данный плагин, то сценарий предложит выбрать уровень проверки пароля. Наивысший уровень можно включить, нажав 2. Если данный плагин включать не требуется, введите No и далее нажмите на enter для перехода к следующему шагу. Следующим шагом утилита попросит вас ввести пароль суперпользователя, так как он ещё не задан, введите пароль, нажмите enter и введите пароль еще раз.

sudo mysql -u root -p

Выполняем вход с правами администратора, необходимо убедиться что пароль подходит Cli работает. Для просмотра всех пользователей базы данных выполняем: SELECT user FROM mysql.user; на выходе получаем перечень с учетной записью root. Все работает.

Установка почтовых пакетов Dovecot, Exim4 на Debian/Ubuntu:

sudo apt-get install opendkim-tools
sudo apt-get install exim4 exim4-base exim4-config exim4-daemon-heavy
sudo apt-get install dovecot-common dovecot-imapd dovecot-pop3d dovecot-mysql
sudo apt-get install dovecot-sieve dovecot-managesieved
sudo apt-get install php-imap

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

Данную директорию необходимо создавать с учетом использования дискового пространства, на мой взгляд 20Gb квота на пользователя сейчас нормальное явления так, что исходя из 15–20 аккаунтов выходит 200Gb выделенного диска.

Создание пользователя и папки для будущего хранения почты

useradd -r -u 1150 -g mail -d /var/vmail -s /sbin/nologin -c 'Virt Mail account' vmail

Создаем нового пользователя: vmail который входит в группу mail.

mkdir -p /var/vmail
chown vmail:mail /var/vmail
chmod 770 /var/vmail

Создаем каталог в нашем случае /var/vmail принадлежащий пользователю vmail и даем права на запись пользователям группы mail.

Создаем базу данный для postfixadmin в Mysql

mysql -u root -p
Enter password:

Выполнили вход при помощи CLI.

CREATE DATABASE postfix;
GRANT ALL PRIVILEGES ON postfix.* TO postfix@localhost IDENTIFIED BY 'MysqlPasswordForMailBase';
exit

Создаем базу с указанным уникальным паролем на базу postfix.

Устанавливаем postfixadmin систему управления ящиками через веб-интерфейс:

cd /srv/
wget -O postfixadmin.tgz https://github.com/postfixadmin/postfixadmin/archive/postfixadmin-3.3.10.tar.gz
tar -zxvf postfixadmin.tgz
mv postfixadmin-postfixadmin-3.3 /var/www/postfixadmin
cd /var/www/postfixadmin

Загружаем и распаковываем postfixadmin в нужный каталог.

chdmo +x install.sh
./ install
ln -s /srv/postfixadmin/public /var/www/html/postfixadmin

Устанавливаем Postfixadmin по скрипту. После успешной установки можно посетить офф., мануал по настройке: https://github.com/postfixadmin/postfixadmin/blob/master/INSTALL.TXT Автор не исключает, что от вариации операционной системы и возможных версий компонентов могу возникать непредвиденные зависимости в установке данного пакета.

chown www-data:www-data /var/www/postfixadmin
chmod 770 /var/www/postfixadmin
cd /var/www/postfixadmin/
chown -R www-data:www-data .
chmod -R 770 *

Выполняем присвоение прав на каталог. Следуем дальше по настройке postfixadmin.

cp config.inc.php /var/www/postfixadmin/config.local.php
chown www-data:www-data config.local.php
cd /etc/apache2/conf-enabled
mcedit postfixadmin.conf

postfixadmin.conf

Alias /postfix /var/www/postfixadmin

Options FollowSymLinks

DirectoryIndex index.php

Require all granted

Выполняем настройку postfixadmin для WEB сервера в нашем случае Apache2.

После чего перезагружаем его. service apache2 restart

Следующим этапом необходимо настраивать /var/www/postfixadmin/config.local.php

$CONF['configured'] = true;

$CONF['default_language'] = 'ru';


// Database Config
// mysql = MySQL 3.23 and 4.0, 4.1 or 5
// mysqli = MySQL 4.1+ or MariaDB
// pgsql = PostgreSQL
// sqlite = SQLite 3
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'MysqlPasswordForMailBase';
$CONF['database_name'] = 'postfix';


$CONF['encrypt'] = 'php_crypt:MD5'; // MD5

В этом файле необходимо отредактировать следующие строки в зависимости от вашей базы данных к которой будет подключаться postfixadmin и обязательно в параметре $CONF['encrypt'] необходимо указать MD5 метод шифрования. В случае если использовать другой метод шифрования клиент Thunderbird будет формировать противоречивый хеш и сходства паролей не будет, обязательно нужно учитывать, что dovecot работает с MD5. Сохраняем настройки.

Далее заходим через chrome http://youip/postfixadmin/setup.php

1b294a648e0b660f4891341eba8b9038.JPG

Генерируем пароль в строке «Genarate setup_password» и получаем следующую запись

$CONF['setup_password'] = '$2y$10$0ElPAbeR0JTTS71tgmLaRuoDJHUt/jaL8QL80Jn3W2LVg5XHrSgUq';

После добавления записи в файл настройки /var/www/postfixadmin/config.local.php заходим http://youip/postfixadmin/login.php

d7f9bad0265626b691ed60f0a0db5136.JPG

Далее необходимо создать алиас нашей доменной зоны *medianet.pp.ua и можно создать новый ящик для пользователя. С этой минуты наш postfixadmin создает новых пользователей в MYSQL и дальше почтовые программы Dovecot и Exim4 могут использовать их для аутентификации пользователей.

Настройка Dovecot

Необходимо настроить подключение к базе, логирование и основной конфигурационный файл. Напоминаю Dovecot — MDA сервер, отвечающий за работу IMAP (143 порт) и POP3 (110 порт). Как правило используют для внутренней почты предприятия, IMAP в отличие от POP3 оставляет письма на сервере при их прочтении, тогда как POP3 полностью выгружает все письма. В нашем примере SSL/TLS использовать не будем.

cd /etc/dovecot/
mcedit dovecot-sql.conf

Редактируем файлы с правами root.

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=MysqlPasswordForMailBase

default_pass_scheme = MD5-CRYPT
password_query = SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 1150 as userdb_uid, 8 as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n' as mail, 1150 AS uid, 8 AS gid, concat('dirsize:storage=', quota) AS quota FROM mailbox WHERE username = '%u' AND active = '1'

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

cd /var/log
mkdir dovecot
chown mail:mail dovecot
cd dovecot
touch dovecot-sieve.log
touch dovecot.log

chown mail:mail *
chmod 660 *

Создали папку для логов dovecot с необходимыми файлами и присвоили нужные права. Следующий этап основной конфиг /etc/dovecot/dovecot.conf.

cp /etc/dovecot/dovecot.conf dovecot.conf.old

dovecot.conf

## Dovecot configuration file
auth_debug = yes
auth_debug_passwords = yes
auth_mechanisms = plain login cram-md5
disable_plaintext_auth = no
#Приветствие
login_greeting = dovecot MUA ready
### LOGS #########################
log_path = /var/log/dovecot/dovecot.log
info_log_path = /var/log/dovecot/info-dovecot.log
auth_debug = yes
auth_verbose = yes
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_location = maildir:/var/vmail/%d/%u
mail_privileged_group = mail
managesieve_notify_capability = mailto
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date ihave
maildir_copy_with_hardlinks = yes
base_dir = /var/run/dovecot/
login_trusted_networks = 192.168.0.0/16
# На каких интерфейсах прослушивать соединения
listen = *
protocols = imap pop3 sieve
ssl  = no
# Способ аутентификации пользователей
userdb {
  args = /etc/dovecot/dovecot-sql.conf
  driver = sql
}
passdb {
    driver = sql
    args = /etc/dovecot/dovecot-sql.conf
}
# Путь к почтовой дириктории 
mail_location = mbox:~/mail:INBOX=/var/mail/%u
ssl_cert = /etc/ssl/mail/exim.pem
ssl_key = /etc/ssl/mail/exim-private.pem
auth_mechanisms = plain login cram-md5
# Плагины
mail_plugins = quota

service auth {
  unix_listener auth-client {
    group = mail
    mode = 0660
    user = mail
  }
  unix_listener auth-master {
    group = mail
    mode = 0660
    user = mail
  }
  user = root
}
service imap-login {
  chroot = login
  executable = /usr/lib/dovecot/imap-login
  process_limit = 128
  process_min_avail = 3
  service_count = 1
  user = dovecot
  vsz_limit = 64 M
}
service imap {
  executable = /usr/lib/dovecot/imap
}
service managesieve-login {
  chroot = login
  inet_listener sieve {
    address = 127.0.0.1
    port = 4190
  }
  process_limit = 128
  process_min_avail = 3
  service_count = 1
  user = dovecot
  vsz_limit = 64 M
}
service pop3-login {
  chroot = login
  executable = /usr/lib/dovecot/pop3-login
  process_limit = 128
  process_min_avail = 3
  service_count = 1
  user = dovecot
  vsz_limit = 64 M
}
service pop3 {
  executable = /usr/lib/dovecot/pop3
}
verbose_proctitle = yes
protocol imap {
  imap_max_line_length = 64 k
}
protocol pop3 {
  pop3_uidl_format = %08Xu%08Xv
}
protocol lda {
  auth_socket_path = /var/run/dovecot/auth-master
  lda_mailbox_autocreate = yes
  lda_mailbox_autosubscribe = yes
  log_path = /var/log/dovecot-sieve.log
  mail_plugins = "autocreate sieve"
  postmaster_address = postmaster@medianet.pp.ua
}
service stats {
    unix_listener stats-reader {
        user = mail
        group = mail
        mode = 0660
    }
    unix_listener stats-writer {
        user = mail
        group = mail
        mode = 0660
    }
}
protocol imap {
    mail_max_userip_connections = 10
    mail_plugins = $mail_plugins imap_quota
}
protocol pop3 {
    pop3_uidl_format = %08Xu%08Xv

По завершению настройки убеждаемся, что сервис работает.

systemctl dovecot start
service dovecot restart
service dovecot status

Просматриваем статус после перезагрузки Active: active (running) и можно взглянуть на логи.

cat /var/log/dovecot/dovecot.log
получаем master: Warning: Killed with signal 15 (by pid=3670 uid=0 code=kill)
Отлично, работает!

Настройка EXIM4

Необходимо настроить подключение к базе и основной конфигурационный файл. Разработчик предлагает настраивать каждую секцию конфигурации в отдельном файле, на мой взгляд удобнее иметь весь набор параметров в одном файле. Напоминаю Exim4 — MTA сервер, отвечающий за работу SMTP (25 порт).

В нашем примере применим DKIM.

/etc/exim4/exim4.conf

######################################################################
#                    MAIN CONFIGURATION SETTINGS                     #
######################################################################
# Имя сервера в заголовке
smtp_banner = "$primary_hostname, (-=RSTP=-local Domain: $local_part) ESMTP EXIM $version_number"

primary_hostname = mail.medianet.pp.ua

daemon_smtp_ports = 25
tls_on_connect_ports=465

#######################################################################
###					Настройка подключения к Mysql					###
#######################################################################

hide mysql_servers = localhost/postfix/postfix/MysqlPasswordForMailBase

exim_path = /usr/sbin/exim4

CONFDIR = /etc/exim4


# debconf-driven macro definitions get inserted after this line
UPEX4CmacrosUPEX4C = 1


domainlist local_domains = ${lookup mysql{SELECT `domain` FROM `domain` WHERE `domain`='${quote_mysql:$domain}' AND `active`='1'}}


#domainlist relay_to_domains =  medianet.lan : medianet.pp.ua

domainlist relay_to_domains = ${lookup mysql{SELECT `domain` FROM `domain` WHERE `domain`='${quote_mysql:$domain}' AND `active`='1'}}

hostlist relay_from_hosts = localhost : 127.0.0.0/8 : 192.168.0.0/16 : 192.168.3.0/24

#acl_smtp_helo = acl_check_helo
#acl_smtp_mail = acl_check_from
acl_smtp_rcpt = acl_check_rcpt
#acl_smtp_mime = acl_check_mime
#acl_smtp_data = acl_check_data


log_selector = \
    +all_parents \
    +connection_reject \
    +incoming_interface \
    +lost_incoming_connection \
    +received_sender \
    +received_recipients \
    +smtp_confirmation \
    +smtp_syntax_error \
    +smtp_protocol_error \
    +queue_run \
    +host_lookup_failed \
    +smtp_mailauth \
    +sender_verify_fail \
    +all \

# av_scanner = clamd:/run/clamav/clamd.ctl

#MAIN_HOST_LOOKUP = *
#host_lookup = MAIN_HOST_LOOKUP

#dns_dnssec_ok = 1

#prdr_enable = true

# users in admin group can do many other things
# admin_groups = 

#######################################################################
###              Секция для настройки SSL							###
#######################################################################

#tls_advertise_hosts = *
#tls_certificate = /etc/exim4/dovecot.pem
#tls_privatekey = /etc/exim4/dovecot.key


######################################################################
#                       ACL CONFIGURATION                            #
#         Specifies access control lists for incoming SMTP mail      #
######################################################################
begin acl

acl_check_rcpt:

accept  hosts         = +relay_from_hosts
#  accept  authenticated = *
#  deny    message       = relay not permitted (FROM THIS IP address)

  # принимать сообщения которые пришли с локалхоста,
  # не по TCP/IP
 # accept  hosts = :

  # Запрещаем письма содержащие в локальной части
  # символы @; %; !; /; |. Учтите, если у вас было
  # `percent_hack_domains` то % надо убрать.
  # Проверяются локальные домены
#  deny    message       = "incorrect symbol in address"
#          domains       = +local_domains
#          local_parts   = ^[.] : ^.*[@%!/|]

  # Проверяем недопустимые символы для
  # нелокальных получателей:
#  deny    message       = "incorrect symbol in address"
#          domains       = !+local_domains
#          local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./

  # Принимаем почту для постмастеров локальных доменов без
  # проверки отправителя (я закомментировал, т.к. это -
  # основной источник спама с мой ящик).

 # accept  local_parts   = postmaster
#          domains       = +local_domains

  # Запрещщаем, если невозможно проверить отправителя
  # (отсутствует в списке локальных пользователей)
  # У себя я это закоментил, по причине, что некоторые
  # железяки (принтеры, & etc) и программы (Касперский, DrWEB)
  # умеют слать почту, в случае проблем но не умеют ставить
  # нужного отправителя. Такие письма эта проверка не пускает.
#  require verify        = sender

  # Запрещщаем тех, кто не обменивается приветственными
  # сообщениями (HELO/EHLO)
#  deny    message       = "HELO/EHLO require by SMTP RFC"
#          condition     = ${if eq{$sender_helo_name}{}{yes}{no}}

  # Принимаем сообщения от тех, кто аутентифицировался:
  # Вообще, большинство конфигов в рунете - это один и тот же
  # конфиг написанный Ginger, в котором этот пункт расположен
  # внизу. Но при таком расположении рубятся клиенты с adsl,
  # ppp, и прочие зарезанные на последующих проверках. Но это
  # жа неправильно! Этом мои пользователи из дома! Потому
  # я это правило расположил до проверок.
  accept  authenticated = *

# Рубаем нах, тех, кто подставляет свой IP в HELO
#  deny    message       = "Your IP in HELO - access denied!"
#          hosts         =  * : !+relay_from_hosts : !81-196.lissyara.su
#          condition     = ${if eq{$sender_helo_name}\
#    {$sender_host_address}{true}{false}}


# Рубаем тех, кто в HELO пихает мой IP (2500 мудаков за месяц!)
  deny    condition     = ${if eq{$sender_helo_name}\
    {$interface_address}{yes}{no}}
          hosts         = !127.0.0.1 : !localhost : *
          message       = "main IP in your HELO! Access denied!"

# Рубаем тех, кто в HELO пихает только цифры
# (не бывает хостов ТОЛЬКО из цифр)
#  deny    condition     = ${if match{$sender_helo_name}\
#    {\N^\d+$\N}{yes}{no}}
#          hosts         = !127.0.0.1 : !localhost : *
#          message       = "can not be only number in HELO!"

  # Рубаем хосты типа *adsl*; *dialup*; *pool*;....
  # Нормальные люди с таких не пишут. Если будут
  # проблемы - уберёте проблемный пункт (у меня клиенты
  # имеют запись типа asdl-1233.zone.su - я ADSL убрал...)
#  deny    message       = "your hostname is bad (adsl, poll, ppp & etc)."
#          condition     = ${if match{$sender_host_name} \
#                               {adsl|dialup|pool|peer|dhcp} \
#                               {yes}{no}}

  # Задержка. (это такой метод борьбы со спамом,
  # основанный на принципе его рассылки) На этом рубается
  # почти весь спам. Единственно - метод неприменим на
  # реально загруженных MTA - т.к. в результате ему
  # приходится держать много открытых соединений.
  # но на офисе в сотню-две человек - шикарный метод.
  #
  # более сложный вариант, смотрите в статье по exim и
  # курьер имап. Т.к. там метод боле умный (просто правил
  # больше :), то можно и на более загруженные сервера ставить)
#  warn
        # ставим дефолтовую задержку в 20 секунд
#        set acl_m0 = 30s
#  warn
        # ставим задержку в 0 секунд своим хостам и
        # дружественным сетям (соседняя контора :))
#        hosts = +relay_from_hosts:213.234.195.224/28:80.253.9.18/32
#        set acl_m0 = 0s
#  warn
        # пишем в логи задержку (если оно вам надо)
#        logwrite = Delay $acl_m0 for $sender_host_name \
#[$sender_host_address] with HELO=$sender_helo_name. Mail \
#from $sender_address to $local_part@$domain.
#        delay = $acl_m0


  # Проверка получателя в локальных доменах.
  # Если не проходит, то проверяется следующий ACL,
  # и если непрошёл и там - deny
#  accept  domains       = +local_domains
#          endpass
#          message       = "In my mailserver not stored this user"
#          verify        = recipient

  # Проверяем получателя в релейных доменах
  # Опять-таки если не проходит -> следующий ACL,
  # и если непрошёл и там - deny
#  accept  domains       = +relay_to_domains
#          endpass
#          message       = "main server not know how relay to this address"
#          verify        = recipient

  # Рубаем тех, кто в блэк-листах. Серваки перебираются
  # сверху вниз, если не хост не найден на первом, то
  # запрашивается второй, и т.д. Если не найден ни в одном
  # из списка - то почта пропускается.
# deny    message       = you in blacklist: $dnslist_domain \n $dnslist_text
#          dnslists      = opm.blitzed.org : \
#                          cbl.abuseat.org : \
#                          bl.csma.biz : \
#                          dynablock.njabl.org

  # Разрешаем почту от доменов в списке relay_from_hosts
#  accept  hosts         = +relay_from_hosts

  # Если неподошло ни одно правило - чувак явно ищет
  # открытый релей. Пшёл прочь. :)
#  deny    message       = "Homo hominus lupus est"




# Тут идут ACL проверяющие содержимое (тело) письма.
# Без них будут пропускаться все сообщения.

#acl_check_data:
#
  # Проверяем письмо на вирусы
#  deny malware = *
#  message = "In e-mail found VIRUS - $malware_name"

  # Если есть необходимость - тут проверки на спам

  # Пропускаем остальное
  accept

control = suppress_local_fixups
######################################################################
#                      ROUTERS CONFIGURATION                         #
#               Specifies how addresses are handled                  #
######################################################################

begin routers

# Отправка на системные алиасы
#sys_alias:
#    driver      = redirect
#    data        = ${lookup{$local_part}lsearch{/etc/aliases}}
#    file_transport  = address_file
#    pipe_transport  = address_pipe
#    allow_fail
#    allow_defer

# Поиск маршрута к хосту в DNS. Не проверяются 0.0.0.0 и 127.0.0.0/8
dnslookup:
driver = dnslookup
domains = ! +local_domains
transport = remote_smtp
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
no_more

# Почтовые алиасы (виртуальные адреса)
system_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup mysql{SELECT `goto` FROM `alias` WHERE `address`='${quote_mysql:$local_part@$domain}' OR `address`='${quote_mysql:@$domain}'}}
# data = ${lookup{$local_part}lsearch{/etc/exim/alias}}

 # Получение почты на локальный ящик с альтернативным доменным именем из Postfixadmin
alias_domain_mailbox:
   driver = accept
   condition = ${lookup mysql{SELECT mailbox.maildir \
                              FROM alias_domain \
                              JOIN mailbox ON mailbox.local_part = LCASE('${quote_mysql:$local_part}') \
                                AND mailbox.domain = alias_domain.target_domain \
                                AND mailbox.active = 1 \
                              WHERE alias_domain.alias_domain = LCASE('${quote_mysql:$domain}') \
                                AND alias_domain.active = 1}{yes}{no}}
   transport = dovecot_virtual_delivery
   cannot_route_message = Unknown user


dovecot_user:
driver = accept
condition = ${lookup mysql{SELECT `goto` FROM `alias` WHERE `address`='${quote_mysql:$local_part@$domain}' OR `address`='${quote_mysql:@$domain}'}{yes}{no}}
transport = dovecot_delivery

vrouter:
  driver = accept
  require_files = +/home/vmail/$local_part@$domain/
  transport = dovecot_delivery

######################################################################
#                      TRANSPORTS CONFIGURATION                      #

begin transports

remote_smtp:
driver = smtp

dovecot_delivery:
driver = pipe
debug_print = "T: dovecot_delivery for $local_part@$domain"
command = /usr/lib/dovecot/dovecot-lda -d $local_part@$domain
message_prefix =
message_suffix =
delivery_date_add
envelope_to_add
return_path_add = false
log_output
user = vmail

# Транспорт для локальных получателей из Dovecot
dovecot_virtual_delivery:
   driver = pipe
   command = /usr/libexec/dovecot/deliver -d $local_part@$domain -f $sender_address
   message_prefix =
   message_suffix =
   delivery_date_add
   envelope_to_add
   return_path_add
   log_output
   user = vmail
   temp_errors = 64 : 69 : 70: 71 : 72 : 73 : 74 : 75 : 78

# Транспорт а-ля "труба"
address_pipe:
driver = pipe
return_output

# Автоответчик
address_reply:
driver = autoreply


######################################################################
#                      RETRY CONFIGURATION                           #
######################################################################

begin retry


*                      *           F,2h,15m; G,16h,1h,1.5; F,4d,6h

######################################################################
#                      REWRITE CONFIGURATION                         #
######################################################################

begin rewrite

######################################################################
#                   AUTHENTICATION CONFIGURATION                     #
######################################################################

begin authenticators

auth_plain:
  driver = plaintext
  public_name = LOGIN
  server_advertise_condition = ${if eq{$2}{}{no}{yes}}
  server_condition = ${lookup mysql{SELECT password FROM users WHERE username='${quote_mysql:$1}'}{yes}{no}}
  server_set_id = $1
  server_prompts = :

#######################################################################

Аналогично прошлому сервису проверяем работоспособность:

systemct exim4 start
service exim4 restart
service exim4 status

Просматриваем статус после перезагрузки Active: active (running).

Просматриваем общий вид прослушиваемых tcp портов

netstat -lntup

494a8e000df37749a31c9184d6f953f0.JPG

Подключаем DKIM к EXIM4

Установку пакета мы произвели ранее. Для чего он нужен писать не буду, но глобальные сервисы такие как GMAIL будут отсеивать письма без наличия dkim и spf.

Переходим к настройке:

mkdir /etc/exim4/dkim
chown -R Debian-exim:Debian-exim /etc/exim4/dkim
opendkim-genkey -D /etc/exim4/dkim/ -d medianet.pp.ua -s dkim_cert
chown -R Debian-exim:Debian-exim medianet.pp.ua.key
chmod 640 medianet.pp.ua.key

Получаем закрытый от открытый ключ значения из которого необходимо внести в /etc/exim4/exim4.conf и DNS записи на хостинге.

/etc/exim4/dkim/dkim_cert.txt

0107f5c29842263f4d87a79d6d5c257c.png

Добавляем параметры в /etc/exim4/exim4.conf в секцию transport после remote_smtp:

/etc/exim4/exim4.conf

e1832204ba2004acfbc4090205e2c3a5.JPG

Полагаю, что все ясно. Вносим записи на хостинге в DNS.

hosting.COM

9872bde8a3e913eb20c17051f46d57be.png

Вносим две TXT записи для DKIM и SPF глядя на dkim_cert.txt. Вторая запись разрешает пересылку со всех адресов.

Финальные настройки произведены успешно, обязательно нужно отметить Mail Server расположен за NAT в локальной сети, соответственно нужно пробросить на него 25 (SMTP). Следуем отметить, что на самом деле это только начало тяжелой дальнейшей работы в которой нужно как часто говорят «вылезать сервер». В следующем разделе я поделюсь личным опытом в некоторых вещах.

Debug и Отладка

Заводим новых пользователей

Через web админку создаем нового пользователя

220aa9ee8c404483ca8579fb7663878b.jpg

проверяем доступность пользователя

doveadm auth test -x service=imap -x rip=192.168.0.200 touch@medianet.pp.ua
вводим пароль

doveadm auth test -x service=imap -x rip=192.168.0.200 touch@medianet.pp.ua

Password:
passdb: touch@medianet.pp.ua auth succeeded
extra fields:
  user=touch@medianet.pp.ua
По видимому результату хеш запись в БД верная с dovecot и пользователь touch@medianet.pp.ua готов к авторизации

Настройки Thundebird для нового пользователя

d9cc56722422cff912f5e8f63b57ae8d.jpg

Каждый пользователь имеет возможность настроить редирект почты и поменять пароль через web морду postfixadmin.

http://youip/postfixadmin/users/login.php

e83c74b261a2621fc520d2d1ec78ec4f.jpg

Полезные команды для Exim & Dovecot и системные

--help

###___Dovecot___###########################################################

#Просмотр всех настроек Dovecot
dovecot -a

#Просмотр настроек отличных от дефолтных
dovecot -n

#Просмотр активных подключений
doveadm who

#Тестирование аутентификации для пользователя(где rip-remote ip)
doveadm auth test -x service=imap -x rip=10.10.1.4 username@example.com
doveadm auth test -x service=pop3 -x rip=10.10.1.4 username@example.com

#Просмотр квоты пользователя
doveadm quota get -u username@example.com

#Удаление таких сообщений(всех сообщений из каталога Trash)
doveadm expunge -u username@example.com mailbox Trash all

#Удаление писем из папки Спам старше 12 недель для всех ящиков:
doveadm expunge -A mailbox Junk BEFORE 12w

###########################################################################
###___Exim___##############################################################

#Отображение всех настроек Exim
exim -bP

#Отображение очереди
exim -bpc
exim -bp

#Удалить все сообщения, которые старше, чем Х секунд из очереди (например, 5 дней будет 432 000 секунд)
exiqgrep -o 432000 -i | xargs exim -Mrm

#Отображение всех сообщений в очереди (количество, объем, старых, новых, области, и итоги)
exim -bp|exiqsumm

#Просмотр заголовков сообщения в очереди
exim -Mvh

#Отправка тестового письма (Для внутренне проверки очень удобно)
echo «Testing our Exim1» | mail -s Test touch@medianet.pp.ua

#Команда проверки секции ROUTER в exim4 (очень полезная вещь)
exim -bt admin@i.XXX

#проверка настроек DKIM
exim -bP transports | grep dkim

# Отчистка Frozen сообщений
exiqgrep -z -i | xargs -n 1 exim -M
или
exim -bp|grep frozen|awk '{print $3}' |xargs exim -Mrm

############################################################################
####___SYSTEM_utils___######################################################

#Определение адреса хоста по имени (требует установки в системе dnsutils)
dig hostanem.domain

Завершая историю хочу отметить, настраивая и восстанавливая сервер или отдельную службу, стал замечать как забываю тонкости той или иной настройки особенно если события были давно. Буду рад, если публикация будет вам полезна…

© Habrahabr.ru