Postfix Dovecot MySql

From wiki.habital.lv
Revision as of 18:44, 7 December 2018 by Eugene (talk | contribs) (→‎Postfix)
Jump to navigation Jump to search

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

Для этого в качестве основы создания серверов будет использоваться “vagrant” и “virtualbox”. Пакеты “vagrant” и “virtualbox” можно взять непосредственно с сайтов.

Создание гостевых узлов

В качестве сервера виртуальных машин был выбран “Oracle Linux 7”. Для этого с сайта “Oracle” был взят готовый образ для “vagrant”.

Vagrant

Установку “virtualbox” по всей видимости можно здесь не рассматривать, так как это на мой взгляд не представляет никаких проблем. Остановимся на установке гостевых систем с помощью “vagrant”. После инсталляции пакета “vagrant” и заранее установленного пакета “virtualbox” от имени не root-пользователя производится добавление гостевого исходного образа (box) и его инициализация:

$ vagrant box add --name ol7 https://yum.oracle.com/boxes/oraclelinux/ol75/ol75.box
$ vagrant init ol7
$ vagrant up
$ vagrant ssh

После того, как гостевая система успешно загрузится и произойдёт удачное подключение по ssh-протоколу, из гостевой системы можно будет выйти и остановить её:

$ vagrant halt

и в домашнем каталоге появится файл “Vagrantfile”. Кроме того, если запустить “virtualbox”, то можно будет увидеть, что появилась новая гостевая система. Все настройки этой и других гостевых систем, созданных с помощью “vagrant”, осуществляются в файле “Vagrantfile”.

У гостевого сервера всегда будет присутствовать один сетевой интерфейс с внутренним адресом сети “virtualbox”. В данном случае это будет один из адресов сети “10.0.2.0/24”. Кроме того, нам понадобится дополнительная внутренняя сеть для всех гостевых систем.

Для удобства имя гостевой системы в “virtualbox” можно будет переименовать в более адекватное.

DNS

Перейдём к созданию DNS-сервера на основе имеющегося образа. Для этого вместо “default”-настройки добавим в имеющийся “Vagrantfile” следующее:

config.vm.define "dns" do |dns|  
  dns.vm.box = "ol7" 
  dns.vm.box_url = "https://yum.oracle.com/boxes/oraclelinux/ol75/ol75.box"  
  dns.vm.hostname = "ns.example.edu"   
  dns.vm.network "private_network", ip: "192.168.33.12",
    :netmask => "255.255.255.0" 
  dns.vm.provider "virtualbox" do |vb|   
    vb.name = "dns"   
    # vb.gui = true  
    vb.memory = "512"   
    vb.cpus = "1"      
    vb.customize ["modifyvm", :id, "--vram", "10"]
   
    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]   
  end 
end 

Инициализируем “dns”-сервер:

$ vagrant init dns
$ vagrant up dns
$ vagrant ssh dns

и попробуем к этому серверу подключиться через “ssh”-протокол.

Из настроек видно, что “dns”-сервер будет иметь имя “ns.example.edu”, адрес этого сервера будет “192.168.33.12” с маской “255.255.255.0”. Объём ОЗУ выбран 512 МБ, 1 процессор, 10 МБ видеопамяти. Также произведено переименование исходного имени гостевой системы в “virtualbox” после инициализации в “dns”.

Запуск сервера будет выглядить приблизительно следующим образом:

$ vagrant up dns
==> dns: Clearing any previously set forwarded ports... 
==> dns: Fixed port collision for 22 => 2222. Now on port 2200. 
==> dns: Clearing any previously set network interfaces... 
==> dns: Preparing network interfaces based on configuration... 
    dns: Adapter 1: nat
    dns: Adapter 2: hostonly 
==> dns: Forwarding ports...
    dns: 22 (guest) => 2200 (host) (adapter 1) 
==> dns: Running 'pre-boot' VM customizations... 
==> dns: Booting VM... 
==> dns: Waiting for machine to boot. This may take a few minutes...
    dns: SSH address: 127.0.0.1:2200
    dns: SSH username: vagrant
    dns: SSH auth method: private key
    dns: Warning: Connection reset. Retrying...
    dns: Warning: Remote connection disconnect. Retrying... 
==> dns: Machine booted and ready! 
==> dns: Checking for guest additions in VM... 
==> dns: Setting hostname... 
==> dns: Configuring and enabling network interfaces... 
==> dns: Mounting shared folders...
dns: /vagrant => /home/eugene
$

Установка пакетов и настройка DNS-сервера

В качестве DNS-сервера используется BIND. Для этого устанавливаются пакеты “bind, bind-utils”.

После установки пакетов начнём настраивать “dns”-сервер. Для этого надо будет создать прямую и реверсную зоны, а также информацию об этих зонах надо будет добавить в файл настроек “/etc/named.conf”. Файлы зон размещаются в каталоге “/var/named/” с именами “example.edu” и “33.168.192.in-addr.arpa”.

Файлы зон выглядят следующим образом:

