Заметки · 14.03.2025

Exchange в твоём смартфоне

Пост про Exchange Server, но сегодня с уклоном в сторону Ubuntu Server (все статьи про Ubuntu здесь).

У этой заметки обширная предыстория, но она скучна и, вопреки всем законам жанра, не особо богата на хоть какую-то практическую ценность. Однако, что-то всё-таки наскрести на пост удалось.

Сначала поведаю общую диспозицию. Есть заброшенный и весьма захламлённый (600+ Гб какой-то ерунды по данным du) веб-сервер на стареньком Linux, который выступает не только в качестве хостинга веб-проекта, но и в качестве обратного прокси почтового сервера для протокола Exchange ActiveSync.

С помощью Exchange ActiveSync можно с лёгкостью подключиться к своему почтовому ящику из почтового клиента (например, Outlook). Нужно только чтобы почтовый клиент умел в Exchange ActiveSync, а остальное уже дело техники. И корректных DNS записей.

Вот только вследствие общей усталости веб-сервер начал ронять движок баз данных или отрубать службу httpd2. Разбираться в причинах падений служб смысла уже не было — серверу уже давно было пора на покой. Единственное, что продолжало держать старичка в онлайне — тот самый обратный прокси. Осталось только переселить реверс на другой сервер и объявить его адрес в конфигурациях пограничных устройств, пробросив нужные порты к нужному IP-адресу.

В качестве операционной системы я выбрал Ubuntu Server. Установка заняла пару чашек чая, общая настройка и того меньше. Теперь самое время установить веб-сервер Apache, который и будет выполнять функцию обратного прокси:

sudo apt install apache2

После установки включим автозагрузку сервера и запустим его:

sudo systemctl enable apache2 && sudo systemctl start apache2

Переходим к самой интересной части — активации модулей Apache:

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod ssl

# Модули для распределения нагрузки между бэкенд-серверами:
# sudo a2enmod proxy_balancer
# sudo a2enmod lbmethod_byrequests

Для выполнения поставленной задачки можно обойтись и без модулей proxy_balancer и lbmethod_byrequests, если не планируется создавать некое подобие кластера с бэкендом.

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

sudo systemctl restart apache2

Скопируем конфигурацию сайта по умолчанию в новый файл и назовём его exchange.conf:

sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/exchange.conf

Откроем файл:

sudo nano /etc/apache2/sites-available/exchange.conf

Удалим всё его содержимое и скопируем этот конфиг, предварительно заменив пути и метаданные на свои:

<VirtualHost *:80>
ServerAdmin admin@domain.ru
ServerName mail.domain.ru
Redirect permanent / https://mail.domain.ru/
DocumentRoot /var/www/html
</VirtualHost>

<VirtualHost *:443>
    ServerAdmin admin@domain.ru
    ServerName mail.domain.ru
    DocumentRoot /var/www/html

    ProxyPreserveHost On
    ProxyVia Full
    ProxyRequests Off
    KeepAlive On

    SSLEngine On
    SSLProxyEngine On
    SSLProxyVerify none 
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    SSLProxyCheckPeerExpire off
    SSLCertificateFile "/etc/ssl/mail/mail.crt"
    SSLCertificateKeyFile "/etc/ssl/mail/mail.key"

    <Location /owa>
        ProxyPass https://192.168.1.100/owa
        ProxyPassReverse https://192.168.1.100/owa
        SSLRequireSSL
    </Location>

    <Location /Microsoft-Server-ActiveSync>
        ProxyPass https://192.168.1.100/Microsoft-Server-ActiveSync
        ProxyPassReverse https://192.168.1.100/Microsoft-Server-ActiveSync
        SSLRequireSSL
    </Location>

    <Location /rpc>
        ProxyPass https://192.168.1.100/rpc
        ProxyPassReverse https://192.168.1.100/rpc
        SSLRequireSSL
    </Location>

    <Location /Rpc>
        ProxyPass https://192.168.1.100/Rpc
        ProxyPassReverse https://192.168.1.100/Rpc
        SSLRequireSSL
    </Location>

    <Location /Autodiscover>
        ProxyPass https://192.168.1.100/Autodiscover
        ProxyPassReverse https://192.168.1.100/Autodiscover
        SSLRequireSSL
    </Location>

    <Location /autodiscover>
        ProxyPass https://192.168.1.100/autodiscover
        ProxyPassReverse https://192.168.1.100/autodiscover
        SSLRequireSSL
    </Location>

    <Location /OAB>
        ProxyPass https://192.168.1.100/OAB
        ProxyPassReverse https://192.168.1.1005/OAB
        SSLRequireSSL
    </Location>

    <Location /ews>
        ProxyPass https://192.168.1.100/ews
        ProxyPassReverse https://192.168.1.100/ews
        SSLRequireSSL
    </Location>

    <Location /mapi>
        ProxyPass https://192.168.1.100/mapi
        ProxyPassReverse https://192.168.1.100/mapi
        SSLRequireSSL
    </Location>

</VirtualHost>

Активируем конфигурацию нового сайта:

sudo a2ensite exchange

Осталось только превратить сертификат почтового сервера формата pfx в пару cert и key.

Создадим целевую папку для файлов сертификата и перейдём в неё:

sudo mkdir /etc/ssl/mail
cd /etc/ssl/mail

Закинем в эту папку сертификат почтового сервера. В моём случае pfx файл сертификата называется mail.pfx.

Извлечём из файла mail.pfx открытый ключ сертификата с помощью утилиты openssl:

sudo openssl pkcs12 -in mail.pfx -clcerts -nokeys -out mail.crt

Далее извлечём и закрытый ключ:

sudo openssl pkcs12 -in mail.pfx -nocerts -out mail_crypt.key

И, так как закрытый ключ mail_crypt.key в обязательном порядке будет вымогать пароль при старте Apache, отбираем у него парольную защиту:

sudo openssl rsa -in mail_crypt.key -out mail.key

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

sudo systemctl restart apache2

Проверяем работу обратного прокси:

https://IP/owa

Если всё сделано правильно — Ваш внешний IP-адрес (а по идее и поддомен вида mail.domain.ru) должен будет вести на сервер с Ubuntu, а уже оттуда реверсом проксироваться к почтовому серверу.

Вероятно, придётся передобавить учётную запись в мобильном клиенте и указать в настройках пропуск неизвестных SSL/TLS сертификатов.

Разумеется, не забудьте поднять на сервере брандмауэр.