Инструкция по установке EAI почтового сервера под ОС CentOS 7
- Инструкция по установке EAI почтового сервера под ОС CentOS 7**
Почтовый сервер с поддержкой EAI
С помощью данной инструкции вы сможете установить почтовый сервер с поддержкой использования интернационализированных адресов электронной почты (EAI) на базе ПО с открытым исходным кодом. Почтовый сервер можно развивать далее с помощью другого ПО.
Необходимое ПО
- Centos 7.4 - Postfix 3.2.3 - Dovecot 2.2.10 - MariaDB 10.3.11 - Squirrelmail 5.5.56
- Примечания:**
* в данной инструкции не разъясняется, как установить Centos 7.4 * версия Postfix 3.x.x и выше поддерживает EAI * в реальных условиях необходимо также настроить сервер DNS * putty и winscp используются для подключения к серверу
Установка EAI почтового сервера
Задайте имя хоста
- Обновите пакеты почтового сервера до последней версии
> **# yum -y update**
- Задайте имя хоста (например, mail.test.ru) с помощью команды
> **# hostnamectl set-hostname [[1]]**
- Добавьте имя хоста в файл hosts
> **# vi /etc/hosts**
//Пример файла hosts//
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 [[2]]
- 1 localhost localhost.localdomain localhost6 localhost6.localdomain6 [[3]]
//*В зависимости от среды установки CentOS вам может понадобиться установить дополнительные сервисы (например, может быть недоступна команда «vi»)//
- Установите wget для скачивания дополнительного ПО
> **# yum -y install wget**
- Установите //telnet// для тестирования работы почтового сервера
> **# yum -y install telnet**
Настройте файрвол
- Проверьте, что у почтового сервиса имеется статус «firewalld service»
> Статус должен быть активным (работающим)
- systemctl status firewalld**
//Пример//
- Active: active (running) since Mon 2019-11-18 14:12:03 +07; 1h 13min ago**
- Проверьте открытые зону файрвола и сетевой интерфейс
> **# firewall-cmd --get-active-zones**
//Пример//
- public**
- interfaces: ens32**
- Проверьте сервисы файрвола в публичной зоне
> **# firewall-cmd --zone=public --list-services**
//Пример//
- cockpit dhcpv6-client ssh**
- Откройте необходимые сервисы на файрволе в публичной зоне почтового сервера
> **# 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**
- Еще раз проверьте список сервисов на файрволе в публичной зоне, вы увидите только открытые сервисы //*Дополнительно: задайте конфигурацию сервисов файрвола для почтового сервера ([[4]]//
> **# firewall-cmd --zone=public --list-services**
//Пример//
- cockpit dhcpv6-client http https imap imaps mysql smtp smtps ssh**
- В этом примере мы открыли 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**
- Перезапустите сервер
- reboot**
- sestatus**
//Пример//
- disabled**
Создайте SSL-сертификат
Пошаговая инструкция для создания SSL-ключа, чтоб использовать с postfix и dovecot
- Создайте индивидуальный ключ
> **# cd /etc/pki/tls/certs** > > **# make** [[5]]
//Пример//
- 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:** [passphrase//]
- Verifying - Enter pass phrase:** [[6]]
- Удалите //Passphase// из созданного ключа
> **# openssl rsa -in** [[7]] **-out** [[8]]
//Пример//
- Enter pass phrase for eai.key:** [passphrase//]
- writing RSA key**
- Создайте csr - **# 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 [[9]]
- Please enter the following 'extra' attributes**
- to be sent with your certificate request**
- A challenge password []:** [[20]]
- An optional company name []:** [[21]]
4. Сгенерируйте ключ
//Пример//
- 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
- Установите mariadb , Postfix , Dovecot и необходимые пакеты
> **# yum --enablerepo=centosplus install postfix** > > **# yum install dovecot mariadb-server dovecot-mysql**
- Обновите 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=[[25]]**
- 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=[[26]]**
- Please read [[27]] *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 [[28]]**
Установите postfix версию 3.х.х
- yum -y install postfix3 postfix-mysql**
Проверьте postfix версию 3.х.х
- postconf -d | grep mail_version**
- mail_version = 3.5.7**
- Настройте mariadb, postfix, dovecot для автоматического запуска
> **# systemctl start mariadb** > > **# systemctl enable mariadb** > > **# systemctl start postfix** > > **# systemctl enable postfix** > > **# systemctl start dovecot** > > **# systemctl enable dovecot**
- Проверьте статус mariadb, postfix, dovecot
> **# systemctl status mariadb** > > **# systemctl status postfix** > > **# systemctl status dovecot**
Настройка MariaDB
- Установите 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 [[29]]**
- [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**
- Перезапустите MariaDB
> **# systemctl restart mariadb**
- Настройте безопасный доступ к mysql, установив пароль для пользователя с правами root (* задайте только новый пароль, остальное пропустите, нажав клавишу //enter//)
> **# mysql_secure_installation**
- Зайдите в аккаунт mysql с новым паролем
> **# mysql -u root -p**
- Создайте новую базу данных (eaimail) для хранения записей об использовании почтового сервера
> **# CREATE DATABASE [[30]];** > > **# USE [[31]];**
- Создайте пользователя с правами доступа к базе eaimail
> **# GRANT SELECT, INSERT, UPDATE, DELETE ON** [[32]]**.* TO '**//yourdbuser//'**@'localhost' IDENTIFIED BY '**//yourdbpassword//'**;** > > **# GRANT SELECT, INSERT, UPDATE, DELETE ON** [[33]]**.* TO '**//yourdbuser//'**@'localhost.localdomain' IDENTIFIED BY '**//yourdbpassword//'**;** > > **# FLUSH PRIVILEGES;**
- Проверьте созданного пользователя
> **# SHOW GRANTS FOR '**//yourdbuser//'**@'localhost';**
- Создайте таблицы для //domains//, //forwardings// (для пересылки почты с интернационализированных адресов на адреса в кодировке 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**
- Перезапустите MariaDB
> **# systemctl restart mariadb**
- Настройте //domain// и //users// в базе данных интернационализированных адресов
> Зайдите в mariadb и выберите базу данных //eaimail//, введите домен ASCII и IDN домен, введите ASCII почту и почту EAI с паролем
- mysql -u root -p**
- USE** [[34]]**;**
- INSERT INTO domains (domain) VALUES ('**test.ru'**);**
- INSERT INTO domains (domain) VALUES ('**тест.рф'**);**
- INSERT INTO users (email, password) VALUES ('**[[35]]'**, ENCRYPT('**//userpassword//'**));**
- INSERT INTO users (email, password) VALUES ('**[[36]]'**, ENCRYPT('**//userpassword//'**));**
Настройте правило пересылки для всех писем с интернационализированного адреса на адрес ASCII
- INSERT INTO forwardings (source,destination) VALUES ('**[[37]]'**,'**test@test.ru'**);**
- quit**
- Настройка Postfix**
Создайте связь между Postfix и MariaDB
- Создайте файл-скрипт, чтобы получить значение //domain// из базы данных
> **# vi /etc/postfix/mysql-virtual_domains.cf**
//Пример//
- user =** [[38]]
- password =** [[39]]
- dbname =** [[40]]
- query = SELECT domain AS virtual FROM domains WHERE domain='%s'**
- hosts = 127.0.0.1**
- Создайте файл mysql-virtual_forwardings.cf для получения пересланной почты из базы данных
> **# vi /etc/postfix/mysql-virtual_forwardings.cf**
//Пример//
- user =** [[41]]
- password =** [[42]]
- dbname =** [[43]]
- query = SELECT destination FROM forwardings WHERE source='%s'**
- hosts = 127.0.0.1**
- Создайте файл-скрипт для создания почтового ящика и использования его для логина
> **# vi /etc/postfix/mysql-virtual_mailboxes.cf**
//Пример//
- user =** [[44]]
- password =** [[45]]
- dbname =** [[46]]
- query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'**
- hosts = 127.0.0.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**
- Установите необходимые права созданным скриптам
> **# chmod o= /etc/postfix/mysql-virtual_*.cf** > > **# chgrp postfix /etc/postfix/mysql-virtual_*.cf**
- Создайте пользователя и группу для почтового ящика
> **# groupadd -g 5000 vmail** > > **# useradd -g vmail -u 5000 vmail -d /home/vmail -m**
- Измените /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 =** [[47]]
- mydomain =** [[48]]
- 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/**[[49]]
- 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 =** [[50]]
- 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**
- Измените /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}**
- Измените /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
- Перезапустите postfix
//Пример//
- systemctl restart postfix**
- Назначьте алиасы почтовым адресам, изменив файл aliases
> Добавьте 2 строки
- vi /etc/aliases**
- postmaster: root**
- root: postmaster@test.ru**
- Обновите алиасы и перезапустите postfix
> **# newaliases** > > **# systemctl restart postfix**
Настройка Dovecot
- Сделайте резервную копию существующей конфигурации
> **# mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf-backup**
- Настройте конфигурацию 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/**[[51]]
- 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 =** [[52]]
- }**
- unix_listener /var/spool/postfix/private/auth {**
- mode = 0666**
- user =** [[53]]
- group =** [[54]]
- }**
- 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**
- }**
- Создайте скрипт, чтобы 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';**
- Установите необходимые права группе dovecot
> **# chgrp dovecot /etc/dovecot/dovecot-sql.conf.ext** > > **# chmod o= /etc/dovecot/dovecot-sql.conf.ext**
- Перезапустите dovecot
> **# systemctl restart dovecot**
- Проверьте журнал почтового сервера /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
- Протестируйте pop3
> **# telnet localhost pop3**
//Пример//
- Trying 127.0.0.1...**
- Connected to localhost.localdomain.**
- Escape character is '^]'.**
- +OK Dovecot ready.**
- Протестируйте 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**
- Протестируйте отправку и получение почты при помощи 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**
- Проверьте журнал, чтобы увидеть результат отправки в 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**
- Проверьте почтовый ящик. При отправке и получении писем вы увидите следующий результат:
- cd /home/vmail/test.ru/thai/Maildir**
- find**
//Пример//
- .**
- ./dovecot-uidlist**
- ./cur**
- ./new**
- ./new/1285609582.P6115Q0M368794.li172-137**
- ./dovecot.index**
- ./dovecot.index.log**
- ./tmp**
- Проверьте почтовый ящик с помощью почтового клиента mutt, чтобы увидеть письма в почтовом ящике
> **# yum -y install mutt** > > **# mutt -f .**
- Проверьте отправку писем с интернационализированного адресов
* В конце отправляемого сообщения поставьте «.» * Нажмите Ctrl+] , чтобы выйти
- telnet localhost 25**
- EHLO localhost**
- MAIL FROM: тест@тест.рф SMTPUTF8**
- RCPT TO: тест1@тест1.рф**
- data**
- Subject: eai test**
- .**
Установите SquirrelMail
- Установите squirrelmail
> **# yum -y install epel-release** > > **# yum install squirrelmail**
- Если у вас не установлен Apache, установите Apache
> **# yum -y install httpd** > > **# systemctl enable httpd** > > **# systemctl start httpd** > > **# systemctl status httpd**
- Скопируйте/перенесите squirrelmail в /var/www/html/
> **# cd /var/www/html/**
(скопируйте squirrelmail в /var/www/html/ например используя для копирования winscp)
- Создайте каталог данных для squirrelmail
> **# cd /var/lib/squirrelmail/** > > **# mkdir data** > > **# chmod ugo+rwx data/**
- Протестируйте логин для доступа через веб-браузеры. Введите IP сервера, затем /squirrelmail
> **# Test sending and receiving mail**