[root@ns named]# cat /var/named/example.edu
$ORIGIN example.edu. 
$TTL 86400      ; 1 day
@       IN SOA  ns.example.edu. hostmaster.example.edu. (
                           2018092605 ; serial
                           10800      ; refresh (3 hours)
                           3600       ; retry (1 hour)
                           1209600    ; expire (2 weeks #RFC1912)
                           86400      ; minimum (1 day)
                           )
; DNS Servers
        IN      NS      ns.example.edu.
; MX Records
        IN      MX      10 mail.example.edu.
$ORIGIN example.edu.
www             A               192.168.33.10
mysql           A               192.168.33.11
ns              A               192.168.33.12
mail            A               192.168.33.13 

и

[root@ns named]# cat /var/named/33.168.192.in-addr.arpa
$TTL 86400      ; 1 day
@  IN SOA  ns.example.edu. hostmaster.example.edu. (
                        7          ; serial
                        28800      ; refresh (8 hours)
                        14400      ; retry (4 hours)
                        3600000    ; expire (5 weeks 6 days 16 hours)
                        86400      ; minimum (1 day)
                        )
@                       IN      NS      ns.example.edu.

10                      PTR     www.example.edu.
11                      PTR     mysql.example.edu.
12                      PTR     ns.example.edu.
13                      PTR     mail.example.edu. 

а в файл “/etc/named.conf” надо внести следующие обновления:

options {
        listen-on port 53 { any; };
        allow-query {any; };
...
zone "example.edu" IN {
        type master;
        file "example.edu";
        allow-update { none; };
        allow-query { any; };
        notify yes;
};

zone "33.168.192.in-addr.arpa" IN {
        type master;
        file "33.168.192.in-addr.arpa";
        allow-update { none; };
        allow-query { any; };
        notify yes;
};

В этом файле минимальные настройки, которые для нашего примера описывают только внутреннюю сеть “192.168.33.0/24”.

В каталоге “/var/named/” права для вновь созданных файлов поменяем на “named”:

# chown named:named /var/named/{example.edu,33.168.192.in-addr.arpa}
# systemctl start named

и проверим, что сервис запущен без ошибок:

# systemctl status named
*   named.service - Berkeley Internet Name Domain (DNS)
    Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disabled)
    Active: active (running) since Wed 2018-11-28 12:
55:23 EET; 52min ago
    Process: 1058 ExecStart=/usr/sbin/named -u named-c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS)
    Process: 1051 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi (code=exited, status=0/SUCCESS)
 Main PID: 1060 (named)
  CGroup: /system.slice/named.service
          |__1060 /usr/sbin/named -u named -c /etc/named.conf

Nov 28 12:55:23 ns.example.edu named[1060]: zone 1.0.0.127.in-addr.arpa/IN: ...0
Nov 28 12:55:23 ns.example.edu named[1060]: zone 33.168.192.in-addr.arpa/IN:...7
Nov 28 12:55:23 ns.example.edu named[1060]: zone localhost.localdomain/IN: l...0
Nov 28 12:55:23 ns.example.edu named[1060]: zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0...0
Nov 28 12:55:23 ns.example.edu named[1060]: zone localhost/IN: loaded serial 0
Nov 28 12:55:23 ns.example.edu named[1060]: all zones loaded
Nov 28 12:55:23 ns.example.edu systemd[1]: Started Berkeley Internet Name Do....
Nov 28 12:55:23 ns.example.edu named[1060]: running
Nov 28 12:55:28 ns.example.edu named[1060]: no longer listening on 192.168.3...3
Nov 28 12:55:32 ns.example.edu named[1060]: listening on IPv4 interface eth1...3
Hint: Some lines were ellipsized, use -l to show in full. 

Теперь можно проверить, что сервер отвечает правильно на запросы:

[root@ns named]# nslookup - 127.0.0.1
> ns.example.edu
Server:         127.0.0.1
Address:        127.0.0.1#53

Name:   ns.example.edu
Address: 192.168.33.12
> 192.168.33.12
Server:         127.0.0.1
Address:        127.0.0.1#53
12.33.168.192.in-addr.arpa      name = ns.example.edu.
>  
^D

После того, когда убедились, что сервер правильно отвечает на запросы, надо “named.service” добавить в автоматическую загрузку при старте гостевого узла:

# systemctl enable named

Для нормального ответа на все сетевые запросы необходимо, чтобы в файле “/etc/resolv.conf” была ссылка на локальный “dns”-сервер, а так как первый интерфейс всегда “nat”, получаемый параметры через “dhcp”, то в этом файле исходно запись “nameserver” указывает на основной сервер с “virtualbox”. Поэтому необходимо после запуска гостевой системы содержимое файла /etc/resolv.conf” изменить. Это делается изменением в файле “Vagrantfile”:

    config.vm.provision :shell do |shell|
      shell.path = "bin/fix_vagrant_resolv.conf.sh"
    end 

В домашнем каталоге хостового узла в директории “$HOME/bin” надо создать файл “fix_vagrant_resolv.conf.sh” с содержимым:

$ cat ~/bin/fix_vagrant_resolv.conf.sh
cat > /etc/resolv.conf <<EOF
#
# managed by vagrant
#
domain example.edu
search example.edu
nameserver 192.168.33.12
EOF 

Mail-сервер

Следующим сервером установим почтовый сервер. Для этого, также как и для “dns”-сервера, воспользуемся имеющейся заготовкой “vagrant” с той лишь разницей, что вместо “dns” укажем “mail”. Для этого в имеющийся файл “Vagrantfile”, также как и для “dns”-сервера, надо добавть информацию о “mail”-сервере:

  config.vm.define "mail" do |mail|
    mail.vm.box = "ol7"
    mail.vm.box_url = "https://yum.oracle.com/boxes/oraclelinux/ol75/ol75.box"
    mail.vm.hostname = "mail.example.edu"
    mail.vm.network "private_network", ip: "192.168.33.13", 
      :netmask => "255.255.255.0"
    mail.vm.provider "virtualbox" do |vb|
      vb.name = "mail"
      #  vb.gui = true
      vb.memory = "512"
      vb.cpus = "1"
      vb.customize ["modifyvm", :id, "--vram", "10"]
      vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    end
  end 

и произведём инициализацию:

$ vagrant init mail
$ vagrant up mail
$ vagrant ssh mail

Почтовый сервер будет состоять из “postfix” и “dovecot”. Авторизация пользователей будет осуществляться через базу данных “mysql”. Для этого добавим пакеты “postfix, dovecot, dovecot-mysql”, а также “mariadb, mariadb-libs”.

Письма будут храниться в каталоге “/var/vmail” и доступ к почтовым ящикам будет иметь виртуальный пользователь “vmail”:

# groupadd -g 2000 vmail
# mkdir -p /var/vmail
# useradd -g vmail -u 2000 -c "Virtuial Mail User" -d /var/vmail -s /sbin/nologin vmail
# chown -R vmail:vmail /var/vmail
# chmod -R 770 /var/vmail

