· 20 мин чтения

Миграция с Microsoft Exchange на Postfix + Dovecot: пошаговый план

Я Семёнов Евгений Сергеевич, директор АйТи Фреш. За 15 лет я перевёл с Exchange на open-source около тридцати корпоративных почт — от мелких офисов на 15 ящиков до холдингов на 500 пользователей. Причины у всех разные: кончилась лицензия и не хочется продлевать, Exchange 2016 выходит из поддержки, санкции и отказ от Microsoft, или просто надоело обслуживать «особенности» AD-интеграции. Разберём миграцию в деталях.

Архитектура Postfix + Dovecot

Минимальный боевой стек:

План миграции

  1. Инвентаризация: сколько ящиков, размер, шаренные ящики, распределения, календари.
  2. Установка нового сервера в параллель — IP, MX пока не меняем.
  3. Настройка Postfix/Dovecot, DKIM, Rspamd, TLS.
  4. Пробная миграция 2–3 тестовых ящиков через imapsync.
  5. Полная синхронизация всех ящиков (ночью).
  6. Перенос распределений, алиасов, шаренных ящиков.
  7. Финальный синк дельты.
  8. Смена MX, SPF, DKIM — DNS-переключение.
  9. Перенастройка клиентов Outlook/Thunderbird/телефонов.
  10. 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.ruMX 10mail.company.ru
mail.company.ruAВнешний IP сервера
company.ruTXTv=spf1 mx -all
mail._domainkeyTXTv=DKIM1; k=rsa; p=...
_dmarcTXTv=DMARC1; p=quarantine; rua=mailto:dmarc@company.ru
PTR (у провайдера)PTRmail.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 руб./мес сопровождение.

Грабли, на которые наступают при миграции

Переведём с 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 ящиков.

Подпишитесь на рассылку ITfresh

Раз в неделю — практические гайды для руководителя IT и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.