iRedAdmin / SoGo

Debian 11

Подготовка OS
apt update && apt dist-upgrade -y && apt install mc vim curl htop -y && apt autoremove -y && timedatectl set-timezone Europe/Moscow
hostnamectl set-hostname mail.example.ru

FQDN должно стоять первым в файле, это важно.

nano /etc/hosts
127.0.0.1       mail.example.ru

Проверяем, что в системе отсутствует Apache и останавливаем его при наличии

systemctl stop apache2 && systemctl disable apache2

Добавляю отдельный диск для почты /dev/sdb

wipefs /dev/sdb -a

Разбиваю и форматирую

fdisk /dev/sdb
mkfs.ext4 /dev/sdb

Создаю каталог для монтирования

mkdir /vmail

Дописываю строку в конце файла /etc/fstab для автоматического монтирования

nano /etc/fstab
/dev/sdb /vmail ext4 defaults 1 2

Проверяю, что ошибок нет

mount -a
Установка iRedMail
wget https://github.com/iredmail/iRedMail/archive/refs/tags/1.6.7.tar.gz && \
tar -xzvf 1.6.7.tar.gz && cd iRedMail-1.6.7 && chmod +x iRedMail.sh && ./iRedMail.sh

Указываю для почты папку /vmail
Веб-сервер - NginX
БД - MariaDB
Вводим сложный пароль пользователя root для MariaDB, например 2REQoS2mm5S49cwuK
Имя домена example.ru
Пароль для пользователя Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. (пароль со спецсимволами не используем), например KWAq8z3m5S49cwu

Далее в списке устанавливаемого я исключил RoundCube, можно выбрать всё )

На вопрос о FireWall отвечаем Y

Далее ребут и заходим по адресу https://IP-адрес_сервера/iredadmin/

Логин Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. и пароль, который вводили при установке iRedMail.

Отключаю Greylisting

Отключаю Graylisting:

chmod u+w /opt/iredapd/settings.py && nano /opt/iredapd/settings.py

Нахожу строку plugins = ["reject_null_sender", "reject_sender_login_mismatch", "greylisting", "throttle", "amavisd_wblist", "sql_alias_access_policy"] и вырезаю "greylisting"

chmod u-w /opt/iredapd/settings.py	
Настройка Clamav
nano /etc/clamav/freshclam.conf

Комментируем строки, которые начинаются на DatabaseMirror

#DatabaseMirror ...
#DatabaseMirror ...

Добавляем следующую строку:

PrivateMirror https://packages.microsoft.com/clamav/

Далее

systemctl stop clamav-freshclam && rm -f /var/lib/clamav/freshclam.dat && freshclam

Ждем окончания обновления, а затем запускаем службу clamav-freshclam и перезапускаем clamav-daemon, amavis:

systemctl start clamav-freshclam && systemctl restart clamav-daemon amavis
Настройка DNS-записей

При установке скрипт генерирует DKIM 2048, но я бы рекомендовал перевыпуск в 1024, т.к. могут возникнуть проблемы у некоторых DNS-провайдеров.
Перевыпуск:

amavisd-new genrsa /var/lib/dkim/example.ru.pem 1024

Этой же командой можно выпустить для дополнительных доменов если у вас их на одном почтовике несколько, т.е.

amavisd-new genrsa /var/lib/dkim/example2.ru.pem 1024
amavisd-new genrsa /var/lib/dkim/example3.ru.pem 1024
.....

Присваиваем переменной DOMAIN значение имени вашего домена и назначаем права:

DOMAIN=example.ru && chown amavis:amavis /var/lib/dkim/$DOMAIN.pem && chmod 0400 /var/lib/dkim/$DOMAIN.pem

Далее открываем конфигурационный файл amavisd

nano /etc/amavis/conf.d/50-user

Находим строчку:

dkim_key('example.ru', "dkim", "/var/lib/dkim/example.ru.pem");

И добавляем радом с ней новые, если несколько доменов. Получится так:

....
dkim_key('example.ru', "dkim", "/var/lib/dkim/example.ru.pem");
dkim_key('example2.ru', "dkim", "/var/lib/dkim/example2.ru.pem");
....

Теперь находим строчку:

