• База знаний
  • /
  • Блог
  • /
  • Wiki
  • /
+380 (44) 364 05 71

Створення простого відмовостійкого поштового кластеру на базі iRedMail

Оглавление

Нещодавно один клієнт поставив перед нами завдання. Компанія активно використовує електронну пошту, створено понад 600 електронних скриньок, поштою зайнято близько 300 Гб дискового простору. У зв'язку з планованим зростанням кількості поштових скриньок, щоб убезпечити себе в разі виходу з ладу серверу, компанія вирішила створити відмовосстійку систему з двох однакових поштових серверів і доручила нам реалізацію. Бюджет на реалізацію завдання був обмежений 3200 грн. Рішення завдання користувач довірив нам.

Реалізація вийшла досить цікавою, тому ми опишемо її в цій статті.

Систему ми вирішили побудувати з двох незалежних серверів. Конфігурація серверів наступна: Intel i7-7700, 16 GB RAM, 2х240 GB SSD, 2x2 Tb HDD.
На сервери встановлена ??ОС Centos 7. Для прикладу будемо використовувати доменне ім'я example.com.ua

Загальна схема реалізації наступна:

Схема реалізації поштового кластеру

Загальна схема реалізації наступна:

192.168.0.1 mail1.example.com.ua mail1

192.168.0.2 mail2.example.com.ua mail2

192.168.0.10 mail.example.com.ua використаємо для KeepAlived, спільна для обох серверів.

Порядок дій буде наступний

  1. Встановлення та налаштування KeepAlived
  2. Встановлення та налаштування GlusterFS як glusterserver & glusterclient (краще для цього мати окремий диск на кожному з серверів однакової ємності)
  3. Встановлення та налаштування iRedMail
  4. Налаштування реплікації MariaDB
  5. Налаштування DNS записів

Встановлення та налаштування KeepAlived

- на обох серверах додаємо /etc/hosts:

192.168.0.1 mail1.example.com.ua mail1
192.168.0.2 mail2.example.com.ua mail2

- тимчасово вимикаємо фаєрвол:

systemctl stop firewalld.service
systemctl disable firewalld.service

- встановлюємо KeepAlived:

yum install -y keepalived
- на mail1 /etc/keepalived/keepalived.conf приводимо до вигляду:

vrrp_instance VI_1 {
    interface enp1s0 # interface to monitor
    state MASTER # MASTER on mail1, BACKUP on mail2
    virtual_router_id 51
    priority 101 # 101 on mail1, 100 on mail2
    virtual_ipaddress {
    192.168.0.10 # virtual ip address
    }
authentication {
          auth_type PASS
          auth_pass YourPass
  }
}

- на mail2 /etc/keepalived/keepalived.conf приводимо до вигляду:

vrrp_instance VI_1 {
    interface enp1s0 # interface to monitor
    state BACKUP # MASTER on mail1, BACKUP on mail2
    virtual_router_id 51
    priority 100 # 101 on mail1, 100 on mail2
    virtual_ipaddress {
    192.168.0.10 # virtual ip address
    }
authentication {
          auth_type PASS
          auth_pass YourPass
  }
}

- активувуємо службу KeepAlived на обох серверах:

systemctl enable keepalived
systemctl start keepalived

- перевіряємо стан віртуального IP (192.168.1.10) за допомогою команди нижче:

ip a

Якщо все працює як треба, ми побачимо адресу 192.168.1.10 на mail1.

Встановлюємо та налаштовуємо GulsterFS

- підготуємо по жорсткому диску на обох серверах (mail1 та mail2):

fdisk /dev/sdb # далі n, кілька разів “ентер”, w щоб зміни збереглись
mkfs.ext4 /dev/sdb1

- тільки на mail1:

mkdir /glusterfs1
та додаємо в /etc/fstab:
/dev/sdb1 /glusterfs1      ext4    defaults        1 2

- тільки на mail2:

mkdir /glusterfs2
та додаємо в /etc/fstab:
/dev/sdb1 /glusterfs2      ext4    defaults        1 2

- на обох серверах (mail1 та mail2):

mount -a

- на обох серверах (mail1 та mail2):

yum install epel-release -y 
yum install yum-priorities yum-utils -y
yum install centos-release-gluster -y 
yum install glusterfs-server -y

- активуємо службу:

systemctl start glusterd
systemctl enable glusterd

- на mail1 перевіряємо доступність:

gluster peer probe mail2
gluster peer status

- на mail2:

