122 lines
2.9 KiB
Markdown
122 lines
2.9 KiB
Markdown
# vds haproxy + wireguard + ipvs
|
|
|
|
L4 балансировщик и шлюз для распределения tcp/udp сервисов во внутреннюю сеть через wireguard с использованием haproxy, ipvs и nftables.
|
|
|
|
## Архитектура
|
|
|
|
- Вход: публичные порты vds
|
|
- tcp → haproxy
|
|
- udp / спец. tcp → nftables (`fwmark`) → `ipvs`
|
|
- Транспорт → wireguard (`wg0`)
|
|
- NAT → netmap (1:1 подсети)
|
|
|
|
## Компоненты
|
|
|
|
### haproxy (tcp)
|
|
|
|
Работает в `mode tcp`, проксирует с поддержкой `proxy-protocol`:
|
|
|
|
| Порт | Сервис | Backend |
|
|
| --- | --- | --- |
|
|
| 80 | HTTP | 10.x.102.3:81 |
|
|
| 443 | HTTPS | 10.x.102.3:444 |
|
|
| 22 | Gitea SSH | 10.x.103.3:22 |
|
|
| 24444 | MCSManager | 10.x.103.3:24445 |
|
|
|
|
### xmpp (prosody)
|
|
|
|
Прямой tcp проброс:
|
|
|
|
| Порт | Сервис |
|
|
| --- | --- |
|
|
| 5222, 5223 | client |
|
|
| 5269 | server |
|
|
| 5000 | proxy65 |
|
|
| 5270 | components |
|
|
| 5280 | BOSH |
|
|
|
|
---
|
|
|
|
## wireguard
|
|
|
|
- Интерфейс: `wg0`
|
|
- Подсеть: `10.x.200.0/24`
|
|
|
|
#### Функции:
|
|
|
|
- транспорт между узлами
|
|
- запуск `nftables` и `ipvs`
|
|
- включение `ip_forward` и `conntrack`
|
|
|
|
## ipvs (fwmark)
|
|
|
|
Балансировка по меткам:
|
|
|
|
| Марка | Сервис | Backend |
|
|
| --- | --- | --- |
|
|
| 10 | coturn | 10.x.103.10 |
|
|
| 20 | minecraft | 10.x.104.3 |
|
|
| 30 | steam/valheim | 10.x.104.4 |
|
|
| 40 | rustdesk | 10.x.200.1 |
|
|
|
|
Алгоритм: `rr`
|
|
|
|
|
|
## nftables
|
|
|
|
### prerouting
|
|
|
|
Классификация трафика:
|
|
|
|
- wireguard (51820) → accept
|
|
- coturn → mark 10
|
|
- minecraft → mark 20
|
|
- steam / valheim → mark 30
|
|
- rustdesk → mark 40
|
|
- nat (postrouting)
|
|
|
|
1:1 netmap через **wg0**:
|
|
|
|
```bash
|
|
10.x.0.0/24 → 10.x.100.0/24
|
|
10.x.1.0/24 → 10.x.101.0/24
|
|
10.x.2.0/24 → 10.x.102.0/24
|
|
10.x.3.0/24 → 10.x.103.0/24
|
|
10.x.4.0/24 → 10.x.104.0/24
|
|
10.x.5.0/24 → 10.x.105.0/24
|
|
192.x.x.0/24 → 10.x.200.0/24
|
|
```
|
|
|
|
## Поток трафика
|
|
1. Клиент → vds
|
|
2. haproxy (tcp) или nftables (udp/marked tcp)
|
|
3. Проставление `fwmark`
|
|
4. ipvs → выбор backend
|
|
5. SNAT (netmap) → wireguard
|
|
6. Доставка в целевую подсеть
|
|
|
|
## Цикл жизни
|
|
|
|
### PostUp
|
|
- загрузка модулей: `ip_vs`, `nf_conntrack`
|
|
- включение `ip_forward`
|
|
- применение `nftables`
|
|
- настройка `ipvs` (`fwmark rules`)
|
|
|
|
### PostDown
|
|
- очистка `ipvs`
|
|
- удаление таблицы `nftables`
|
|
|
|
## Особенности
|
|
- Используется `proxy-protocol` для реального ip
|
|
- udp балансируется через `ipvs`
|
|
- Сегментация через netmap (жёсткое соответствие подсетей)
|
|
- Все сервисы заходят через одну точку (vds)
|
|
|
|
## Зависимости
|
|
|
|
```bash
|
|
apt update
|
|
apt install ipvsadm ufw haproxy wireguard-tools
|
|
```
|