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

7.7 KiB
Raw Blame History

Установка 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

Установка конфигурации из репозитория

  1. Убедитесь, что установлен HAProxy 2.4+ (см. разделы выше).

  2. Скопируйте 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 /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. Проверка и перезапуск:

    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). Остальной трафик — по политике безопасности.

Полный план: docs/security/README.md — UFW, бэкенды, чеклист, скрипты scripts/security/.

Порт 80 используется для http://zabbix.kalinamall.ru (allowlist zabbix-allowed). Для ACME на других именах см. 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.

Zabbix

  • zabbix.kalinamall.ruHTTP на порту 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/

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 (ipdeny 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 (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).