gluster peer probe mail1
gluster peer status

- тільки на mail1:

gluster volume create mailrep-volume replica 2  mail1:/glusterfs1/vmail  mail2:/glusterfs2/vmail force
gluster volume set mailrep-volume auth.allow 192.168.0.1,192.168.0.2,127.0.0.1
gluster volume start mailrep-volume
перевіряємо:
gluster volume info mailrep-volume

- створюємо папку для vmail та підключаємо glusterfs:

на mail1:
mkdir  /var/vmail
mount.glusterfs mail1:/mailrep-volume /var/vmail/
та додаємо в /etc/fstab:

mail1:/mailrep-volume /var/vmail glusterfs defaults,_netdev 0 0

монтуємо та перевіряємо:
mount -a
df -h

- на mail2:

mkdir /var/vmail
mount.glusterfs mail2:/mailrep-volume /var/vmail/
та додаємо в /etc/fstab:
mail2:/mailrep-volume /var/vmail glusterfs defaults,_netdev 0 0
монтуємо та перевіряємо:
mount -a
df -h

Створимо кілька файлів в змонтованому каталозі на одному з серверів та перевіримо чи вони з'явилися на іншому:

на mail1:

cd /var/vmail; touch file1 file2

на mail2:

ls -l /var/vmail

Встановлюємо та налаштовуємо iRedMail

- Встановлюємо останню версію iRedMail на 2 сервери (спочатку на mail1, потім повторюємо на mail2)

Для mail1 виконуємо:

Перевіряємо hostname:

hostname -f
mail1.example.com.ua

Якщо треба змінити виконуємо:

hostname mail1.example.com.ua

та правимо /etc/hostname:

mail1.example.com.ua
та /etc/hosts (FQDN встановлюємо обовязково як перший елемент):
127.0.0.1 mail1.example.com localhost localhost.localdomain

вимикаємо SELinux, для цього вводимо команду:

setenforce 0

та правимо /etc/selinux/config, щоб зміни збереглись після перезавантаження:

SELINUX=disabled

Завантажуємо останню версію iRedMail, на поточний момент це 1.4.0, та розпаковуємо:

cd /root/
wget https://github.com/iredmail/iRedMail/archive/1.4.0.tar.gz
tar zxf 1.4.0.tar.gz

Запускаємо програму встановлення:

cd iRedMail-1.4.0/
bash iRedMail.sh

В процесі встановлення обираємо Nginx як веб-сервер, MariaDB та папку пошти за замовчуванням: /var/vmail, на запитання про налаштування фаєрволу погоджуємось.

Вмикаємо фаєрвол та налаштовуємо:

systemctl enable firewalld.service
systemctl start firewalld.service

firewall-cmd --permanent \
    --zone=iredmail \
    --add-rich-rule='rule family="ipv4" source address="192.168.0.2/24" port protocol="tcp" port="3306" accept'
firewall-cmd --zone=iredmail --permanent --add-port=111/udp
firewall-cmd --zone=iredmail --permanent --add-port=24007/tcp
firewall-cmd --zone=iredmail --permanent --add-port=24008/tcp
firewall-cmd --zone=iredmail --permanent --add-port=24009/tcp
firewall-cmd --zone=iredmail --permanent --add-port=139/tcp
firewall-cmd --zone=iredmail --permanent --add-port=445/tcp
firewall-cmd --zone=iredmail --permanent --add-port=965/tcp
firewall-cmd --zone=iredmail --permanent --add-port=2049/tcp
firewall-cmd --zone=iredmail --permanent --add-port=38465-38469/tcp
firewall-cmd --zone=iredmail --permanent --add-port=631/tcp
firewall-cmd --zone=iredmail --permanent --add-port=963/tcp
firewall-cmd --zone=iredmail --permanent --add-port=49152-49251/tcp

Перезавантажуємо правила брандмауера:

firewall-cmd --complete-reload

*Примітка: памятаємо про інший hostname, та при налаштуванні фаєрволу address="192.168.0.1/24" для mail2

Налаштовуємо реплікацію MariaDB (Master-Master)

- на mail1, додаємо до /etc/my.cnf в блок [mysqld]:

server-id                   = 1
    log_bin                 = /var/log/mariadb/mariadb-bin.log
    log-slave-updates
    log-bin-index           = /var/log/mariadb/log-bin.index
    log-error               = /var/log/mariadb/error.log
    relay-log               = /var/log/mariadb/relay.log
    relay-log-info-file     = /var/log/mariadb/relay-log.info
    relay-log-index         = /var/log/mariadb/relay-log.index
    auto_increment_increment = 10
    auto_increment_offset   = 1
    binlog_do_db            = amavisd
    binlog_do_db            = iredadmin
    binlog_do_db            = roundcubemail
    binlog_do_db            = sogo
    binlog_do_db            = vmail
    binlog-ignore-db=test
    binlog-ignore-db=information_schema
    binlog-ignore-db=mysql
    binlog-ignore-db=iredapd
    log-slave-updates
    replicate-ignore-db=test
    replicate-ignore-db=information_schema
    replicate-ignore-db=mysql
    replicate-ignore-db=iredapd

Перезапускаємо службу MariaDB:

systemctl restart mariadb

- на mail2, додаємо до /etc/my.cnf в блок [mysqld]:

server-id                   = 2
    log_bin                 = /var/log/mariadb/mariadb-bin.log
    log-slave-updates
    log-bin-index           = /var/log/mariadb/log-bin.index
    log-error               = /var/log/mariadb/error.log
    relay-log               = /var/log/mariadb/relay.log
    relay-log-info-file     = /var/log/mariadb/relay-log.info
    relay-log-index         = /var/log/mariadb/relay-log.index
    auto_increment_increment = 10
    auto_increment_offset   = 1
    binlog_do_db            = amavisd
    binlog_do_db            = iredadmin
    binlog_do_db            = roundcubemail
    binlog_do_db            = sogo
    binlog_do_db            = vmail
    binlog-ignore-db=test
    binlog-ignore-db=information_schema
    binlog-ignore-db=mysql
    binlog-ignore-db=iredapd
    log-slave-updates
    replicate-ignore-db=test
    replicate-ignore-db=information_schema
    replicate-ignore-db=mysql
    replicate-ignore-db=iredap

Перезапускаем службу MariaDB:

systemctl restart mariadb

Підключаємо користувачем root MariaDB та створюємо користувача для реплікації на обох серверах:

- на mail1:

create user 'replicator'@'%' identified by 'strongpass';
grant replication slave on *.* to 'replicator'@'%';
SHOW MASTER STATUS;
+--------------------+----------+----------------------------------------------+-------------
-----------------+
| File               | Position | Binlog_Do_DB                                 |
Binlog_Ignore_DB              |
+--------------------+----------+----------------------------------------------+-------------
-----------------+
| mariadb-bin.000001 |      245 | amavisd,iredadmin,iredapd,roundcubemail,sogo |
test,information_schema,mysql |
+--------------------+----------+----------------------------------------------+-------------
-----------------+

Звертаємо увагу на значення полів File та Position, вони нам знадобиться при налаштуванні mail2.

- на mail2:

create user 'replicator'@'%' identified by 'strongpass';
grant replication slave on *.* to 'replicator'@'%';
slave stop;

CHANGE MASTER TO MASTER_HOST = '192.168.0.1', MASTER_USER = 'replicator', MASTER_PASSWORD =
'strongpass', MASTER_LOG_FILE = 'mariadb-bin.000001', MASTER_LOG_POS = 245; # File та Position ставимо значення з mail1
slave start;
SHOW MASTER STATUS;
+--------------------+----------+----------------------------------------------+-------------------------------+
| File               | Position | Binlog_Do_DB                                 | Binlog_Ignore_DB              |
+--------------------+----------+----------------------------------------------+-------------------------------+
| mariadb-bin.000001 |     289  | amavisd,iredadmin,iredapd,roundcubemail,sogo | test,information_schema,mysql |
+--------------------+----------+----------------------------------------------+-------------------------------+
show slave status\G;

Звертаємо увагу на значення полів File та Position, воно нам знадобиться при налаштуванні mail1.

Перезапускаем службу MariaDB:

systemctl restart mariadb

- на mail1:

slave stop;
CHANGE MASTER TO MASTER_HOST = '192.168.0.2', MASTER_USER = 'replicator',
MASTER_PASSWORD ='strongpass', MASTER_LOG_FILE = 'mariadb-bin.000001', MASTER_LOG_POS = 289; File та Position
ставимо значення з mail2 
slave start;
show slave status\G;
exit;

Перезапускаем MariaDB:

systemctl restart mariadb

Перезавантажено один з серверів і чекаємо доки він ввімкнеться, потім перезавантажено інший.