Postfix

Так как почтовый сервер должен быть сопряжён с “mysql”-базой данных, то в настройках “postfix” надо будет добавить файлы с информацией для доступа к базе. В нашем случае пользователем для базы данных “postfix” будет “postfix” с паролем “db_admin”. База данных будет находиться на сервере “mysql.example.edu”. Для начала создадим каталог “/etc/postfix/mysql” и туда запишем ряд файлов:

  1. “relay_domains.cf”

    hosts = mysql.example.edu
    user = postfix
    password = db_admin
    dbname = postfix
    query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '1' 
  2. “virtual_alias_domain_maps.cf”

    hosts = mysql.example.edu
    user = postfix
    password = db_admin
    dbname = postfix
    query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1
  3. “virtual_alias_maps.cf”

    hosts = mysql.example.edu
    user = postfix
    password = db_admin
    dbname = postfix
    query = SELECT goto FROM alias WHERE address='%s' AND active = '1' 
  4. “virtual_mailbox_domains.cf”

    hosts = mysql.example.edu
    user = postfix
    password = db_admin
    dbname = postfix
    query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'
  5. “virtual_mailbox_maps.cf”

    hosts = mysql.example.edu
    user = postfix
    password = db_admin
    dbname = postfix
    query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'

В файле “/etc/postfix/main.cf” надо указать на вновь созданные файлы:

# mysql mappings
#
relay_domains = mysql:/etc/postfix/mysql/relay_domains.cf
virtual_alias_maps = mysql:/etc/postfix/mysql/virtual_alias_maps.cf,
mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual_mailbox_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf 

Кроме этого, надо сделать ещё некоторые изменения в этом файле:

soft_bounce = no
myhostname = mail.example.edu
mydomain = example.edu
myorigin = $myhostname
mydestination = localhost.$mydomain, localhost
inet_interfaces = all
mynetworks = 192.168.33.0/24, 127.0.0.0/8
alias_maps = hash:/etc/aliases

Чтобы происходила подмена исходного адреса от отправителя с
“host.domain” на “domain” необходимо в этом файле изменить “masquerade”. Для этого добавим:

# ADDRESS REWRITING
#
# The ADDRESS_REWRITING_README document gives information about
# address masquerading or other forms of address rewriting including
# username->Firstname.Lastname mapping.
masquerade_domains = example.edu 

Ограничения для получения или перенаправления писем почтовым сервером описываются следующим образом:

# restrictions
#
smtpd_discard_ehlo_keywords = etrn, silent-discard
smtpd_forbidden_commands = CONNECT GET POST
broken_sasl_auth_clients = yes
smtpd_delay_reject = yes
smtpd_helo_required = yes
disable_vrfy_command = yes
smtpd_helo_restrictions = permit_mynetworks,
                          permit_sasl_authenticated,
                          reject_non_fqdn_helo_hostname,
                          reject_invalid_helo_hostname

smtpd_data_restrictions = permit_mynetworks,
                          permit_sasl_authenticated,
                          reject_unauth_pipelining,
                          reject_multi_recipient_bounce

smtpd_sender_restrictions = permit_mynetworks,
                          permit_sasl_authenticated,
                          reject_non_fqdn_sender,
                          reject_unknown_sender_domain

smtpd_recipient_restrictions = reject_non_fqdn_recipient,
                          reject_unknown_recipient_domain,
                          reject_multi_recipient_bounce,
                          permit_mynetworks,
                          permit_sasl_authenticated,
                          reject_unauth_destination,
                          check_policy_service unix:/var/spool/postfix/postgrey/socket,
                          #reject_rbl_client zen.spamhaus.org,
                          #reject_rbl_client bl.spamcop.net,
                          #reject_rbl_client dnsbl.sorbs.net,
                          reject_invalid_hostname 

В целях безопасности передачи почты желательно, чтобы канал был шифрованный. Это можно достичь включив поддержку TLS. Также надо создать ограничения на размер принимаемых писем, поддержку SASL-аутентификации, указать общее с “dovecot” место хранения почты:

# tls
#
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
smtp_tls_session_cache_database = btree:$data_directory/smtp_tls_session_cache
smtpd_tls_key_file = /etc/postfix/certs/key.pem
smtpd_tls_cert_file = /etc/postfix/certs/cert.pem
tls_random_source = dev:/dev/urandom 

# limits
#
message_size_limit = 51200000
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 15
smtpd_error_sleep_time = 20
anvil_rate_time_unit = 60s
smtpd_client_connection_count_limit = 20
smtpd_client_connection_rate_limit = 30
smtpd_client_message_rate_limit = 30
smtpd_client_event_limit_exceptions = 127.0.0.0/8
smtpd_client_connection_limit_exceptions = 127.0.0.0/8 

# queue
#
maximal_queue_lifetime = 5d
bounce_queue_lifetime = 5d
# sasl
#
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

# virtual
#
virtual_mailbox_base = /var/vmail
virtual_minimum_uid = 2000
virtual_uid_maps = static:2000
virtual_gid_maps = static:2000
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1 

В данном блоке указано место хранения сертификата и ключа. Подробнее о создании самоподписанного сертификата будет рассказано ниже.

Включение кроме 25-го (smtp) по-умолчании порта дополнительного 587-го порта (submission) производится настройкой файла
/etc/postfix/master.cf”:

submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_wrappermode=no
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
  -o smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,defer_unauth_destination
  -o milter_macro_daemon_name=ORIGINATING
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions 

Для совместимости с “dovecot” в конце файла надо добвить следующее:


dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient} 

Dovecot

Dovecot - агент доставки почты, а также “imap” и “pop3” сервер. Необходимые пакеты должны быть уже предустановлены.

В файле “dovecot.conf” достаточно только указать на протоколы, с которыми будет работать “dovecot”:

protocols = imap pop3

