From fc448fd589374e0c3857f9288fb7c9180d5b5195 Mon Sep 17 00:00:00 2001 From: Andrey Lutsenko Date: Sat, 13 Jun 2026 16:54:06 +1000 Subject: [PATCH] =?UTF-8?q?feat(haproxy):=20Synology=20DSM=20heap=20=D0=B8?= =?UTF-8?q?=20exchange=20=D1=81=20allowlist=20syno-allowed=20(0.7.4).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit heap.kalinamall.ru → 192.168.160.185:5001, exchange.kalinamall.ru → 192.168.160.35:5001. --- README.md | 8 +++++--- docs/haproxy-install.md | 23 ++++++++++++++++++++++- haproxy.cfg | 24 +++++++++++++++++++++--- syno-allowed | 3 +++ 4 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 syno-allowed diff --git a/README.md b/README.md index 44ea47b..fdab8ab 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ TLS: HAProxy на **443** в режиме **TCP + SNI**, **не терминирует** TLS — сертификаты на бэкендах. -Доступ снаружи по allowlist: **Git** и **веб-SAC** (`sac.kalinamall.ru`) — файл `git-sac-allowed`; **1С** (`erp.kalinamall.ru`) — `1c-allowed`; **Zabbix** (`zabbix.kalinamall.ru`, HTTP) — `zabbix-allowed`. **Seaca** — **`sac-api.kalinamall.ru`** без IP-фильтра (аутентификация на SAC). +Доступ снаружи по allowlist: **Git** и **веб-SAC** — `git-sac-allowed`; **1С** — `1c-allowed`; **Zabbix** (HTTP) — `zabbix-allowed`; **Synology** (`heap`, `exchange`) — `syno-allowed`. **Seaca** — **`sac-api.kalinamall.ru`** без IP-фильтра. **Основной репозиторий:** [git.kalinamall.ru/PapaTramp/reverse-proxy](https://git.kalinamall.ru/PapaTramp/reverse-proxy) **Резерв (без секретов):** [github.com/PTah/reverse-proxy](https://github.com/PTah/reverse-proxy) — см. [политику репозиториев](docs/repo-policy.md) @@ -21,11 +21,13 @@ TLS: HAProxy на **443** в режиме **TCP + SNI**, **не терминир | 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 | нет | -DNS: **A** для `ext`, `autodiscover`, `rds`, `erp`, `git`, `sac`, **`sac-api`**, **`zabbix`**, `ksmg` → публичный IP HAProxy. +DNS: **A** для `ext`, `autodiscover`, `rds`, `erp`, `git`, `sac`, **`sac-api`**, **`zabbix`**, **`heap`**, **`exchange`**, `ksmg` → публичный IP HAProxy. -Снаружи Zabbix открывают как **`http://zabbix.kalinamall.ru`** (без HTTPS на бэкенде). +Снаружи Zabbix — **`http://zabbix.kalinamall.ru`**. Synology DSM — **`https://heap.kalinamall.ru`**, **`https://exchange.kalinamall.ru`** (TLS на NAS, wildcard `*.kalinamall.ru`). Имя **`exchange.kalinamall.ru`** — NAS, не OWA (**`ext.kalinamall.ru`**). Если после **Git** в том же браузере **SAC** показывает Gitea — см. [SAC, Seaca и coalescing](docs/sac-access.md). diff --git a/docs/haproxy-install.md b/docs/haproxy-install.md index d54aade..1c8966a 100644 --- a/docs/haproxy-install.md +++ b/docs/haproxy-install.md @@ -44,7 +44,7 @@ sudo haproxy -c -f /etc/haproxy/haproxy.cfg ```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 /etc/haproxy/ + sudo cp ~/reverse-proxy/git-sac-allowed ~/reverse-proxy/1c-allowed ~/reverse-proxy/zabbix-allowed ~/reverse-proxy/syno-allowed /etc/haproxy/ ``` 3. Проверка и перезапуск: @@ -84,3 +84,24 @@ sudo haproxy -c -f /etc/haproxy/haproxy.cfg ```bash curl -sI --resolve zabbix.kalinamall.ru:80:ПУБЛИЧНЫЙ_IP http://zabbix.kalinamall.ru/ ``` + +## 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. diff --git a/haproxy.cfg b/haproxy.cfg index 36fbd63..8c4dc5a 100644 --- a/haproxy.cfg +++ b/haproxy.cfg @@ -1,11 +1,11 @@ # HAProxy — периметровый reverse-proxy для kalinamall.ru -# Config version: 0.7.3 +# Config version: 0.7.4 # Режим: TCP + SNI на 443 (TLS end-to-end, сертификаты на бэкендах) # HTTP на 80: zabbix.kalinamall.ru → 192.168.160.53 (allowlist zabbix-allowed) # # Проверка синтаксиса: haproxy -c -f haproxy.cfg # Установка: скопируйте в /etc/haproxy/haproxy.cfg -# Allowlist: git-sac-allowed (git + sac веб), 1c-allowed, zabbix-allowed → /etc/haproxy/ +# Allowlist: git-sac-allowed, 1c-allowed, zabbix-allowed, syno-allowed → /etc/haproxy/ # sac-api.kalinamall.ru — без IP-фильтра (Seaca с любого адреса, auth на SAC) global @@ -26,8 +26,9 @@ defaults # ----------------------------------------------------------------------------- # HTTPS (443): маршрутизация по SNI → внутренние серверы -# ext, autodiscover (Exchange) / rds / erp / git / sac (веб) / sac-api (Seaca) +# ext, autodiscover (Exchange) / rds / erp / git / sac / sac-api / heap, exchange (Synology) # Git и sac.kalinamall.ru (веб) — allowlist git-sac-allowed +# heap.kalinamall.ru, exchange.kalinamall.ru (Synology DSM) — syno-allowed # sac-api.kalinamall.ru (мобильное API) — без allowlist # См. docs/sac-access.md — connection coalescing (git + sac на одном IP) # ----------------------------------------------------------------------------- @@ -46,18 +47,24 @@ frontend fe_https_sni acl sni_known req_ssl_sni -i git.kalinamall.ru acl sni_known req_ssl_sni -i sac.kalinamall.ru acl sni_known req_ssl_sni -i sac-api.kalinamall.ru + acl sni_known req_ssl_sni -i heap.kalinamall.ru + acl sni_known req_ssl_sni -i exchange.kalinamall.ru acl sni_git req_ssl_sni -i git.kalinamall.ru acl sni_sac_web req_ssl_sni -i sac.kalinamall.ru acl sni_erp req_ssl_sni -i erp.kalinamall.ru + acl sni_syno req_ssl_sni -i heap.kalinamall.ru + acl sni_syno req_ssl_sni -i exchange.kalinamall.ru acl src_git_sac_allowed src -f /etc/haproxy/git-sac-allowed acl src_1c_allowed src -f /etc/haproxy/1c-allowed + acl src_syno_allowed src -f /etc/haproxy/syno-allowed # tcp-request обрабатываются до use_backend — reject ставим ДО use_backend tcp-request content reject if !sni_known tcp-request content reject if sni_git !src_git_sac_allowed tcp-request content reject if sni_sac_web !src_git_sac_allowed tcp-request content reject if sni_erp !src_1c_allowed + tcp-request content reject if sni_syno !src_syno_allowed use_backend be_exchange if { req_ssl_sni -i ext.kalinamall.ru } use_backend be_exchange if { req_ssl_sni -i autodiscover.kalinamall.ru } @@ -66,6 +73,8 @@ frontend fe_https_sni use_backend be_git if { req_ssl_sni -i git.kalinamall.ru } use_backend be_sac if { req_ssl_sni -i sac.kalinamall.ru } use_backend be_sac if { req_ssl_sni -i sac-api.kalinamall.ru } + use_backend be_syno_heap if { req_ssl_sni -i heap.kalinamall.ru } + use_backend be_syno_exchange if { req_ssl_sni -i exchange.kalinamall.ru } backend be_exchange # fifth.kalinamall.ru (192.168.160.42) @@ -88,6 +97,15 @@ backend be_sac # веб sac.kalinamall.ru — только IP из git-sac-allowed; sac-api — без фильтра на frontend server sac 192.168.160.145:443 check check-ssl check-sni sac.kalinamall.ru verify none +backend be_syno_heap + # heap.kalinamall.ru → Synology DSM (192.168.160.185:5001); allowlist syno-allowed + # TLS на NAS: wildcard *.kalinamall.ru (GlobalSign); check-sni heap.kalinamall.ru + server syno_heap 192.168.160.185:5001 check check-ssl check-sni heap.kalinamall.ru verify none + +backend be_syno_exchange + # exchange.kalinamall.ru → Synology DSM (192.168.160.35:5001); не путать с ext (OWA) + server syno_exch 192.168.160.35:5001 check check-ssl check-sni exchange.kalinamall.ru verify none + # ----------------------------------------------------------------------------- # HTTP (80): Zabbix — только HTTP на бэкенде, снаружи http://zabbix.kalinamall.ru # Allowlist: /etc/haproxy/zabbix-allowed diff --git a/syno-allowed b/syno-allowed new file mode 100644 index 0000000..7cdddbd --- /dev/null +++ b/syno-allowed @@ -0,0 +1,3 @@ +5.100.81.121 +109.109.217.150 +109.110.54.2