Проводимо перевірку синхронізації

  • створюємо користувача на одному з серверів, на іншому він має з'явитися;
  • створюємо скриньку на одному з серверів, на іншому вона має з'явитися
  • пробуємо увійти, використовуючи roundcubemail з будь-якого; поштового сервера, перевіряємо що в БД 'roundcubemail-> users', з'явився запис на обох серверах;
  • обидва сервери працюють як Glusterserver та Glusterclient, тому перезавантажувати їх бажано по черзі — якщо обидва сервери одночасно перезавантажується, каталог ‘/var/vmail' може бути не примонтований, доведеться монтувати йог вручну, використовуючи команду 'gluster volume start mailrep-volume force'

Налаштовуємо DNS записи

Налаштовуємо SPF

Оскільки домен mail.example.com.ua (він викоростовується в якості MX запису домену example.com.ua) направлений на 192.168.0.10, то підключатись користувачами ми будемо саме до нього, чи то в панель керування iRedMail чи в Roundcube. Але відправка, за замовчуванням відбувається через адресу 192.168.0.1 у випадку mail1, або 192.168.0.2 у випадку mail2 — тому додаємо ці адреси до SPF запису домену, щоб пошта не потрапляла в спам:

"v=spf1 ip4:192.168.0.1/32 ip4:192.168.0.2/32 +a +mx ~all"

(інший варіант створити ще 2 mx записи:

192.168.0.1 mail1.example.com.ua 
192.168.0.2 mail2.example.com.ua

P нижчим пріорітетом ніж mail.example.com.ua — тоді додавати адреси до SPF немає необхідності, вони міститимуться в “+mx” )

Налаштовуємо DKIM

За замовчуванням DKIM-підпис в iRedMail вже ввімкнений.
Шукаємо де знаходиться приватний ключ:

grep -rn “example.com.ua” /etc/amavisd/amavisd.conf
12:$myhostname = 'mail1.example.com.ua ';
505:dkim_key('example.com.ua, 'dkim', '/var/lib/dkim/example.com.ua.pem');
515:    '.' => {d => 'example.com.ua'

 І генеруємо на його основі публічний ключ:

openssl rsa -in /var/lib/dkim/example.com.ua.pem -pubout -outform der 2>/dev/null | openssl base64 -A

Отримуємо щось на зразок:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfMeGbuCw7HM3DHxh+lBNewgkXNYC9XPaI680nlt9LIvKz6kIlOCvs62bOgM
ZBQeY8WfZmkFhGRxgLBjZ4kGMhlzmfdCrve0dqH3cxVWQYyzjFOxNnh0dZLvjXRoyGkdhiyq/IvJI13Snv3Uge2qAuUuwoLPqM
ugog8H9bM9TgmwIDAQAB

Це й буде значення “p” для DKIM DNS запису.

Селектор шукаємо там же де й приватний ключ

505:dkim_key('example.com.ua, 'dkim', '/var/lib/dkim/example.com.ua .pem');

- в нашому випадку dkim, тобто днс запис, що треба додати матиме вигляд:

dkim._domainkey.example.com.ua TXT v=DKIM1; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfMeGbuCw7HM3DHxh+lBNewgkXNYC9XPaI680nlt9LIvKz6kIlO
Cvs62bOgMZBQeY8WfZmkFhGRxgLBjZ4kGMhlzmfdCrve0dqH3cxVWQYyzjFOxNnh0dZLvjXRoyGkdhiyq/IvJI13Snv
3Uge2qAuUuwoLPqMugog8H9bM9TgmwIDAQAB

Налаштування DMARC

Як це зробити можете ознайомитись в нашій інструкції https://freehost.com.ua/faq/faq/dmarc/

Сподіваємося, що стаття була корисна для Вас. Якщо є питання по реалізації, будь ласка, задавайте їх у коментарях. Якщо для вашої організації необхідно реалізувати аналогічну задачу або іншу пов'язану з адмініструванням серверів Linux, ми готові надати сервери для оренди та допомогти в її реалізації.

Мануал по “Встановлення поштового серверу IREDMAIL” дивіться тут.

Подписывайтесь на наш телеграмм-канал t.me/freehostua, чтоб быть в курсе новых полезных материалов. Смотрите наш Youtube канал youtube.com/user/freehostua.

 

Дата: 07.06.2021
Автор: Виктор
Голосование

Авторам статьи важно Ваше мнение. Будем рады его обсудить с Вами:

comments powered by Disqus
Спасибо, что выбираете FREEhost.UA