Миграция с Microsoft Exchange на Postfix + Dovecot: пошаговый план
Я Семёнов Евгений Сергеевич, директор АйТи Фреш. За 15 лет я перевёл с Exchange на open-source около тридцати корпоративных почт — от мелких офисов на 15 ящиков до холдингов на 500 пользователей. Причины у всех разные: кончилась лицензия и не хочется продлевать, Exchange 2016 выходит из поддержки, санкции и отказ от Microsoft, или просто надоело обслуживать «особенности» AD-интеграции. Разберём миграцию в деталях.
Архитектура Postfix + Dovecot
Минимальный боевой стек:
- Postfix — SMTP-сервер (приём, отправка, релеи).
- Dovecot — IMAP/POP3, аутентификация пользователей.
- OpenDKIM — подпись исходящих писем.
- Rspamd или SpamAssassin — антиспам.
- ClamAV — антивирус.
- Roundcube или SOGo — веб-почта + календари.
- Let's Encrypt — TLS.
- Бэкап через rsnapshot или Borg.
План миграции
- Инвентаризация: сколько ящиков, размер, шаренные ящики, распределения, календари.
- Установка нового сервера в параллель — IP, MX пока не меняем.
- Настройка Postfix/Dovecot, DKIM, Rspamd, TLS.
- Пробная миграция 2–3 тестовых ящиков через imapsync.
- Полная синхронизация всех ящиков (ночью).
- Перенос распределений, алиасов, шаренных ящиков.
- Финальный синк дельты.
- Смена MX, SPF, DKIM — DNS-переключение.
- Перенастройка клиентов Outlook/Thunderbird/телефонов.
- Exchange оставляем на неделю в режиме read-only для подстраховки.
Установка на Ubuntu 22.04
sudo apt update
sudo apt install -y postfix postfix-mysql dovecot-core dovecot-imapd \
dovecot-pop3d dovecot-mysql opendkim opendkim-tools rspamd redis-server \
clamav clamav-daemon certbot
# При установке postfix: Internet Site, mail.company.ru
Postfix — основной конфиг
Файл /etc/postfix/main.cf, ключевые параметры:
myhostname = mail.company.ru
mydomain = company.ru
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
mydestination = localhost
home_mailbox = Maildir/
# Виртуальные домены
virtual_mailbox_domains = mysql:/etc/postfix/mysql-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-mailboxes.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-aliases.cf
virtual_transport = lmtp:unix:private/dovecot-lmtp
# TLS
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.company.ru/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.company.ru/privkey.pem
smtpd_tls_security_level = may
smtp_tls_security_level = may
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
# Ограничения
smtpd_helo_required = yes
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_rbl_client zen.spamhaus.org,
check_policy_service unix:private/policyd-spf
# Milters для DKIM и Rspamd
milter_default_action = accept
smtpd_milters = unix:/var/run/opendkim/opendkim.sock, inet:localhost:11332
non_smtpd_milters = $smtpd_milters
Dovecot — IMAP/LMTP
# /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/var/vmail/%d/%n/Maildir
# /etc/dovecot/conf.d/10-auth.conf
auth_mechanisms = plain login
!include auth-sql.conf.ext
# /etc/dovecot/conf.d/10-master.conf
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
База MySQL для пользователей
CREATE DATABASE mailserver;
CREATE TABLE mailserver.domains (domain VARCHAR(255) PRIMARY KEY);
CREATE TABLE mailserver.mailboxes (
email VARCHAR(255) PRIMARY KEY,
password VARCHAR(255) NOT NULL,
quota BIGINT DEFAULT 5368709120
);
CREATE TABLE mailserver.aliases (
source VARCHAR(255), destination VARCHAR(255)
);
INSERT INTO domains VALUES ('company.ru');
INSERT INTO mailboxes VALUES (
'ivanov@company.ru',
'{SHA512-CRYPT}' || crypt('pass', '$6$salt$'),
5368709120);
DKIM подпись
sudo mkdir -p /etc/opendkim/keys/company.ru
cd /etc/opendkim/keys/company.ru
sudo opendkim-genkey -d company.ru -s mail -b 2048
sudo chown opendkim:opendkim mail.private
# /etc/opendkim.conf
Domain company.ru
KeyFile /etc/opendkim/keys/company.ru/mail.private
Selector mail
Socket local:/var/run/opendkim/opendkim.sock
sudo systemctl enable --now opendkim
Публичный ключ (файл mail.txt) добавляем в DNS как TXT-запись mail._domainkey.company.ru.
DNS: MX, SPF, DKIM, DMARC
| Запись | Тип | Значение |
|---|---|---|
| company.ru | MX 10 | mail.company.ru |
| mail.company.ru | A | Внешний IP сервера |
| company.ru | TXT | v=spf1 mx -all |
| mail._domainkey | TXT | v=DKIM1; k=rsa; p=... |
| _dmarc | TXT | v=DMARC1; p=quarantine; rua=mailto:dmarc@company.ru |
| PTR (у провайдера) | PTR | mail.company.ru |
PTR-запись (reverse DNS) делает ваш сервер «приличным» в глазах mail.ru и Gmail — без неё большая часть писем пойдёт в спам.
Перенос ящиков через imapsync
# Скрипт для массового переноса
while IFS=, read -r user pass; do
imapsync \
--host1 exchange.company.ru --user1 "$user" --password1 "$pass" \
--ssl1 --authmech1 PLAIN \
--host2 mail.company.ru --user2 "$user" --password2 "$pass" \
--ssl2 --authmech2 PLAIN \
--exclude 'Public Folders' \
--regextrans2 's/INBOX\.//' \
--automap --syncinternaldates
done < users.csv
Сначала пробный запуск с --dry, потом полный. Для финального синка перед переключением — повторный запуск, он скопирует только новые письма.
Реальный кейс: холдинг 120 ящиков, Exchange 2013
Однажды в 2024 году к нам пришёл клиент — строительная фирма в Москве, 120 ящиков на Exchange 2013. Лицензии кончились, обновляться до 2019 стало дорого, сервер аварийно падал. За 7 рабочих дней мы развернули Postfix + Dovecot + Rspamd + SOGo на нашем сервере Dell Xeon Platinum 8280 в дата-центре МТС Москва, настроили S/MIME, подключили телефоны через ActiveSync-шлюз Z-Push.
Переезд: ночная миграция ящиков (120 × 2–8 ГБ = примерно 700 ГБ), финальный синк субботним утром, переключение MX в 10:00 субботы. К понедельнику все сотрудники работали в Outlook 2021 с IMAP и в SOGo Webmail. Стоимость — 185 000 руб. за разовые работы + 32 000 руб./мес сопровождение.
Грабли, на которые наступают при миграции
- Забыли PTR. Gmail заворачивает письма в спам без видимой причины.
- Не перенесли public folders. В Exchange был общий календарь отдела — в SOGo его ставят отдельно.
- Outlook Anywhere (RPC/HTTP) не хотят отпускать. Пользователи требуют, приходится ставить Z-Push или SOGo ActiveSync.
- Старый Outlook не работает по IMAP корректно. Outlook 2010 теряет флаги — обновляйте хотя бы до 2019.
- DMARC сразу на reject. Пока не убедились, что DKIM/SPF работают, оставьте
p=none. - Rspamd не обучен. Первые две недели много ложных срабатываний. Настройте «Обучение как спам/не-спам» через IMAP-папки.
Переведём с Exchange на Linux-почту под ключ
За 15 лет мы мигрировали десятки корпоративных почт. Без потери писем, без долгого простоя, с сохранением календарей и шаренных ящиков. Инфраструктура — наши серверы Dell Xeon Platinum 8280 с 40G Mellanox в дата-центре МТС Москва. Бесплатный расчёт миграции за час.
Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш
FAQ — миграция почты с Exchange
- Можно ли мигрировать без простоя?
- Да. Параллельно поднимается новый сервер, работает в режиме relay с Exchange, копируются ящики через imapsync. В день X меняется MX-запись, пользователи переподключают клиентов. Простой — несколько минут при смене MX.
- Как перенести ящики пользователей?
- Утилитой imapsync: подключается к Exchange по IMAP, читает все папки и сохраняет в Dovecot. Скрипт разворачивается в цикл по всем ящикам. Синхронизация обычно идёт всю ночь для сотни ящиков.
- Outlook и календари — как быть?
- Без Exchange ActiveSync календари нужно переносить в CalDAV-сервер (Radicale, SOGo, Nextcloud). Outlook умеет IMAP+SMTP, но календари в нём — Google Calendar addon или SOGo-коннектор. Часть клиентов переезжает на Thunderbird с CardDAV/CalDAV.
- Что с SPF, DKIM, DMARC?
- После смены сервера обязательно обновить SPF (IP нового сервера), перегенерировать DKIM (ключ в OpenDKIM) и оставить DMARC на p=none или quarantine. Иначе письма попадут в спам у Gmail и mail.ru.
- Сколько времени занимает миграция для 50 пользователей?
- 3–5 рабочих дней на подготовку (сервер, DNS, антиспам, тесты), 1 ночь на финальный синк и переключение MX, 1–2 дня на поддержку пользователей. Бюджет у нас — от 85 тыс. руб. за 50 ящиков.