Files
reverse-proxy/README.md
T

224 lines
14 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, 1С, почтовый шлюз KSMG, ограниченный RDP (SSH через HAProxy не публикуется).
TLS: на целевых серверах используются **wildcard-сертификаты GlobalSign**; HAProxy на **443** работает в режиме **TCP + SNI** и **не терминирует** TLS — сертификаты остаются на бэкендах.
Репозиторий: [https://github.com/PTah/reverse-proxy](https://github.com/PTah/reverse-proxy)
## Клонирование на Ubuntu, обновление и доступ без постоянного ввода пароля
### Установка Git
```bash
sudo apt update
sudo apt install -y git
```
### Первое клонирование
**Публичный** репозиторий можно клонировать **без логина и пароля**:
```bash
cd ~
git clone https://github.com/PTah/reverse-proxy.git
cd reverse-proxy
```
Если репозиторий станет **приватным** или понадобятся **push**-правки с сервера, используйте один из способов ниже.
### Обновление локальной копии
```bash
cd ~/reverse-proxy
git pull origin main
```
После `git pull` снова скопируйте при необходимости файлы в `/etc/haproxy/` (см. раздел «Установка конфигурации»).
### Как не вводить логин и пароль при каждом `git pull` / `git push`
#### Способ 1: SSH-ключ (предпочтительно)
1. Создайте ключ (имя файла можно своё):
```bash
ssh-keygen -t ed25519 -C "ubuntu-haproxy" -f ~/.ssh/id_ed25519_github
```
Парольную фразу можно задать или оставить пустой (на сервере оцените риски).
2. Покажите **публичный** ключ и добавьте его в GitHub: **Settings → SSH and GPG keys → New SSH key**.
```bash
cat ~/.ssh/id_ed25519_github.pub
```
3. Проверьте доступ:
```bash
ssh -T git@github.com
```
4. Клонируйте по **SSH** (или смените URL у уже существующего клона):
```bash
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 clone` / `git pull` / `git push` по **HTTPS**. Вместо пароля нужно создать **Personal Access Token (PAT)** и вводить его там, где Git спрашивает пароль.
##### Создание классического токена (Tokens classic) — проще всего для Git
1. Войдите на **github.com** под нужным аккаунтом.
2. В правом верхнем углу откройте меню **аватара** → **Settings** (Настройки).
3. В **левой колонке** прокрутите вниз до раздела **Developer settings** (Параметры разработчика) и откройте его.
4. Выберите **Personal access tokens** → **Tokens (classic)**.
5. Нажмите **Generate new token** → **Generate new token (classic)**.
6. Заполните поля:
- **Note** — произвольное имя (например `ubuntu-haproxy-pull`), чтобы потом понимать, зачем токен.
- **Expiration** — срок действия (чем короче, тем безопаснее; для сервера часто выбирают ограниченный срок и потом перевыпускают).
- **Select scopes** — для **приватного** репозитория и `pull`/`push` включите минимум **`repo`** (полный доступ к репозиториям). Если нужен только **чтение** приватного репо, в классических токенах по-прежнему часто отмечают **`repo`**, т.к. узкого «только read» в classic нет; для **только pull** удобнее **fine-grained** (ниже).
7. Нажмите **Generate token** внизу страницы.
8. **Сразу скопируйте** строку токена (начинается часто с `ghp_…`). GitHub покажет её **один раз**; после ухода со страницы повторно не отобразит.
##### Fine-grained token (по желанию, гибче по правам)
1. Те же **Settings** → **Developer settings** → **Personal access tokens** → **Fine-grained tokens**.
2. **Generate new token**.
3. Укажите **имя**, **срок**, в блоке **Repository access** выберите «только выбранный репозиторий» **reverse-proxy** (или «все» — по политике безопасности).
4. В **Permissions** для чтения/обновления кода задайте **Contents**: Read-only или Read and write, при необходимости **Metadata**: Read.
5. Создайте токен и **скопируйте** его (формат обычно `github_pat_…`).
##### Использование PAT в Git на Ubuntu
- **Username** (логин): ваш **логин GitHub** (короткое имя пользователя), не e-mail, если Git явно просит username.
- **Password**: вставьте **целиком PAT** (не пароль от сайта).
Пример первого клонирования по HTTPS:
```bash
git clone https://github.com/PTah/reverse-proxy.git
# при запросе: Username = ваш_логин_github
# Password = вставить PAT
```
##### Чтобы не вводить PAT каждый раз
Токен хранится **в открытом виде** в `~/.git-credentials` — используйте только на **доверенных** машинах:
```bash
git config --global credential.helper store
cd ~/reverse-proxy
git pull origin main
# один раз ввести Username + PAT — дальше подставятся из файла
```
Кеш в памяти на заданное время (секунды), без постоянной записи в файл:
```bash
git config --global credential.helper 'cache --timeout=28800'
```
После истечения срока кеша или срока действия токена на GitHub снова создайте новый PAT и при необходимости обновите сохранённые учётные данные (удалите строчку с `github.com` из `~/.git-credentials` или снова выполните `git pull` и введите новый токен).
#### Способ 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 |
DNS: записи **A** для `ext`, **`autodiscover`**, `rds`, `erp`, `ksmg` (и при необходимости для RDP) должны указывать на **публичный IP** хоста с HAProxy. Имя `autodiscover.kalinamall.ru` должно быть в **SAN** wildcard `*.kalinamall.ru` или отдельно в сертификате на Exchange.
Доступ по **SSH** к внутренним хостам (например Ubuntu **192.168.160.85**) в этом репозитории **не** настраивается через HAProxy — организуйте отдельно (прямой проброс, VPN, бастион и т.д.).
В режиме **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)
Обычно этого достаточно для данного конфига:
```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` в `/etc/haproxy/haproxy.cfg`. Пример, если репозиторий лежит в домашнем каталоге:
```bash
sudo cp ~/reverse-proxy/haproxy.cfg /etc/haproxy/haproxy.cfg
```
3. Белый список IP для RDP:
```bash
sudo mkdir -p /etc/haproxy/trusted
sudo cp trusted/rdp.lst.example /etc/haproxy/trusted/rdp.lst
```
Отредактируйте `rdp.lst`: укажите свои подсети и IP (по одному адресу или CIDR на строку). Удалите заглушку `127.0.0.1/32`, когда появятся реальные адреса.
4. Проверка и перезапуск:
```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**, **3389**, **443** (и при использовании — **8404** для stats). Остальной трафик — по политике безопасности.
## Лицензия
Конфигурация поставляется как есть, без гарантий. Используйте на свой риск.