Оглавление
- Порядок дій
- Встановлення та налаштування KeepAlived
- Встановлюємо та налаштовуємо GulsterFS
- Встановлюємо та налаштовуємо iRedMail
- Налаштовуємо реплікацію MariaDB (Master-Master)
- Проводимо перевірку синхронізації
- Налаштовуємо DNS записи
Нещодавно один клієнт поставив перед нами завдання. Компанія активно використовує електронну пошту, створено понад 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, спільна для обох серверів.
Порядок дій буде наступний
- Встановлення та налаштування KeepAlived
- Встановлення та налаштування GlusterFS як glusterserver & glusterclient (краще для цього мати окремий диск на кожному з серверів однакової ємності)
- Встановлення та налаштування iRedMail
- Налаштування реплікації MariaDB
- Налаштування 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