Files
reverse-proxy/README.md
T
PTah ade8e4cafa fix(haproxy): Autodiscover на :80 и точный fail2ban для Zabbix
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/.
2026-06-20 16:58:32 +10:00

65 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# reverse-proxy
Периметровая конфигурация **HAProxy** для сети **kalinamall.ru**: Exchange, RDS (веб/шлюз по HTTPS), 1С, Git, SAC, почтовый шлюз KSMG. Прямой RDP (3389) через HAProxy не используется — клиенты идут через RDS на **443** (`rds.kalinamall.ru`).
TLS: HAProxy на **443** в режиме **TCP + SNI**, **не терминирует** TLS — сертификаты на бэкендах.
Доступ снаружи по allowlist: **Git** и **веб-SAC**`git-sac-allowed`; **RDS**`rds-allowed` (RU ipdeny + static); **1С**`1c-allowed`; **Zabbix** (HTTP) — `zabbix-allowed`; **Synology** (`heap`, `exchange`) — `syno-allowed`. **Seaca****`sac-api.kalinamall.ru`** без IP-фильтра.
Репозиторий: [https://git.kalinamall.ru/PapaTramp/reverse-proxy](https://git.kalinamall.ru/PapaTramp/reverse-proxy)
## Соответствие имён и адресов
| Служба | Внешнее имя (клиенты) | Внутренний хост / IP | Порт | Allowlist |
|--------|------------------------|----------------------|------|-----------|
| Microsoft Exchange (OWA и т.д.) | `ext.kalinamall.ru` | fifth.kalinamall.ru — **192.168.160.42** | 443 | нет |
| Autodiscover | `autodiscover.kalinamall.ru` | тот же Exchange — **192.168.160.42** | 443; **80** (HTTP Autodiscover → Exchange) | нет |
| RDS | `rds.kalinamall.ru` | k6a-dc3 — **192.168.160.40**, служба **4430** | 443 → 4430 | **`rds-allowed`** |
| 1С | `erp.kalinamall.ru` | hp-serv — **192.168.160.150** | 443 | **`1c-allowed`** |
| Git (HTTPS) | `git.kalinamall.ru` | **192.168.160.129** | 443 | **`git-sac-allowed`** |
| SAC (веб) | `sac.kalinamall.ru` | **192.168.160.145** | 443 | **`git-sac-allowed`** |
| SAC / Seaca (mobile API) | **`sac-api.kalinamall.ru`** | тот же **192.168.160.145** | 443 | **нет** |
| Zabbix (веб) | **`zabbix.kalinamall.ru`** | **192.168.160.53** | **80** (HTTP) | **`zabbix-allowed`** |
| Synology DSM | **`heap.kalinamall.ru`** | **192.168.160.185** | 443 → **5001** | **`syno-allowed`** |
| Synology DSM | **`exchange.kalinamall.ru`** | **192.168.160.35** | 443 → **5001** | **`syno-allowed`** |
| Почтовый шлюз (KSMG) | `ksmg.kalinamall.ru` | **192.168.160.57** | 25 | нет (с интернета на HAProxy не проброшен; см. [security/architecture.md](docs/security/architecture.md)) |
DNS: **A** для `ext`, `autodiscover`, `rds`, `erp`, `git`, `sac`, **`sac-api`**, **`zabbix`**, **`heap`**, **`exchange`** → публичный IP HAProxy. Inbound SMTP (**25**) с интернета на HAProxy **не** пробрасывается; `ksmg` / MX — отдельная схема (см. [security/architecture.md](docs/security/architecture.md)).
Снаружи Zabbix — **`http://zabbix.kalinamall.ru`**. Outlook при настройке почты на **`ext.kalinamall.ru`** шлёт **HTTP Autodiscover** на `:80` (`/autodiscover/autodiscover.xml`) — HAProxy проксирует на Exchange **192.168.160.42:80**, без allowlist (как HTTPS OWA). Synology DSM — **`https://heap.kalinamall.ru`**, **`https://exchange.kalinamall.ru`** (TLS на NAS, wildcard `*.kalinamall.ru`). Имя **`exchange.kalinamall.ru`** — NAS, не OWA (**`ext.kalinamall.ru`**).
### Порт 80: Zabbix и Outlook (Autodiscover)
До **0.7.8** весь `:80` обрабатывался как «только Zabbix»: любой другой `Host` (в т.ч. Autodiscover при настройке Outlook) получал **403**, fail2ban jail **`haproxy-zabbix-403`** банил IP на сутки через UFW — пользователь мог не знать про Zabbix.
С **0.7.8** frontend **`fe_http`**:
| Host / путь | Куда | Allowlist |
|-------------|------|-----------|
| `autodiscover.kalinamall.ru` | Exchange `.42:80` | нет |
| `ext.kalinamall.ru` + `/autodiscover/*` | Exchange `.42:80` | нет |
| `zabbix.kalinamall.ru` | Zabbix `.53:80` | **`zabbix-allowed`** |
| прочее | **404** (не 403) | — |
fail2ban **`haproxy-zabbix-403`**: только **403** на Zabbix с IP вне allowlist; в filter добавлен **`ignoreregex`** для `/autodiscover/`.
После деплоя на **192.168.160.117**:
```bash
sudo haproxy -c -f /etc/haproxy/haproxy.cfg && sudo systemctl reload haproxy
sudo cp ~/reverse-proxy/scripts/security/fail2ban/haproxy-zabbix-403.conf /etc/fail2ban/filter.d/
sudo fail2ban-client reload
sudo fail2ban-client set haproxy-zabbix-403 unbanip 5.143.32.177 # если ещё забанен
```
Если после **Git** в том же браузере **SAC** показывает Gitea — см. [SAC, Seaca и coalescing](docs/sac-access.md).
## Документация
- [Установка HAProxy и развёртывание конфигурации](docs/haproxy-install.md)
- [SAC: веб vs sac-api, Seaca, Git+SAC в браузере](docs/sac-access.md)
- [Работа с Git: clone, pull, push, ключи и PAT](docs/git.md)
- [Политика: Gitea — основной, GitHub — резерв без секретов](docs/repo-policy.md)
- [Let's Encrypt / ACME через HAProxy (порт 80)](docs/letsencrypt-acme.md)
- [Безопасность: UFW, бэкенды, план внедрения](docs/security/README.md)