Также надо отредактировать файлы находяциеся в каталоге “conf.d”. Надо отметить, что в настройке необходимо указать тот же номер “id”, который был выбран при настройке “postfix”:

  1. “10-mail.conf”

    mail_uid = 2000
    mail_gid = 2000 
    first_valid_uid = 2000
    mail_plugins = quota
    mail_location = maildir:/var/vmail/%d/%n
  2. “10-auth.conf”

    disable_plaintext_auth = no
    auth_realms = example.edu
    auth_default_realm = example.edu
    auth_mechanisms = plain login
    #!include auth-system.conf.ext
    !include auth-sql.conf.ext
  3. “10-master.conf”

    service imap-login {
      inet_listener imap {
        port = 143
      }
      inet_listener imaps {
        port = 993
        ssl = yes
      } 
    }
    
    service pop3-login {
      inet_listener pop3 {
        port = 110
      }
      inet_listener pop3s {
        port = 995
        ssl = yes
      }
    }
    
    service auth {
      unix_listener auth-userdb {
        mode = 0600
        user = vmail
        group = vmail
      } 
    
      unix_listener /var/spool/postfix/private/auth {
        mode = 0666
        user = postfix 
        group = postfix
      } 
    }
  4. “10-ssl.conf”

    ssl = yes
    ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
    ssl_key = </etc/pki/dovecot/private/dovecot.pem 
  5. “15-lda.conf”

    quota_full_tempfail = no
    lda_mailbox_autocreate = yes
    protocol lda {
      # Space separated list of plugins to load (default is global mail_plugins).
      mail_plugins = $mail_plugins autocreate
    } 
  6. “20-imap.conf”

  7. “90-plugin.conf”

    plugin {
      #setting_name = value
      autocreate = Trash
      autocreate2 = sent-mail
      autocreate3 = drafts
      autosubscribe = Trash
      autosubscribe2 = sent-mail
      autosubscribe3 = drafts
    } 
  8. “90-quota.conf” Здесь надо установить необходимые с вашими требованиями параметры:

    plugin {
      quota_rule = *:storage=1G
      quota_rule2 = Trash:storage=+100M
    }
    
    plugin {
      quota_warning = storage=90%% quota-warning 90 %u
      #quota_warning2 = storage=80%% quota-warning 80 %u
    }
    
    service quota-warning {
      executable = script /usr/local/bin/quota-warning.sh
      user = vmail
      unix_listener quota-warning {
        user = vmail
      }
    }
    
    plugin {
      #quota = dirsize:User quota
      quota = maildir:User quota
      #quota = dict:User quota::proxy::quota
      #quota = fs:User quota
    } 
  9. В соответствии с настройками файла “auth-sql.conf.ext” надо создать и разместить файл, указанный в параметре “args”:

    # cat /etc/dovecot/dovecot-sql.conf.ext
    driver = mysql
    connect = host=mysql.example.edu dbname=postfix user=postfix password=db_admin default_pass_scheme = MD5-CRYPT
    user_query = SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n'as mail, 2000 AS uid, 2000 AS gid, concat('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active = '1'
    password_query = SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 2000 as userdb_uid, 2000 as userdb_gid, oncat('*:bytes=', quota) AS userdb_quota_rule FROM mailbox WHERE username = '%u' AND active = '1' 

Spamassassin

Чтобы отсеивать нежелательную почту существует много способов. Один из них - использование “spamassassin”. Для этого надо установить пакет “spamassassin”, а также создать системного пользователя “spamd”:

# groupadd -r spamd
# useradd -r -g spamd -s /bin/false -d /var/log/spamassassin spamd
# mkdir -p /var/log/spamassassin
# chown -R spamd:spamd /var/log/spamassassin

и затем добавим в файл “/etc/postfix/master.cf” параметры запуска “spamassassin”:

#smtp      inet  n       -       n       -       -       smtpd
smtp      inet  n       -       n       -       -       smtpd -o content_filter=spamassassin 

а также в конце этого файла добавить следующее:

spamassassin unix -     n       n       -       -       pipe
  flags=R user=spamd argv=/bin/spamc -e /sbin/sendmail -oi -f ${sender} ${recipient} 

Также надо добавить автоматический запуск “spamassassin” при запуске сервера:

# systemctl start spamassassin
# systemctl enable spamassassin
# systemctl start postfix
# systemctl enable postfix
# systemctl start dovecot
# systemctl enable dovecot

Postgrey

Этот пакет позволяет отлавливать спам в случае, если письмо отправляется не с почтового сервера, так как почтовый сервер предусматривает повторную пересылку сообщения, если сразу письмо не было принято. Приём письма задерживается на некоторое время и отправителю направляется сообщение, чтобы письмо было вновь переправлено через некоторый период времени. Если же письмо отправляется не через почтовый сервер, то повтора никогда не будет и это исключит приём спама.

Установка заключается в загрузке пакета “postgrey”. Файлы настроек находятся в каталоге “/etc/postfix”. Добавим автозапуск пакета:

# systemctl start postgrey
# systemctl enable postgrey

Более подробную информацию можно найти на сайте “https://wiki.centos.org/HowTos/postgrey”.

SASL

В настройке “postfix” присутствует использование “sasl”-аутентификации. Для данного примера настройки серверов её использование не нужно, но всё же установка её на почтовый сервер будет рассмотрена. Необходимо только установить следующие пакеты: “cyrus-sasl” и “cyrus-sasl-lib”. А также сделать пакет загружаемым:

# systemctl start saslauthd
# systemctl enable saslauthd

Настройка этого сервиса нужна для автоматической аутентификации с удалёнными клиентскими программами, такими как “sendmail”, “postfix” и им подобными. Например, на удалённом компьютере почта отправляется через локальный почтовый сервер, который в свою очередь настроен на передачу всей своей почты на так называемый “smart-host”.

MySQL-сервер

