Outlook при настройке ext.kalinamall.ru слал GET /autodiscover/autodiscover.xml на порт 80; старый fe_http_zabbix отвечал 403 всем не-zabbix Host, fail2ban банил клиента на сутки. fe_http проксирует Autodiscover на Exchange :80, 403 только для zabbix вне allowlist, ignoreregex для /autodiscover/.
8.0 KiB
Установка HAProxy и развёртывание конфигурации
Для этого репозитория нужен HAProxy не ниже 2.4. Конструкции req_ssl_sni и tcp-request content accept (разбор ClientHello для SNI в TCP-режиме) входят в штатные сборки 2.8.x из Ubuntu 24.04 и во все актуальные ветки 3.x.
Вариант 1: пакет из репозитория Ubuntu (HAProxy 2.8.x)
Обычно этого достаточно для данного конфига:
sudo apt update
sudo apt install -y haproxy
haproxy -v
Проверьте, что версия 2.4+ (на Noble обычно 2.8.x).
Вариант 2: последняя ветка 3.x (PPA Vincent Bernat)
Актуальные пакеты HAProxy 3.3.x для Noble публикуются в PPA vbernat/haproxy-3.3 (номер микроверсии может обновляться; см. страницу PPA). Не подключайте одновременно несколько PPA с разными ветками HAProxy.
sudo apt update
sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:vbernat/haproxy-3.3
sudo apt update
sudo apt install -y haproxy
haproxy -v
sudo systemctl enable --now haproxy
Другие ветки того же автора (при необходимости): haproxy-3.2, haproxy-3.1, haproxy-3.0, а также haproxy-2.8 — всегда выбирайте одну строку версии.
Проверка синтаксиса конфига
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
Установка конфигурации из репозитория
-
Убедитесь, что установлен HAProxy 2.4+ (см. разделы выше).
-
Скопируйте
haproxy.cfgи файлы allowlist в/etc/haproxy/. Пример, если репозиторий лежит в домашнем каталоге:sudo cp ~/reverse-proxy/haproxy.cfg /etc/haproxy/haproxy.cfg sudo cp ~/reverse-proxy/git-sac-allowed ~/reverse-proxy/1c-allowed ~/reverse-proxy/zabbix-allowed ~/reverse-proxy/syno-allowed ~/reverse-proxy/rds-allowed-static ~/reverse-proxy/stats-allowed /etc/haproxy/ sudo install -m 0755 ~/reverse-proxy/scripts/haproxy-rds-allowed-deploy.sh ~/reverse-proxy/scripts/haproxy_ru_ipdeny_lib.sh /usr/local/bin/ sudo /usr/local/bin/haproxy-rds-allowed-deploy.sh sudo cp ~/reverse-proxy/scripts/haproxy-rds-allowed.cron /etc/cron.d/haproxy-rds-allowed -
Проверка и перезапуск:
sudo haproxy -c -f /etc/haproxy/haproxy.cfg sudo systemctl reload haproxy
Проверка ssl verify none на бэкендах
В backend для 443 указано ssl verify none, чтобы health-check и при необходимости установка соединения не ломались на внутренних именах/SAN. Если вы выпустите внутренние доверенные CA и зададите их в системе, можно включить проверку (verify required + ca-file).
Порты на фаерволе
На хосте с HAProxy с интернета (MikroTik DNAT) доступны только 80 (Zabbix HTTP) и 443. Порт 25 в конфиге есть, но с периметра не проброшен. Остальной трафик — по политике безопасности.
Полный план: docs/security/README.md — UFW, бэкенды, чеклист, скрипты scripts/security/.
Порт 80: fe_http — Exchange Autodiscover (autodiscover, ext + /autodiscover/*) и http://zabbix.kalinamall.ru (allowlist zabbix-allowed). Для ACME на других именах см. letsencrypt-acme.md.
SAC и Seaca (sac-api)
- Веб-SAC:
sac.kalinamall.ru— IP изgit-sac-allowed - Seaca (Android):
sac-api.kalinamall.ru— без allowlist; добавьте A-запись на тот же IP HAProxy - На nginx SAC (192.168.160.145):
server_name sac.kalinamall.ru sac-api.kalinamall.ru;
Подробнее: sac-access.md.
Zabbix
zabbix.kalinamall.ru— HTTP на порту 80 (бэкенд 192.168.160.53:80, без TLS)- Снаружи:
http://zabbix.kalinamall.ru, неhttps:// - IP-allowlist:
zabbix-allowed(какgit-sac-allowed) - DNS: A
zabbix.kalinamall.ru→ публичный IP HAProxy
Проверка с allowlist IP:
curl -sI --resolve zabbix.kalinamall.ru:80:ПУБЛИЧНЫЙ_IP http://zabbix.kalinamall.ru/
Проверка Autodiscover (без allowlist, как Outlook):
curl -sI --resolve autodiscover.kalinamall.ru:80:ПУБЛИЧНЫЙ_IP http://autodiscover.kalinamall.ru/autodiscover/autodiscover.xml
# ожидается не 403 (обычно 301/302 на HTTPS или 401 от Exchange)
Synology DSM (heap, exchange)
| Имя | NAS | Порт DSM |
|---|---|---|
heap.kalinamall.ru |
192.168.160.185 | 5001 (HTTPS) |
exchange.kalinamall.ru |
192.168.160.35 | 5001 (HTTPS) |
- Снаружи:
https://heap.kalinamall.ru,https://exchange.kalinamall.ru(TCP passthrough, TLS на Synology) - IP-allowlist:
syno-allowed - На NAS: сертификат
*.kalinamall.ru(GlobalSign) и соответствующее имя в Панель управления → Безопасность → Сертификат exchange.kalinamall.ru— Synology, не Microsoft Exchange (ext.kalinamall.ru)
Проверка с allowlist IP:
curl -kI --resolve heap.kalinamall.ru:443:ПУБЛИЧНЫЙ_IP https://heap.kalinamall.ru/
curl -kI --resolve exchange.kalinamall.ru:443:ПУБЛИЧНЫЙ_IP https://exchange.kalinamall.ru/
При HTTP/2 coalescing в Chromium см. sac-access.md — отдельная вкладка или http2 off на других бэкендах с тем же wildcard.
RDS (rds.kalinamall.ru)
rds.kalinamall.ru— RD Gateway / RD Web, бэкенд 192.168.160.40:4430- IP-allowlist:
rds-allowed— объединение RU CIDR (ipdenyru.zone) иrds-allowed-static(фиксированные IP вне RU или исключения) - Обновление списка:
/usr/local/bin/haproxy-rds-allowed-deploy.sh(+haproxy_ru_ipdeny_lib.shрядом), cron ежедневно в 01:00 (/etc/cron.d/haproxy-rds-allowed) - Источник логики: Answer.and.other.shit/scripts/mikrotik-ru-ipdeny (
mikrotik-649-ru-ipdeny-deploy.sh), зонаru.zone, минимум 8000 подсетей - Лог деплоя:
/var/log/haproxy-rds-allowed-deploy.log, syslog:haproxy-rds-allowed-deploy
Добавить постоянный IP/CIDR вручную — правка /etc/haproxy/rds-allowed-static (и копия в репозитории rds-allowed-static), затем запуск deploy-скрипта.
Проверка с allowlist IP:
curl -kI --resolve rds.kalinamall.ru:443:ПУБЛИЧНЫЙ_IP https://rds.kalinamall.ru/
Примечание: VPN в LAN (192.168.160.0/24) обходит HAProxy; allowlist действует только на вход через периметр (443, SNI rds.kalinamall.ru).