Инструкция по установке EAI почтового сервера под ОС CentOS 7

Материал из вики.поддерживаю.рф
Перейти к навигации Перейти к поиску

Инструкция по установке EAI почтового сервера под ОС CentOS 7

Почтовый сервер с поддержкой EAI

С помощью данной инструкции вы сможете установить почтовый сервер с поддержкой использования интернационализированных адресов электронной почты (EAI) на базе ПО с открытым исходным кодом. Почтовый сервер можно развивать далее с помощью другого ПО.

Необходимое ПО

  1. Centos 7.4
  2. Postfix 3.2.3
  3. Dovecot 2.2.10
  4. MariaDB 10.3.11
  5. Squirrelmail 5.5.56

Примечания:

  • в данной инструкции не разъясняется, как установить Centos 7.4
  • версия Postfix 3.x.x и выше поддерживает EAI
  • в реальных условиях необходимо также настроить сервер DNS
  • putty и winscp используются для подключения к серверу

Установка EAI почтового сервера

Задайте имя хоста

  1. Обновите пакеты почтового сервера до последней версии

# yum -y update

  1. Задайте имя хоста (например, mail.test.ru) с помощью команды

# hostnamectl set-hostname 'mail.test.ru'

  1. Добавьте имя хоста в файл hosts

# vi /etc/hosts

Пример файла hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ''mail.test.ru''

1 localhost localhost.localdomain localhost6 localhost6.localdomain6 ''mail.test.ru''

*В зависимости от среды установки CentOS вам может понадобиться установить дополнительные сервисы (например, может быть недоступна команда «vi»)

  1. Установите wget для скачивания дополнительного ПО

# yum -y install wget

  1. Установите telnet для тестирования работы почтового сервера

# yum -y install telnet

Настройте файрвол

  1. Проверьте, что у почтового сервиса имеется статус «firewalld service»

Статус должен быть активным (работающим)

# systemctl status firewalld

Пример

Active: active (running) since Mon 2019-11-18 14:12:03 +07; 1h 13min ago

  1. Проверьте открытые зону файрвола и сетевой интерфейс

# firewall-cmd --get-active-zones

Пример

public

interfaces: ens32

  1. Проверьте сервисы файрвола в публичной зоне

# firewall-cmd --zone=public --list-services

Пример

cockpit dhcpv6-client ssh

  1. Откройте необходимые сервисы на файрволе в публичной зоне почтового сервера

# firewall-cmd --permanent --zone=public --add-service=http

# firewall-cmd --permanent --zone=public --add-service=https

# firewall-cmd --permanent --zone=public --add-service=mysql

# firewall-cmd --permanent --zone=public --add-service=smtp

# firewall-cmd --permanent --zone=public --add-service=smtps

# firewall-cmd --permanent --zone=public --add-service=imap

# firewall-cmd --permanent --zone=public --add-service=imaps

