ade8e4cafa
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/.
138 lines
8.0 KiB
Markdown
138 lines
8.0 KiB
Markdown
# Установка 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)
|
||
|
||
Обычно этого достаточно для данного конфига:
|
||
|
||
```bash
|
||
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](https://launchpad.net/~vbernat/+archive/ubuntu/haproxy-3.3) (номер микроверсии может обновляться; см. страницу PPA). Не подключайте одновременно несколько PPA с разными ветками HAProxy.
|
||
|
||
```bash
|
||
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](https://launchpad.net/~vbernat/+archive/ubuntu/haproxy-3.2), [haproxy-3.1](https://launchpad.net/~vbernat/+archive/ubuntu/haproxy-3.1), [haproxy-3.0](https://launchpad.net/~vbernat/+archive/ubuntu/haproxy-3.0), а также [haproxy-2.8](https://launchpad.net/~vbernat/+archive/ubuntu/haproxy-2.8) — всегда выбирайте **одну** строку версии.
|
||
|
||
## Проверка синтаксиса конфига
|
||
|
||
```bash
|
||
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
|
||
```
|
||
|
||
## Установка конфигурации из репозитория
|
||
|
||
1. Убедитесь, что установлен HAProxy **2.4+** (см. разделы выше).
|
||
|
||
2. Скопируйте `haproxy.cfg` и файлы allowlist в `/etc/haproxy/`. Пример, если репозиторий лежит в домашнем каталоге:
|
||
|
||
```bash
|
||
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
|
||
```
|
||
|
||
3. Проверка и перезапуск:
|
||
|
||
```bash
|
||
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](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](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](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:
|
||
|
||
```bash
|
||
curl -sI --resolve zabbix.kalinamall.ru:80:ПУБЛИЧНЫЙ_IP http://zabbix.kalinamall.ru/
|
||
```
|
||
|
||
Проверка Autodiscover (без allowlist, как Outlook):
|
||
|
||
```bash
|
||
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:
|
||
|
||
```bash
|
||
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](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** ([ipdeny `ru.zone`](https://www.ipdeny.com/ipblocks/data/countries/ru.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](https://git.kalinamall.ru/PapaTramp/Answer.and.other.shit) (`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:
|
||
|
||
```bash
|
||
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`).
|