# 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 ```