Прежде, чем начинать проверять почтовый сервер, надо настроить сервер базы данных. В нашем случае выбрана база данных “mariadb”. В этой базе будут храниться аккаунты почтовых пользователей. Сначала необходимо создать в рамках “vagrant” новый сервер базы данных. Для этого в файл “Vagrantfile” надо добавить новую информацию о данном сервере. Назовём, к примеру, сервер “db”, а реальное имя будет “mysql.example.edu”:

  config.vm.define "db" do |db|
    db.vm.box = "ol7"
    db.vm.box_url = "https://yum.oracle.com/boxes/oraclelinux/ol75/ol75.box"
    db.vm.hostname = "mysql.example.edu"
    db.vm.network "private_network", ip: "192.168.33.11",
      :netmask => "255.255.255.0"
    db.vm.provider "virtualbox" do |vb|
      vb.name = "mysql"
    #   vb.gui = true
      vb.memory = "512"
      vb.cpus = "1"
      vb.customize ["modifyvm", :id, "--vram", "10"]
      vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    end
  end 

После этого создадим сервер базы данных:

$ vagrant init db
$ vagrant up db
$ vagrant ssh db

Инсталлируем следующие пакеты базы данных: “mariadb, mariadb-server”. Теперь можно начинать настраивать базу данных:

# mysql_install_db
# chown -R mysql:mysql /var/lib/mysql
# mysql_secure_installation

После начальной настройки “mariadb-server” можно начинать настраивать базу данных для “postfix”. Также как при настройках “postfix” и “dovecot”, пользователь будет “postfix” с паролем “db_admin”:

# mysql -u root -p
MariaDB [(none)]> CREATE USER postfix@localhost IDENTIFIED BY 'db_admin';
MariaDB [(none)]> CREATE USER postfix@mail.example.edu IDENTIFIED BY 'db_admi
n';
MariaDB [(none)]> CREATE USER postfix@www.example.edu IDENTIFIED BY 'db_admin
';
MariaDB [(none)]> CREATE DATABASE postfix;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON postfix.* TO postfix;
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> select user, host, password from mysql.user;
\q

Далее надо сделать, чтобы база данных загружалась при запуске сервера:

# systemctl start mariadb
# systemctl enable mariadb

WEB-сервер

Одним из способов добавления информации для почтового сервера (домен, аккаунты) может быть использование “postfixadmin”, установленный на “web”-сервере. Его можно взять с сайта “http://postfixadmin.sourceforge.net/”. В данном случае “web”-сервер будет создан на основе “Apache”. Надо установить следующие пакеты: “httpd, httpd-tools, php, php-mysql, php-common, php-imap, php-mbstring”. Создадим новый “web”-сервер. Для этого сначала надо добавить в текущий файл “Vagrantfile” настройку для “web”-сервера:

  config.vm.define "web" do |web|
    web.vm.box = "ol7"
    web.vm.box_url = "https://yum.oracle.com/boxes/oraclelinux/ol75/ol75.box"
    web.vm.hostname = "www.example.edu"
    web.vm.network "private_network", ip: "192.168.33.10",
      :netmask => "255.255.255.0"
    web.vm.network "forwarded_port", guest: 80, host:8080
    web.vm.provider "virtualbox" do |vb|
      vb.name = "webserver"
    #   vb.gui = true
      vb.memory = "512"
      vb.cpus = "1"
      vb.customize ["modifyvm", :id, "--vram", "10"]
      vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    end
  end 

Здесь следует обратить внимание на строчку
web.wm.network ”forwarded_port”, guest: 80, host: 8080”. Она означает, что будет создано “nat”-правило, позволяющее обращаться из хостовой машины к “web”-серверу через порт 8080 “http://localhost:8080”.

Создание гостевого “web”-сервера такое же, как и предыдущие:

$ vagrant init web
$ vagrant up web
$ vagrant ssh web

По-умолчании устанавливать “postfixadmin” будем в каталоге
/var/www/html”. После распаковки “postfixadmin” надо поменять права каталога “postfixadmin” на “apache”:

# chown -R apache:apache /var/www/html/postfixadmin

Кроме этого внутри “postfixadmin” надо создать каталог
template_c” и файл настроек “config.local.php” с правами “apache”.

Файл “config.local.php”:

<?php
$CONF['database_type'] = 'mysqli';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'db_admin';
$CONF['database_name'] = 'postfix';
$CONF['database_host'] = 'mysql.example.edu';
$CONF['smtp_server'] = 'mail.example.edu';
$CONF['smtp_port'] = '25';
$CONF['configured'] = true;
?>

Проверим загрузку “web”-сервера и сделаем запуск его автоматическим:

# systemctl start httpd
# systemctl enable httpd

Настройка систем и проверка работоспособности

После того, как гостевые узлы созданы, можно начать настраивать их. Чтобы не возникало проблем при настройке, на созданных узлах надо отключить систему контроля доступа “selinux”. Для этого на каждом из улов следует исправить файл настройки “selinux” “/etc/selinux/config”. В этом файле надо поменять параметр “SELINUX” с исходного “enforcing” на “permissive” или “disabled”, после чего каждый из этих узлов необходимо перезагрузить.

Postfixadmin

Начнём с настройки “pstfixadmin”. На “web”-сервере добавить файл
postfixadmin.conf” в каталог “/etc/httpd/conf.d”:

#
# Posfixadmin.conf
#
Alias /postfixadmin /var/www/html/postfixadmin/public
<Directory /var/www/html/postfixadmin/public>
    Options FollowSymLinks
    <IfModule !mod_access_compat.c>
        require all granted
    </IfModule>
    <IfModule mod_access_compat.c>
        order allow,deny
        allow from all
    </IfModule>
</Directory> 

и перезагрузить “Apache”:

# systemctl restart httpd

Далее с хостового узла с помощью браузера попробуем обратиться к “postfixadmin” по адресу “http://localhost:8080/postfixadmin/setup.php”:

Настройка postfixadmin

Во время настройки надо создать административный логин и пароль, которые будут нужны для доступа к “postfixadmin”. Далее можно попробовать зайти на сайт администратором по адресу “http://localhost:8080/postfixadmin/login.php” и добавить почтовый домен (в нашем случае это “example.edu”), а также почтовый аккаунт.