# firewall-cmd --reload

  1. Еще раз проверьте список сервисов на файрволе в публичной зоне, вы увидите только открытые сервисы *Дополнительно: задайте конфигурацию сервисов файрвола для почтового сервера (https://spalinux.com/2015/06/centos-7-basic-configure-firewallby-firewall-cmd)

# firewall-cmd --zone=public --list-services

Пример

cockpit dhcpv6-client http https imap imaps mysql smtp smtps ssh

  1. В этом примере мы открыли SELinux для удобства настройки

# vi /etc/selinux/config

Пример

This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

# enforcing - SELinux security policy is enforced.

# permissive - SELinux prints warnings instead of enforcing.

# disabled - No SELinux policy is loaded.

SELINUX=disabled

# SELINUXTYPE= can take one of these two values:

# targeted - Targeted processes are protected,

# mls - Multi Level Security protection.

SELINUXTYPE=targeted

  1. Перезапустите сервер

# reboot

# sestatus

Пример

disabled

Создайте SSL-сертификат

Пошаговая инструкция для создания SSL-ключа, чтоб использовать с postfix и dovecot

  1. Создайте индивидуальный ключ

# cd /etc/pki/tls/certs

# make eai.key

Пример

umask 77 ; \

/usr/bin/openssl genrsa -aes128 2048 > eai.key

Generating RSA private key, 2048 bit long modulus

...

...

e is 65537 (0x10001)

Enter pass phrase: #set passphrase

Verifying - Enter pass phrase: #confirm

  1. Удалите Passphase из созданного ключа

# openssl rsa -in eai.key -out eai.key

Пример

Enter pass phrase for eai.key: #input passphrase

writing RSA key

  1. Создайте csr
  2. # make eai.csr

Пример

umask 77 ; \

/usr/bin/openssl req -utf8 -new -key eai.key -out eai.csr

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [XX]:RU #country

State or Province Name (full name) []:Moscow #state

Locality Name (eg, city) [Default City]:Moscow #city

Organization Name (eg, company) [Default Company Ltd]:EAI #company

Organizational Unit Name (eg, section) []:IT #department

Common Name (eg, your name or your server's hostname) []:mail.test.ru #server's FQDN

Email Address []:xxx@test.ru #email address

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []: #Enter

An optional company name []: #Enter

4. Сгенерируйте ключ

# openssl x509 -in eai.csr -out eai.crt -req -signkey eai.key -days 3650

Пример

Signature ok

subject=/C=JP/ST=Hiroshima/L=Hiroshima/O=GTS/OU=Server World/CN=www.srv.world/emailAddress=xxx@test.ru

Getting Private key

Установка mariadb, Postfix и Dovecot

  1. Установите mariadb , Postfix , Dovecot и необходимые пакеты

# yum --enablerepo=centosplus install postfix

# yum install dovecot mariadb-server dovecot-mysql

  1. Обновите postfix с версии 2.x.x до версии 3.x.x

На CentOS 7 версия postfix 2.x.x стоит по умолчанию. Необходимо ее удалить и обновить до версии 3.х.х. или выше.

# yum -y remove postfix

# yum -y remove ssmtp

# yum -y remove sendmail

Создайте файл репозитория gf.repo для установки postfix версии 3.х.х или выше

# vi /etc/yum.repos.d/gf.repo

Пример

[gf]

name=Ghettoforge packages that won't overwrite core distro packages.

mirrorlist=http://mirrorlist.ghettoforge.org/el/7/gf/$basearch/mirrorlist

enabled=1

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-gf.el7

failovermethod=priority

[gf-plus]

name=Ghettoforge packages that will overwrite core distro packages.

mirrorlist=http://mirrorlist.ghettoforge.org/el/7/plus/$basearch/mirrorlist

# Please read http://ghettoforge.org/index.php/Usage *before* enabling this repository!

enabled=1

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-gf.el7

failovermethod=priority

Загрузите ключ для использования с репозиторием, вставьте в строку: /etc/pki/rpm-gpg/

# cd /etc/pki/rpm-gpg/

# wget http://mirror.ghettoforge.org/distributions/gf/RPM-GPG-KEY-gf.el7

Установите postfix версию 3.х.х

# yum -y install postfix3 postfix-mysql

Проверьте postfix версию 3.х.х

# postconf -d | grep mail_version

mail_version = 3.5.7

  1. Настройте mariadb, postfix, dovecot для автоматического запуска

# systemctl start mariadb

# systemctl enable mariadb

# systemctl start postfix

# systemctl enable postfix

# systemctl start dovecot

# systemctl enable dovecot

  1. Проверьте статус mariadb, postfix, dovecot

# systemctl status mariadb

# systemctl status postfix

# systemctl status dovecot

Настройка MariaDB

  1. Установите UTF8 в mysql для работы с Unicode, добавив следующую команду к

/etc/my.cnf.d/maridb-server.cnf для [mysqld]

# vi /etc/my.cnf

Пример

[mysqld]

character-set-server = utf8

collation-server = utf8_general_ci

skip-character-set-client-handshake

bind-address=127.0.0.1

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

# Settings user and group are ignored when systemd is used.

# If you need to run mysqld under a different user or group,

# customize your systemd unit file for mariadb according to the

# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]

log-error=/var/log/mariadb/mariadb.log

pid-file=/var/run/mariadb/mariadb.pid

#

# include all files from the config directory

#

!includedir /etc/my.cnf.d

  1. Перезапустите MariaDB

# systemctl restart mariadb

  1. Настройте безопасный доступ к mysql, установив пароль для пользователя с правами root (* задайте только новый пароль, остальное пропустите, нажав клавишу enter)

# mysql_secure_installation

  1. Зайдите в аккаунт mysql с новым паролем

# mysql -u root -p

  1. Создайте новую базу данных (eaimail) для хранения записей об использовании почтового сервера

# CREATE DATABASE 'eaimail';

# USE 'eaimail';

  1. Создайте пользователя с правами доступа к базе eaimail

# GRANT SELECT, INSERT, UPDATE, DELETE ON eaimail.* TO 'yourdbuser'@'localhost' IDENTIFIED BY 'yourdbpassword';

# GRANT SELECT, INSERT, UPDATE, DELETE ON eaimail.* TO 'yourdbuser'@'localhost.localdomain' IDENTIFIED BY 'yourdbpassword';

# FLUSH PRIVILEGES;

  1. Проверьте созданного пользователя

# SHOW GRANTS FOR 'yourdbuser'@'localhost';

  1. Создайте таблицы для domainsforwardings (для пересылки почты с интернационализированных адресов на адреса в кодировке ASCII) и users для создания почтовых ящиков

# CREATE TABLE domains (domain varchar(50) NOT NULL, PRIMARY KEY (domain) );

# CREATE TABLE forwardings (source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );

# CREATE TABLE users (email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );

# quit

  1. Перезапустите MariaDB

# systemctl restart mariadb

  1. Настройте domain и users в базе данных интернационализированных адресов

Зайдите в mariadb и выберите базу данных eaimail, введите домен ASCII и IDN домен, введите ASCII почту и почту EAI с паролем

# mysql -u root -p

# USE eaimail;

# INSERT INTO domains (domain) VALUES ('test.ru');

# INSERT INTO domains (domain) VALUES ('тест.рф');

# INSERT INTO users (email, password) VALUES ('test@test.ru', ENCRYPT('userpassword'));

# INSERT INTO users (email, password) VALUES ('[тест@тест.рф]', ENCRYPT('userpassword'));

Настройте правило пересылки для всех писем с интернационализированного адреса на адрес ASCII

# INSERT INTO forwardings (source,destination) VALUES ('[тест@тест.рф]','test@test.ru');

# quit

Настройка Postfix

Создайте связь между Postfix и MariaDB

  1. Создайте файл-скрипт, чтобы получить значение domain из базы данных

# vi /etc/postfix/mysql-virtual_domains.cf

Пример

user = yourdbuser

password = yourdbpassword

dbname = eaimail

query = SELECT domain AS virtual FROM domains WHERE domain='%s'

hosts = 127.0.0.1

  1. Создайте файл mysql-virtual_forwardings.cf для получения пересланной почты из базы данных

# vi /etc/postfix/mysql-virtual_forwardings.cf

Пример

user = yourdbuser

password = yourdbpassword

dbname = eaimail

query = SELECT destination FROM forwardings WHERE source='%s'

hosts = 127.0.0.1

  1. Создайте файл-скрипт для создания почтового ящика и использования его для логина

# vi /etc/postfix/mysql-virtual_mailboxes.cf

Пример

user = yourdbuser

password = yourdbpassword

dbname = eaimail

query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'

hosts = 127.0.0.1

  1. Создайте файл-скрипт для пересылки всей почты на другой сервер SMTP

# vi /etc/postfix/mysql-virtual_email2email.cf

Пример

user = yourdbuser

password = yourdbpassword

dbname = eaimail

query = SELECT email FROM users WHERE email='%s'

hosts = 127.0.0.1

  1. Установите необходимые права созданным скриптам

# chmod o= /etc/postfix/mysql-virtual_*.cf

# chgrp postfix /etc/postfix/mysql-virtual_*.cf

  1. Создайте пользователя и группу для почтового ящика

# groupadd -g 5000 vmail

# useradd -g vmail -u 5000 vmail -d /home/vmail -m

  1. Измените /etc/postfix/main.cf

# vi /etc/postfix/main.cf

Пример

inet_interfaces = all

inet_protocols = ipv4

mydestination = localhost, localhost.localdomain

alias_database = hash:/etc/aliases

sendmail_path = /usr/sbin/sendmail.postfix

newaliases_path = /usr/bin/newaliases.postfix

mailq_path = /usr/bin/mailq.postfix

meta_directory = /etc/postfix

shlib_directory = no

myhostname = mail.test.ru

mydomain = test.ru

myorigin = $mydomain

readme_directory = no

mynetworks = 127.0.0.1

message_size_limit = 30720000

smtpd_sasl_auth_enable = yes

smtpd_sasl_type = dovecot

smtpd_sasl_path = private/auth

smtpd_sasl_authenticated_header = yes

broken_sasl_auth_clients = yes

smtpd_use_tls = yes

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

smtpd_tls_cert_file = /etc/pki/tls/certs/eai.crt

smtpd_tls_key_file = /etc/pki/tls/certs/eai.key

smtpd_tls_security_level = may

smtpd_tls_auth_only = yes

smtpd_tls_loglevel = 1

alias_maps = hash:/etc/aliases

virtual_mailbox_base = /home/vmail

virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf

virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf

virtual_uid_maps = static:5000

virtual_gid_maps = static:5000

virtual_alias_domains = тест.рф

virtual_transport = dovecot

virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf

smtputf8_enable = yes

proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks

  1. Измените /etc/postfix/master.cf , добавив команду в конце файла

# vi /etc/postfix/master.cf

Пример

dovecot unix - n n - - pipe

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

  1. Измените /etc/postfix/master.cf , чтобы разрешить выполнение команд ниже (у остальных в начале должен стоять #)

Пример

smtps inet n - - - - smtpd

-o syslog_name=postfix/smtps

-o smtpd_tls_wrappermode=yes

-o smtpd_sasl_auth_enable=yes

-o smtpd_client_restrictions=permit_sasl_authenticated,reject

-o smtpd_relay_restrictions=permit_sasl_authenticated,reject

-o milter_macro_daemon_name=ORIGINATING

  1. Перезапустите postfix

Пример

# systemctl restart postfix

  1. Назначьте алиасы почтовым адресам, изменив файл aliases 

Добавьте 2 строки

# vi /etc/aliases

postmaster: root

root: postmaster@test.ru

  1. Обновите алиасы и перезапустите postfix

# newaliases

# systemctl restart postfix

Настройка Dovecot

  1. Сделайте резервную копию существующей конфигурации

# mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf-backup

  1. Настройте конфигурацию dovecot

# vi /etc/dovecot/dovecot.conf

Пример

protocols = imap pop3 lmtp

log_timestamp = "%Y-%m-%d %H:%M:%S "

mail_location = maildir:/home/vmail/%d/%n/Maildir

ssl_cert = </etc/pki/tls/certs/eai.crt

ssl_key = </etc/pki/tls/certs/eai.key

ssl_dh_parameters_length = 2048

ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL

namespace {

type = private

separator = .

prefix = INBOX.

inbox = yes

}

service auth {

unix_listener auth-master {

mode = 0600

user = vmail

}

unix_listener /var/spool/postfix/private/auth {

mode = 0666

user = postfix

group = postfix

}

user = root

}

auth_mechanisms = plain login

service auth-worker {

user = root

}

protocol lda {

log_path = /home/vmail/dovecot-deliver.log

auth_socket_path = /var/run/dovecot/auth-master

postmaster_address = postmaster@test.ru

}

protocol pop3 {

pop3_uidl_format = %08Xu%08Xv

pop3_client_workarounds = outlook-no-nuls oe-ns-eoh

}

passdb {

driver = sql

args = /etc/dovecot/dovecot-sql.conf.ext

}

userdb {

driver = static

args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes

}

  1. Создайте скрипт, чтобы dovecot мог работать с SQL

# vi /etc/dovecot/dovecot-sql.conf.ext

Пример

driver = mysql

connect = host=127.0.0.1 dbname=eaimail user=yourdbuser password=yourdbpassword

default_pass_scheme = CRYPT

password_query = SELECT email as user, password FROM users WHERE email='%u';

  1. Установите необходимые права группе dovecot

# chgrp dovecot /etc/dovecot/dovecot-sql.conf.ext

# chmod o= /etc/dovecot/dovecot-sql.conf.ext

  1. Перезапустите dovecot

# systemctl restart dovecot

  1. Проверьте журнал почтового сервера /var/log/maillog

# tail /var/log/maillog

Пример

Mar 18 17:10:26 localhost postfix/postfix-script[3274]: starting the Postfix mail system

Mar 18 17:10:26 localhost postfix/master[3276]: daemon started -- version 2.10.1, configuration /etc/postfix

Mar 18 17:12:28 localhost dovecot: master: Dovecot v2.2.10 starting up for imap, pop3 (core dumps disabled)

Протестируйте почтовый сервер EAI

  1. Протестируйте pop3

# telnet localhost pop3

Пример

Trying 127.0.0.1...

Connected to localhost.localdomain.

Escape character is '^]'.

+OK Dovecot ready.

  1. Протестируйте SMTP

# telnet localhost 25

# ehlo localhost

Пример

250-mail.test.ru

250-PIPELINING

250-SIZE 30720000

250-VRFY

250-ETRN

250-STARTTLS

250-AUTH PLAIN

250-AUTH=PLAIN

250-ENHANCEDSTATUSCODES

250-8BITMIME

250-DSN

250 SMTPUTF8

  1. Протестируйте отправку и получение почты при помощи mailx

Проверьте журнал /var/log/maillog Примерный результат:

# yum -y install mailx

# mailx thai@test.ru (input subject then press enter follow by content and use Ctrl+D for sending out)

# tail /var/log/maillog

Пример

Nov 13 15:19:07 mail postfix/pickup[31954]: E9AB020199E5: uid=0 from=<root>

Nov 13 15:19:07 mail postfix/cleanup[1938]: E9AB020199E5: message-id=<20171113081907.E9AB020199E5@mail.test.ru>

Nov 13 15:19:07 mail postfix/qmgr[21141]: E9AB020199E5: from=<root@test.ru>, size=434, nrcpt=1 (queue active)

Nov 13 15:19:08 mail postfix/pipe[1946]: E9AB020199E5: to=<tanagan@test.ru>, relay=dovecot, delay=0.09, delays=0.04/0.01/0/0.03, dsn=2.0.0, status=sent (delivered via dovecot service)

Nov 13 15:19:08 mail postfix/qmgr[21141]: E9AB020199E5: removed

Если вы нашли ошибку в журнале: «unsupported dictionary type: MySQL», причина заключается в использовании postfix 3.2.4. В этой версии еще есть баги. Проверьте /etc/postfix/dynamicmaps.cf.d/

# cd /etc/postfix/dynamicmaps.cf.d/

# vi mysql.cf

mysql /usr/lib/postfix/postfix-mysql.so dict_mysql_open

  1. Проверьте журнал, чтобы увидеть результат отправки в Dovecot /home/vmail/dovecot-deliver.log, Примерный результат:

# tail /home/vmail/dovecot-deliver.log

2017-11-13 15:19:08 lda(tanagan@test.ru): Info: msgid=<20171113081907.E9AB020199E5@mail.test.ru>: saved mail to INBOX

  1. Проверьте почтовый ящик. При отправке и получении писем вы увидите следующий результат:

# cd /home/vmail/test.ru/thai/Maildir

# find

Пример

.

./dovecot-uidlist

./cur

./new

./new/1285609582.P6115Q0M368794.li172-137

./dovecot.index

./dovecot.index.log

./tmp

  1. Проверьте почтовый ящик с помощью почтового клиента mutt, чтобы увидеть письма в почтовом ящике

# yum -y install mutt

# mutt -f .

  1. Проверьте отправку писем с интернационализированного адресов
  • В конце отправляемого сообщения поставьте «.»
  • Нажмите Ctrl+] , чтобы выйти

# telnet localhost 25

# EHLO localhost

# MAIL FROM: тест@тест.рф SMTPUTF8

# RCPT TO: тест1@тест1.рф

# data

# Subject: eai test

#

# .

Установите SquirrelMail

  1. Установите squirrelmail

# yum -y install epel-release

# yum install squirrelmail

  1. Если у вас не установлен Apache, установите Apache

# yum -y install httpd

# systemctl enable httpd

# systemctl start httpd

# systemctl status httpd

  1. Скопируйте/перенесите squirrelmail в /var/www/html/

# cd /var/www/html/

(скопируйте squirrelmail в /var/www/html/ например используя для копирования winscp)

  1. Создайте каталог данных для squirrelmail

# cd /var/lib/squirrelmail/

# mkdir data

# chmod ugo+rwx data/

  1. Протестируйте логин для доступа через веб-браузеры. Введите IP сервера, затем /squirrelmail

# Test sending and receiving mail