reverse-proxy

Периметровая конфигурация HAProxy для сети kalinamall.ru: Exchange, RDS, 1С, почтовый шлюз KSMG, ограниченный RDP и SSH.

TLS: на целевых серверах используются wildcard-сертификаты GlobalSign; HAProxy на 443 работает в режиме TCP + SNI и не терминирует TLS — сертификаты остаются на бэкендах.

Репозиторий: https://github.com/PTah/reverse-proxy

Клонирование на Ubuntu, обновление и доступ без постоянного ввода пароля

Установка Git

sudo apt update
sudo apt install -y git

Первое клонирование

Публичный репозиторий можно клонировать без логина и пароля:

cd ~
git clone https://github.com/PTah/reverse-proxy.git
cd reverse-proxy

Если репозиторий станет приватным или понадобятся push-правки с сервера, используйте один из способов ниже.

Обновление локальной копии

cd ~/reverse-proxy
git pull origin main

После git pull снова скопируйте при необходимости файлы в /etc/haproxy/ (см. раздел «Установка конфигурации»).

Как не вводить логин и пароль при каждом git pull / git push

Способ 1: SSH-ключ (предпочтительно)

  1. Создайте ключ (имя файла можно своё):

    ssh-keygen -t ed25519 -C "ubuntu-haproxy" -f ~/.ssh/id_ed25519_github
    

    Парольную фразу можно задать или оставить пустой (на сервере оцените риски).

  2. Покажите публичный ключ и добавьте его в GitHub: Settings → SSH and GPG keys → New SSH key.

    cat ~/.ssh/id_ed25519_github.pub
    
  3. Проверьте доступ:

    ssh -T git@github.com
    
  4. Клонируйте по SSH (или смените URL у уже существующего клона):

    git clone git@github.com:PTah/reverse-proxy.git
    # уже склонировано по HTTPS — переключение:
    # git remote set-url origin git@github.com:PTah/reverse-proxy.git
    

Дальше git pull / git push идут по SSH без пароля GitHub (при необходимости один раз вводится только passphrase ключа, если вы её задали; её можно кешировать через ssh-agent).

Способ 2: HTTPS + Personal Access Token (PAT)

GitHub не принимает обычный пароль аккаунта для Git по HTTPS; нужен токен: Settings → Developer settings → Personal access tokens.

После создания токена при git pull в качестве пароля вставляйте токен (логин — ваш логин GitHub).

Чтобы не вводить токен каждый раз, можно один раз сохранить учётные данные (токен хранится в открытом виде в ~/.git-credentials — только на доверенных машинах):

git config --global credential.helper store
# затем один раз выполнить git pull и ввести логин + PAT — дальше подставятся из файла

Более безопасный вариант — кеш на время сессии (в секундах):

git config --global credential.helper 'cache --timeout=28800'

Способ 3: только чтение, репозиторий публичный

Для публичного репозитория git clone и git pull по HTTPS учётные данные не нужны — отдельная настройка не требуется.

Соответствие имён и адресов

Служба Внешнее имя (клиенты) Внутренний хост / IP Порт снаружи
Microsoft Exchange (OWA https://ext.kalinamall.ru/owa, EWS, MAPI/HTTPS и т.д.) ext.kalinamall.ru fifth.kalinamall.ru — 192.168.160.42 443 (TCP/SNI)
Autodiscover autodiscover.kalinamall.ru тот же Exchange — 192.168.160.42 443 (TCP/SNI)
RDS rds.kalinamall.ru k6a-dc3.b26.kalinamall.ru — 192.168.160.40 443
1С erp.kalinamall.ru hp-serv.b26.kalinamall.ru — 192.168.160.150 443
Почтовый шлюз (KSMG) ksmg.kalinamall.ru ksmg.kalinamall.ru — 192.168.160.57 25
RDP (публичный IP / DNS при необходимости) itis.b26.kalinamall.ru — 192.168.160.198 3389
SSH (Ubuntu) (публичный IP) 192.168.160.85 22

DNS: записи A для ext, autodiscover, rds, erp, ksmg (и при необходимости для входа по RDP/SSH) должны указывать на публичный IP хоста с HAProxy. Имя autodiscover.kalinamall.ru должно быть в SAN wildcard *.kalinamall.ru или отдельно в сертификате на Exchange.

В режиме TCP + SNI отдельные строки в HAProxy для путей вроде /owa не нужны: после согласования TLS клиент шлёт HTTP внутри шифрования, разбор путей делает IIS/Exchange на 192.168.160.42.

Установка HAProxy на Ubuntu 24.04 (Noble)

Для этого репозитория нужен 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 в /etc/haproxy/haproxy.cfg. Пример, если репозиторий лежит в домашнем каталоге:

    sudo cp ~/reverse-proxy/haproxy.cfg /etc/haproxy/haproxy.cfg
    
  3. Списки доверенных адресов для RDP и SSH:

    sudo mkdir -p /etc/haproxy/trusted
    sudo cp trusted/rdp.lst.example /etc/haproxy/trusted/rdp.lst
    sudo cp trusted/ssh.lst.example /etc/haproxy/trusted/ssh.lst
    

    Отредактируйте rdp.lst и ssh.lst: укажите свои подсети и IP (по одному адресу или CIDR на строку). Удалите заглушку 127.0.0.1/32, когда появятся реальные адреса.

  4. Проверка и перезапуск:

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

Порты на фаерволе

Откройте с интернета только: 25, 22, 3389, 443 (и при использовании — 8404 для stats). Остальной трафик — по политике безопасности.

Лицензия

Конфигурация поставляется как есть, без гарантий. Используйте на свой риск.

S
Description
Настройка HAProxy на внешнем периметре для проброса соединений внутрь сети (Exchange Server, почта, git)
Readme 357 KiB
Languages
Shell 83.1%
PowerShell 16.9%