Mail

Прежде, чем начать проверять сервисы, необходимо создать и добавить сертификаты для “postfix” и “dovecot”. Для этого надо выполнить следующее:

# mkdir -p /etc/postfix/certs
# openssl req -new -x509 -days 3650 -nodes -out /etc/postfix/certs/cert.pem -keyout /etc/postfix/certs/key.pem
# cp /etc/postfix/certs/cert.pem /etc/pki/dovecot/certs/dovecot.pem
# cp /etc/postfix/certs/key.pem /etc/pki/dovecot/private/dovecot.pem
# chmod 600 /etc/postfix/certs/key.pem /etc/pki/dovecot/private/dovecot.pem

После создания домена и почтового аккаунта в “postfixadmin” надо проверить работоспособность “postfix” и “dovecot”. На почтовом сервере надо проверить, открыты ли почтовые порты:

# netstat -antp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
      PID/Program name
tcp        0      0 0.0.0.0:587             0.0.0.0:*               LISTEN
     1179/master
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN
     1054/dovecot
tcp        0      0 127.0.0.1:783           0.0.0.0:*               LISTEN
     1139/spamd.pid -d -
tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN
     1054/dovecot
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
     1028/sshd
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN
     1179/master
tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN
     1054/dovecot
tcp        0      0 0.0.0.0:995             0.0.0.0:*               LISTEN
     1054/dovecot         

Исходя из этого видно, что открыты порты 25 (smtp), 110 (pop3), 143 (imap), 587 (submission), 993 (imaps) и 995 (pop3s).

Postfix

Зайдя на одну из гостевых систем, попробуем подключиться к почтовому серверу и проверить аутентификацию, а также отправить письмо на созданный почтовый адрес. Сначала введём фиктивный почтовый адрес:

$ telnet mail.example.edu 25
Trying 192.168.33.13...
Connected to mail.example.edu.
Escape character is '^]'.
220 mail.example.edu ESMTP Postfix
EHLO localhost
250-mail.example.edu
250-PIPELINING
250-SIZE 51200000
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM: <vagrant@example.edu>
250 2.1.0 Ok
RCPT TO: <user@example.edu>
550 5.1.1 <user@example.edu>: Recipient address rejected: User unknown in 
virtual mailbox table
QUIT
221 2.0.0 Bye 

Теперь проверим аутентификацию. Для этого для созданного логина и пароля получим base64-кодировку, а затем осуществим проверку:

$ perl -MMIME::Base64 -e 'print encode_base64("mail.account");'
bWFpbC5hY2NvdW50
$ perl -MMIME::Base64 -e 'print encode_base64("password");'
cGFzc3dvcmQ=
$ telnet mail.example.edu 25
Trying 192.168.33.13...
Connected to mail.example.edu.
Escape character is '^]'.
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM: <vagrant@example.edu>
250 2.1.0 Ok
RCPT TO: <user@example.edu>
550 5.1.1 <user@example.edu>: Recipient address rejected: User unknown in 
virtual mailbox table
QUIT
221 2.0.0 Bye 

Теперь проверим аутентификацию. Для этого для созданного логина и пароля получим base64-кодировку, а затем осуществим проверку:

$ perl -MMIME::Base64 -e 'print encode_base64("mail.account");'
bWFpbC5hY2NvdW50
$ perl -MMIME::Base64 -e 'print encode_base64("password");'
cGFzc3dvcmQ=
$ telnet mail.example.edu 25
Trying 192.168.33.13...
Connected to mail.example.edu.
Escape character is '^]'.
220 mail.example.edu ESMTP Postfix
EHLO ns.example.edu
250-mail.example.edu
250-PIPELINING
250-SIZE 51200000
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN 
AUTH LOGIN
334 VXNlcm5hbWU6
bWFpbC5hY2NvdW50
334 UGFzc3dvcmQ6
cGFzc3dvcmQ=
235 2.7.0 Authentication successful
QUIT
221 2.0.0 Bye
Connection closed by foreign host. 

А теперь на созданный аккаунт попробуем отправить письмо:

# telnet mail.example.edu 25
Trying 192.168.33.13... Connected to mail.example.edu.
Escape character is '^]'.
220 mail.example.edu ESMTP Postfix
EHLO example.edu
250-mail.example.edu
250-PIPELINING
250-SIZE 51200000
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN 
MAIL FROM: <postmaster@example.edu>
250 2.1.0 Ok
RCPT TO: <mail.account@example.edu> 
250 2.1.5 Ok
DATA 354 End data with <CR><LF>.<CR><LF>
Subject: Test
Test
.
250 2.0.0 Ok: queued as 353E640CEF1A
QUIT
221 2.0.0 Bye 

Здесь видно, что письмо отправлено. Лог прохождения письма можно посмотреть на почтовом сервере в файле “/var/log/maillog”:

