Files
reverse-proxy/docs/haproxy-install.md
T

129 lines
7.5 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.
# Установка 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 /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 с интернета обычно открывают только то, что слушает конфиг: **25**, **80** (Zabbix HTTP), **443** (и при использовании — **8404** для stats). Остальной трафик — по политике безопасности.
Порт **80** используется для **`http://zabbix.kalinamall.ru`** (allowlist `zabbix-allowed`). Для ACME на других именах см. [letsencrypt-acme.md](letsencrypt-acme.md) — потребуется расширить `fe_http_zabbix` маршрутизацией по Host/пути.
## 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/
```
## 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`).