@dkim_signature_options_bysender_maps = ( {
   ...
   "example.ru" => { d => "example.ru", a => 'rsa-sha256', ttl => 10*24*3600 },

И также после нее добавляем новые. Должно получиться:

"example.ru" => { d => "example.ru", a => 'rsa-sha256', ttl => 10*24*3600 },	
"example.ru" => { d => "example2.ru", a => 'rsa-sha256', ttl => 10*24*3600 },
"example.ru" => { d => "example3.ru", a => 'rsa-sha256', ttl => 10*24*3600 },
....

Далее

amavisd-new restart

Посмотреть новый ключ можно командой:

amavisd-new showkeys $DOMAIN

Следующим пунктом нам необходимо сделать записи на стороне регистратора домена:

MX 10 mail.example.ru.
mail.example.ru   A   ВНЕШНИЙ_IP-адрес
example.ru     text = "v=spf1 a mx -all"
_dmarc.example.ru. 3600 IN TXT "v=DMARC1; p=quarantine; sp=none; pct=100; fo=0; rua=mailto:Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript."
dkim._domainkey.example.ru     text = "v=DKIM1; p=MIGfMA0GCSqGSIb3GNADCBiQKBgQDHNu0ZlYkq.....paUwQIDAQAB"

Значение DKIM можно посмотреть командой:

amavisd-new showkeys

Когда обновятся DNS-записи необходимо проверить правильность DKIM командой:

amavisd-new testkeys

Вывод должен быть примерно таким:

dkim._domainkey.example.ru => pass
dkim._domainkey.example2.ru => pass
NginX

Удаляю всё из папки /etc/nginx/sites-enabled/ и создаю там файл для нашего почтовика:

nano /etc/nginx/sites-enabled/example.ru.conf
server {
    listen 80;
    listen [::]:80;
    server_name mail.example.ru;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name mail.example.ru;

    root /var/www/html;
    index index.php index.html;

    location ~ /.well-known {
        root /usr/share/nginx/html;
        allow all;
    }
    include /etc/nginx/templates/misc.tmpl;
    include /etc/nginx/templates/ssl.tmpl;
    include /etc/nginx/templates/iredadmin.tmpl;
    include /etc/nginx/templates/roundcube.tmpl;
    include /etc/nginx/templates/sogo.tmpl;
    include /etc/nginx/templates/netdata.tmpl;
    include /etc/nginx/templates/php-catchall.tmpl;
    include /etc/nginx/templates/stub_status.tmpl;
}

Проверка корректности кофигурации NginX:

nginx -t

И если ошибок нет, то:

nginx -s reload
Let`s Encrypt
apt install -y certbot
DOMAIN=example.ru
certbot certonly --webroot --agree-tos --email postmaster@$DOMAIN --cert-name mail.$DOMAIN --webroot-path /usr/share/nginx/html/ -d mail.$DOMAIN

При успешном завершении команды удаляем старые сертификаты iRedAdmin:

rm -f /etc/ssl/private/iRedMail.key && rm -f /etc/ssl/certs/iRedMail.crt

И создаем симлинки на полученные:

ln -s /etc/letsencrypt/live/mail.$DOMAIN/fullchain.pem /etc/ssl/certs/iRedMail.crt && \
ln -s /etc/letsencrypt/live/mail.$DOMAIN/privkey.pem /etc/ssl/private/iRedMail.key

Перезапускаем службы nginx, postfix и dovecot:

systemctl reload nginx postfix dovecot

Для автоматического продления сертификата создаем в cron задачу:

crontab -e

Добавляем строку:

0 0 * * 1,4 /usr/bin/certbot renew --noninteractive	

Также добавляем настройку для перезапуска сервисов после обновления сертификатов:

nano /etc/letsencrypt/cli.ini
deploy-hook = systemctl reload nginx postfix dovecot
Обновление iRedAdmin
cd /usr/local/src/ && wget https://github.com/iredmail/iRedAdmin/archive/refs/tags/2.4.tar.gz
tar -zxf 2.4.tar.gz && cd iRedAdmin-2.4/tools/ && bash upgrade_iredadmin.sh	

Ждём полной отработки скрипта.

Дополнительные настройки:

Настройка лимита на объем вложения (по умолчанию 15 Мб.). Увеличиваю до 50Мб:

postconf -e "message_size_limit = 52428800"
postconf -e "upload_size_limit = 52428800"

Настройка workers в Sogo при проблемах с ActiveSync Outlook 2016+

nano /etc/sogo/sogo.conf
WOWorkersCount = 200;
WOWatchDogRequestTimeout = 20;
SxVMemLimit = 1024;	
SOGoMaximumSyncWindowSize = 100;
SOGoMaximumSyncResponseSize = 4096;
SOGoInternalSyncInterval = 60;
SOGoLanguage = Russian;
SOGoTimeZone = "Europe/Moscow";

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

WOMaxUploadSize = 51200;
SOGoMaximumMessageSizeLimit = 51200;

Эта настройка оверрайдит кол-во воркеров:

nano /etc/default/sogo
PREFORK=200

Также можно в терминале командами задать часовой пояс, язык по умолчанию и интервал проверки почты:

defaults write sogod SOGoTimeZone "Europe/Moscow"
defaults write sogod SOGoLanguage "Russian"
defaults write sogod SOGoMailMessageCheck every_5_minutes

В процессе функционирования почтового сервера iRedMail, можно использовать белые и чёрные списки. В списки могут быть добавлены домены, поддомены, ip-адреса, либо отдельные почтовые аккаунты.
Просмотр содержимого белого и чёрного списков:

python3 /opt/iredapd/tools/wblist_admin.py --list --whitelist
python3 /opt/iredapd/tools/wblist_admin.py --list --blacklist

Команды добавления в белый и чёрный список:

python3 /opt/iredapd/tools/wblist_admin.py --add --whitelist @example.ru
python3 /opt/iredapd/tools/wblist_admin.py --add --blacklist @example.ru

Удаление из белого и чёрного списка:

python3 /opt/iredapd/tools/wblist_admin.py --delete --whitelist @example.ru
python3 /opt/iredapd/tools/wblist_admin.py --delete --blacklist @example.ru


Не забудьте протестировать почтовый сервер после окончания настройки и устранить ошибки, при их наличии.
Тест можно провести на сайте https://www.mail-tester.com/

Если вы в процессе установки не снимали галочку, то в комплекте идёт чудесная панель мониторинга сервера. Доступна она по адресу:

https://mail.example.ru/netdata

Если при тестировании сервера вы получаете ошибку "SPF: HELO does not publish an SPF Record", то просто добавьте в "/etc/postfix/main.cf"

nano /etc/postfix/main.cf

строку:

smtp_helo_name = $mydomain
Миграция почты через imapsync

Для миграции почтовых ящиков с другого сервиса есть прекрасный скрипт, который полностью справляется с этой задачей.

Скачиваем:

cd ~ && wget -N https://raw.githubusercontent.com/imapsync/imapsync/master/imapsync && chmod +x imapsync

Ставим зависимости:

apt install -y \
 libauthen-ntlm-perl \
 libcgi-pm-perl \
 libcrypt-openssl-rsa-perl \
 libdata-uniqid-perl \
 libencode-imaputf7-perl \
 libfile-copy-recursive-perl \
 libfile-tail-perl \
 libio-socket-inet6-perl \
 libio-socket-ssl-perl \
 libio-tee-perl \
 libhtml-parser-perl \
 libjson-webtoken-perl \
 libmail-imapclient-perl \
 libparse-recdescent-perl \
 libproc-processtable-perl \
 libmodule-scandeps-perl \
 libreadonly-perl \
 libregexp-common-perl \
 libsys-meminfo-perl \
 libterm-readkey-perl \
 libtest-mockobject-perl \
 libtest-pod-perl \
 libunicode-string-perl \
 liburi-perl \
 libwww-perl \
 libtest-nowarnings-perl \
 libtest-deep-perl \
 libtest-warn-perl \
 make \
 time \
 cpanminus

В простейшем случае перенос ящика будет выглядеть так:

./imapsync \
 --host1 imap.yandex.ru \
 --user1 Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. \
 --password1 "Pa$$word1" \
 --host2 mail.example.ru \
 --user2 Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. \
 --password2 "Pa$$word1"
 --exclude 'Spam|Trash'

Fuse

Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.