Dec  1 11:47:12 mail postfix/smtpd[2904]: connect from www.example.edu[192.168.33.10]
Dec  1 11:47:58 mail postfix/smtpd[2904]: 353E640CEF1A: client=www.example.edu[192.168.33.10]
Dec  1 11:48:13 mail postfix/cleanup[2913]: 353E640CEF1A: message-id=<>
Dec  1 11:48:13 mail postfix/qmgr[1177]: 353E640CEF1A: from=<postmaster@example.edu>, size=217, nrcpt=1 (queue active)
Dec  1 11:48:13 mail spamd[1725]: spamd: connection from localhost [::1]:42538 to port 783, fd 6
Dec  1 11:48:13 mail spamd[1725]: spamd: setuid to spamd succeeded
Dec  1 11:48:13 mail spamd[1725]: spamd: processing message (unknown) for spamd:993
Dec  1 11:48:13 mail spamd[1725]: spamd: clean message (4.6/5.0) for spamd:993 in 0.2 seconds, 249 bytes.
Dec  1 11:48:13 mail spamd[1725]: spamd: result: . 4 - ALL_TRUSTED,DNS_FROM_AHBL_RHSBL,MISSING_DATE,MISSING_FROM,MISSING_HEADERS,MISSING_MID,RP_MATCHES_RCVD scantime=0.2,size=249,user=spamd,uid=993,required_score=5.0,rhost=localhost,raddr=::1,rport=42538,mid=(unknown),autolearn=no autolearn_force=no
Dec  1 11:48:13 mail postfix/pipe[2915]: 353E640CEF1A: to=<mail.account@example.edu>, relay=spamassassin, delay=33, delays=33/0.01/0/0.3, dsn=2.0.0, status=sent (delivered via spamassassin service)
Dec  1 11:48:13 mail postfix/qmgr[1177]: 353E640CEF1A: removed Dec  1 11:48:13 mail postfix/pickup[1176]: D063840CEF1B: uid=993 from=<postmaster@example.edu>
Dec  1 11:48:13 mail postfix/cleanup[2913]: D063840CEF1B: message-id=<20181201094813.D063840CEF1B@mail.example.edu>
Dec  1 11:48:13 mail postfix/qmgr[1177]: D063840CEF1B: from=<postmaster@example.edu>, size=767, nrcpt=1 (queue active) Dec  1 11:48:13 mail spamd[1138]: prefork: child states: II
Dec  1 11:48:13 mail dovecot: lda(mail.account@example.edu): Warning: autocreate plugin is deprecated, use mailbox { auto } setting instead
Dec  1 11:48:14 mail dovecot: lda(mail.account@example.edu): msgid=<20181201094813.D063840CEF1B@mail.example.edu>: saved mail to INBOX
Dec  1 11:48:14 mail postfix/pipe[2919]: D063840CEF1B: to=<mail.account@example.edu>, relay=dovecot, delay=0.19, delays=0.03/0.04/0/0.12, dsn=2.0.0, status=sent (delivered via dovecot service)
Dec  1 11:48:14 mail postfix/qmgr[1177]: D063840CEF1B: removed
Dec  1 11:48:16 mail postfix/smtpd[2904]: disconnect from www.example.edu[192.16
8.33.10] 

В каталоге “/var/vmail” автоматически будет создан
example.edu/mail.account/{cur,new,tmp}”. Пришедшее письмо будет находиться в каталоге “new”.

TLS

Следующим этапом проверим работоспособность “TLS”. Для этого воспользуемся пакетом “openssl”:

{BASH}
# openssl s_client -connect mail.example.edu:25 -starttls smtp
CONNECTED(00000003) depth=0 C = LV, L = Riga, O = EXAMPLE, CN = mail.example.edu
verify error:num=18:self signed certificate
verify return:1
depth=0 C = LV, L = Riga, O = EXAMPLE, CN = mail.example.edu
verify return:1
---
Certificate chain
 0 s:/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu
   i:/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFZTCCA02gAwIBAgIJAIAwkJagGWjVMA0GCSqGSIb3DQEBCwUAMEkxCzAJBgNV
BAYTAkxWMQ0wCwYDVQQHDARSaWdhMRAwDgYDVQQKDAdIQUJJVEFMMRkwFwYDVQQD 
...
zBqnG97ZTzWSTMLJAat9suxGiA+uV/iX9lQRGwm7DasZoQfZ8D+5SDnUwRSdb3c7
ryHWvqXhhgZC+u5EvQTWckvJkwMcb4PGmDgq6KUFRxfdMuhD/TeXxwk=
-----END CERTIFICATE-----
subject=/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu
issuer=/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 2529 bytes and written 450 bytes
--- 
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 39133821CECCCD460E8DF0B95973C3801D0DC79C5C0557AF3E380A2D5AD19936
    Session-ID-ctx:
    Master-Key: 190146AB78885A58E68B78423580C74C6024D505122E1A56424CA0F68A87BA7E48453E0A9C2523D930801D794C28FE46
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket lifetime hint: 3600 (seconds)
    TLS session ticket:
    0000 - 19 3c c8 6c 4e 15 36 18-d4 ec fb 35 f8 13 2c 90   .<.lN.6....5..,.
    0010 - 0f 31 a3 6a 12 d1 95 d3-4f 3c 10 c4 7a 0a 65 a9   .1.j....O<..z.e.
    ...
    0080 - ee ca 91 19 0c 15 2f c8-08 0d 5b 1f 49 7e 3f 95   ....../...[.I~?.
    0090 - c9 da 28 b6 ad dc f5 70-4c 29 7f 65 f9 ac 29 1d   ..(....pL).e..).

    Start Time: 1543661127
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---
250 DSN
EHLO example.edu
250-mail.example.edu
250-PIPELINING
250-SIZE 51200000
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
QUIT
DONE 

Убедившись, что почтовый сервер “postfix” работает, можно начинать проверять “dovecot”. Также, как и для “postfix”, проверим аутентификацию через открытый порт, SSL и TLS, указав правильный пароль:

# doveadm auth test -x service=imap -x rip=192.168.33.11 mail.account
Password: 
passdb: mail.account auth succeeded
extra fields:
  user=mail.account@example.edu

  original_user=mail.account

# telnet mail.example.edu 143
Trying 192.168.33.13...
Connected to mail.example.edu.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE STARTTLS AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
AUTH login "mail.account" "password"
AUTH OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY SPECIAL-USE QUOTA] Logged in
^]
telnet> q
Connection closed. 

# openssl s_client -connect mail.example.edu:993
CONNECTED(00000003)
depth=0 C = LV, L = Riga, O = EXAMPLE, CN = mail.example.edu
verify error:num=18:self signed certificate
verify return:1
depth=0 C = LV, L = Riga, O = EXAMPLE, CN = mail.example.edu
verify return:1
---
Certificate chain
 0 s:/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu
   i:/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu
---
Server certificate 
-----BEGIN CERTIFICATE-----
MIIFZTCCA02gAwIBAgIJAIAwkJagGWjVMA0GCSqGSIb3DQEBCwUAMEkxCzAJBgNV
BAYTAkxWMQ0wCwYDVQQHDARSaWdhMRAwDgYDVQQKDAdIQUJJVEFMMRkwFwYDVQQD
...
zBqnG97ZTzWSTMLJAat9suxGiA+uV/iX9lQRGwm7DasZoQfZ8D+5SDnUwRSdb3c7
ryHWvqXhhgZC+u5EvQTWckvJkwMcb4PGmDgq6KUFRxfdMuhD/TeXxwk=
-----END CERTIFICATE-----
subject=/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu
issuer=/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu
---
subject=/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu
issuer=/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu
---
No client certificate CA names sent
Peer signing digest: SHA512 Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 2300 bytes and written 415 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 4096 bit Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated 
SSL-Session:     Protocol  : TLSv1.2     Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 7991ADCDA30A188BB9D0492B0A1C8B848FD42F6B611F25AC2F4D4A1DA861F926
    Session-ID-ctx:
    Master-Key: 4CC5ACE66ED245CAFC85D5B779972099D492D87A7420F3F457EC94F9C59C4B3BEFD3F4B7F6E76CD3B8819832D23128B3
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - b1 3d 8f 1a 77 d7 73 67-65 fa 76 33 21 99 93 06   .=..w.sge.v3!...
    0010 - b2 a3 02 5b 2d a6 f2 b7-2d 6d 41 a7 67 95 e8 9c   ...[-...-mA.g...
    ...
    0080 - 2a 59 97 58 c8 f4 97 10-a8 21 06 a5 a9 42 fc 89   *Y.X.....!...B..
    0090 - f5 23 40 d6 39 e6 0e c4-26 78 0a 3c 9c 88 fa b4   .#@.9...&x.<
....

    Start Time: 1543750660
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
QUIT
DONE

]# openssl s_client -connect mail.example.edu:143
-starttls imap CONNECTED(00000003)
depth=0 C = LV, L = Riga, O = EXAMPLE, CN = mail.example.edu
verify error:num=18:self signed certificate
verify return:1 depth=0 C = LV, L = Riga, O = EXAMPLE, CN = mail.example.edu
verify return:1
---
Certificate chain
 0 s:/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu
   i:/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFZTCCA02gAwIBAgIJAIAwkJagGWjVMA0GCSqGSIb3DQEBCwUAMEkxCzAJBgNV
BAYTAkxWMQ0wCwYDVQQHDARSaWdhMRAwDgYDVQQKDAdIQUJJVEFMMRkwFwYDVQQD 
...
zBqnG97ZTzWSTMLJAat9suxGiA+uV/iX9lQRGwm7DasZoQfZ8D+5SDnUwRSdb3c7
ryHWvqXhhgZC+u5EvQTWckvJkwMcb4PGmDgq6KUFRxfdMuhD/TeXxwk=
-----END CERTIFICATE-----
subject=/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu
issuer=/C=LV/L=Riga/O=EXAMPLE/CN=mail.example.edu
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 2631 bytes and written 441 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated SSL-Session: 
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 2DE4552D43C98BEA7B0F75012748CF32968ED038109951266F067D708AA19DCE
    Session-ID-ctx:
    Master-Key: 60DED5473F6380B071AE3FAB3A8A52ABD43B5B34CE821CA9BA603A4DA6D6572687060A5849B7511720A0AEA58C7B5E6B
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - f0 57 d5 71 95 2e 99 ad-7c ec 9e e5 4b 85 f3 7a   .W.q....|...K..z
    0010 - e1 3c 28 45 d3 ae ff 24-f3 44 85 38 8e d1 69 0f   .<(E...$.D.8..i.
 
    ...
    0080 - cf a6 a8 24 91 20 8f a8-02 d2 11 d5 12 09 9b a6   ...$. ..........
    0090 - 05 49 5d 29 ec 50 ad 1f-b3 a9 17 dd eb 06 35 81   .I]).P........5.

    Start Time: 1543751398
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---
. OK Pre-login capabilities listed, post-login capabilities have more.
AUTH login "mail.account" "password"
* CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY SPECIAL-USE QUOTA
AUTH OK Logged in
QUIT
DONE 

Dovecot

Проверить работу “dovecot” можно с помощью команды “telnet”:

$ telnet localhost 143
Trying ::1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE STARTTLS AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
? LOGIN mail.account password
? OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY SPECIAL-USE QUOTA] Logged in
? LIST "" "*"
* LIST (\HasNoChildren \Sent) "." Sent
* LIST (\HasNoChildren \Drafts) "." Drafts
* LIST (\HasNoChildren) "." "Junk E-mail"
* LIST (\HasNoChildren) "." Archive
* LIST (\HasNoChildren) "." drafts
* LIST (\HasNoChildren) "." sent-mail
* LIST (\HasNoChildren \Trash) "." Trash
* LIST (\HasNoChildren) "." INBOX
? OK List completed (0.003 + 0.000 + 0.002 secs).
? Select INBOX
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 2 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1543354787] UIDs valid
* OK [UIDNEXT 14] Predicted next UID
* OK [HIGHESTMODSEQ 22] Highest
? OK [READ-WRITE] Select completed (0.014 + 0.000 + 0.013 secs).
? FETCH 1 All
* 1 FETCH (FLAGS (\Seen) INTERNALDATE "27-Nov-2018 23:59:14 +0200" RFC822.SIZE 479 ENVELOPE (NIL "Welcome" ((NIL NIL "admin" "example.edu")) ((NIL NIL "admin" "example.edu")) ((NIL NIL "admin" "example.edu")) ((NIL NIL "mail.account" "example.edu")) NIL NIL NIL NIL))
? OK Fetch completed (0.003 + 0.000 + 0.002 secs).
? FETCH 1 Body
* 1 FETCH (BODY ("text" "plain" ("charset" "utf-8") NIL NIL "8bit" 37 3))
? OK Fetch completed (0.001 + 0.000 secs).
? LOGOUT
* BYE Logging out
? OK Logout completed (0.001 + 0.000 secs).
Connection closed by foreign host.