RAMBA Selective VPN Gateway: различия между версиями
Artem (обсуждение | вклад) Новая страница: «{{DISPLAYTITLE:RAMBA Selective VPN Gateway}} = RAMBA Selective VPN Gateway = '''RAMBA Selective VPN Gateway''' — шлюз селективной маршрутизации трафика на базе '''WireGuard + nftables + dnsmasq + HAPP/VLESS'''. Система позволяет подключать мобильные устройства к домашней сети через WireGuard и отправлять через HAPP только тра...» |
Artem (обсуждение | вклад) м Artem переименовал страницу RAMBA 20Selective VPN Gateway в RAMBA Selective VPN Gateway |
(нет различий)
| |
Текущая версия от 00:10, 11 сентября 2026
RAMBA Selective VPN Gateway
RAMBA Selective VPN Gateway — шлюз селективной маршрутизации трафика на базе WireGuard + nftables + dnsmasq + HAPP/VLESS.
Система позволяет подключать мобильные устройства к домашней сети через WireGuard и отправлять через HAPP только трафик выбранных сервисов.
Остальной интернет-трафик выходит напрямую через основной маршрутизатор.
По состоянию на сентябрь 2026 года через HAPP маршрутизируются:
- YouTube
- Telegram
- OpenAI / ChatGPT
Discord тестировался, однако был исключён из селективной маршрутизации из-за проблем с голосовым UDP-трафиком.
Архитектура
Основная схема:
INTERNET
|
Public IP / Router
|
UDP 51821 -> 51820
|
v
+---------------------+
| CT103 vpn-gateway |
| 192.168.1.53 |
| |
| WireGuard |
| dnsmasq |
| nftables |
| policy routing |
+----------+----------+
|
+-----------+-----------+
| |
обычный трафик выбранный трафик
| |
v v
192.168.1.1 192.168.1.52
основной роутер |
v
+--------------------+
| CT502 happ-gateway |
| HAPP / VLESS |
+---------+----------+
|
v
VPN
Клиент WireGuard использует:
10.20.0.0/24
Адрес шлюза:
10.20.0.1
Компоненты
| Компонент | Адрес | Назначение |
|---|---|---|
| CT103 vpn-gateway | 192.168.1.53 | WireGuard, DNS, nftables, selective routing |
| CT502 happ-gateway | 192.168.1.52 | HAPP/VLESS VPN gateway |
| Основной маршрутизатор | 192.168.1.1 | Обычный выход в Интернет |
| WireGuard | 10.20.0.1/24 | VPN-сеть клиентов |
WireGuard
WireGuard работает внутри LXC-контейнера CT103.
Основной интерфейс:
wg0
Адрес:
10.20.0.1/24
Порт WireGuard внутри сети:
UDP 51820
На внешнем маршрутизаторе настроен проброс:
WAN UDP 51821
|
v
192.168.1.53:51820
Клиенты используют:
AllowedIPs = 0.0.0.0/0 DNS = 10.20.0.1
Таким образом весь IPv4-трафик клиента сначала поступает на vpn-gateway, а уже там принимается решение о дальнейшем маршруте.
Принцип селективной маршрутизации
Для выбранного трафика устанавливается:
fwmark 0x1
На CT103 существует отдельная таблица маршрутизации:
table 200
Правило:
100: from all fwmark 0x1 lookup 200
Таблица 200:
default via 192.168.1.52 dev eth0 192.168.1.0/24 dev eth0 scope link src 192.168.1.53
Таким образом:
без mark | v 192.168.1.1 | v обычный Интернет mark 0x1 | v table 200 | v 192.168.1.52 | v HAPP
nftables
Основной конфигурационный файл:
/etc/nftables.conf
Актуальная логика:
table ip selective {
set happ_ipv4 {
type ipv4_addr
}
set telegram_ipv4 {
type ipv4_addr
flags interval
elements = {
91.108.4.0/22,
91.108.8.0/22,
91.108.12.0/22,
91.108.16.0/22,
91.108.56.0/22,
149.154.160.0/20
}
}
chain prerouting {
type filter hook prerouting priority mangle;
policy accept;
iifname "wg0" ip daddr @telegram_ipv4 \
counter meta mark set 0x1
iifname "wg0" ip daddr @happ_ipv4 \
counter meta mark set 0x1
}
}
Набор:
happ_ipv4
заполняется динамически через dnsmasq.
Telegram использует отдельный статический набор IP-сетей, поскольку мобильное приложение может устанавливать MTProto-соединения непосредственно с IP-адресами Telegram.
DNS-based routing
На CT103 работает dnsmasq.
WireGuard-клиенты используют:
DNS = 10.20.0.1
Конфигурация:
/etc/dnsmasq.d/wireguard.conf
Пример:
interface=wg0
listen-address=10.20.0.1
bind-dynamic
no-resolv
server=1.1.1.1
server=1.0.0.1
cache-size=2000
Домены сервисов находятся в:
/etc/dnsmasq.d/happ-domains.conf
При DNS-разрешении IP-адрес автоматически добавляется в nftables set:
ip selective happ_ipv4
После этого трафик WireGuard-клиента к этому IP получает mark 0x1.
YouTube
Для YouTube используются:
nftset=/youtube.com/4#ip#selective#happ_ipv4
nftset=/youtu.be/4#ip#selective#happ_ipv4
nftset=/googlevideo.com/4#ip#selective#happ_ipv4
nftset=/ytimg.com/4#ip#selective#happ_ipv4
nftset=/youtubei.googleapis.com/4#ip#selective#happ_ipv4
nftset=/ggpht.com/4#ip#selective#happ_ipv4
Особенно важен:
googlevideo.com
так как через него передаётся значительная часть видеопотока YouTube.
Используются:
nftset=/instagram.com/4#ip#selective#happ_ipv4
nftset=/cdninstagram.com/4#ip#selective#happ_ipv4
nftset=/fbcdn.net/4#ip#selective#happ_ipv4
Следует учитывать, что fbcdn.net является общей инфраструктурой Meta.
Поэтому некоторые ресурсы других сервисов Meta также могут попасть через HAPP.
Telegram
Одних DNS-правил для Telegram оказалось недостаточно.
Telegram может подключаться непосредственно к IP-адресам дата-центров.
Поэтому используется статический nftables set:
set telegram_ipv4 {
type ipv4_addr
flags interval
elements = {
91.108.4.0/22,
91.108.8.0/22,
91.108.12.0/22,
91.108.16.0/22,
91.108.56.0/22,
149.154.160.0/20
}
}
Трафик маркируется:
iifname "wg0" ip daddr @telegram_ipv4 \
counter meta mark set 0x1
Работа правила проверяется счётчиком:
nft list chain ip selective prerouting
OpenAI / ChatGPT
Для OpenAI используется DNS-based routing.
Основные правила:
nftset=/chatgpt.com/4#ip#selective#happ_ipv4
nftset=/openai.com/4#ip#selective#happ_ipv4
nftset=/auth.openai.com/4#ip#selective#happ_ipv4
nftset=/oaistatic.com/4#ip#selective#happ_ipv4
nftset=/oaiusercontent.com/4#ip#selective#happ_ipv4
nftset=/oaistatsig.com/4#ip#selective#happ_ipv4
nftset=/openaimerge.com/4#ip#selective#happ_ipv4
При тестировании мобильного приложения ChatGPT после очистки набора:
nft flush set ip selective happ_ipv4
DNS-запросы приложения снова заполняли happ_ipv4, а счётчик правила селективной маршрутизации увеличивался при отправке сообщений.
Таким образом работа ChatGPT через HAPP была подтверждена непосредственно трафиком WireGuard-клиента.
Discord
Discord первоначально был добавлен в DNS-based routing.
Тестировались домены:
discord.com discordapp.com discordapp.net discordcdn.com discord.gg discord.media
Обычный HTTPS-трафик успешно попадал в happ_ipv4.
При тестировании голосового соединения были обнаружены отдельные UDP endpoints.
Примеры:
155.212.196.192 155.212.204.196
Был создан экспериментальный набор:
discord_voice_ipv4
и голосовой трафик начал попадать под mark 0x1.
Однако при реальном голосовом соединении наблюдались проблемы:
- очень небольшой объём трафика попадал под статическое правило;
- voice endpoint мог изменяться;
- входящий голос практически отсутствовал;
- маршрутизация двух отдельных IP не обеспечивала стабильную работу Discord Voice.
Поэтому эксперимент был отменён.
Текущее состояние: Discord полностью исключён из selective routing.
Discord проходит обычным маршрутом:
Android | WireGuard | CT103 vpn-gateway | 192.168.1.1 | Internet
Это решение принято намеренно, чтобы не нарушать работу голосовых каналов.
HAPP Gateway
CT502:
192.168.1.52
работает как отдельный VLESS/HAPP gateway.
Используется TUN-интерфейс:
thapp
пример адреса:
198.18.0.1/30
HAPP создаёт отдельную таблицу маршрутизации:
table 100
Для корректного возврата трафика WireGuard необходимо сохранить маршруты:
ip route replace table 100 \
192.168.1.0/24 dev eth0 src 192.168.1.52
ip route replace table 100 \
10.20.0.0/24 via 192.168.1.53 dev eth0
Иначе широкое правило:
192.168.0.0/16
может отправить обратный трафик WireGuard-клиента не в CT103.
HAPP Auto Selector
На CT502 работает автоматический выбор HAPP-сервера.
Скрипт:
/usr/local/sbin/happ-autoselect.sh
Он выполняет реальные HTTP-запросы через тестовый HAPP proxy и сравнивает время ответа нескольких стран.
Тестовые порты:
SOCKS 12080 HTTP 12081
Для каждого сервера выполняется несколько запросов и используется медианное значение времени ответа.
Переключение производится только при достаточно заметном улучшении, чтобы избежать постоянного переключения между близкими по скорости серверами.
Проверка выполняется systemd timer:
happ-autoselect.timer
Проверка состояния
WireGuard
systemctl is-active wg-quick@wg0
wg show
nftables
systemctl is-active nftables
nft list chain ip selective prerouting
DNS
systemctl is-active dnsmasq
dnsmasq --test
Dynamic HAPP set
nft list set ip selective happ_ipv4
Очистить набор для диагностики:
nft flush set ip selective happ_ipv4
После открытия нужного приложения набор должен заполниться снова.
Policy routing
ip rule show
ip route show table 200
Ожидается:
100: from all fwmark 0x1 lookup 200
и:
default via 192.168.1.52 dev eth0
Проверка конкретного адреса
Обычный маршрут:
ip route get 1.1.1.1
Маршрут с HAPP mark:
ip route get 1.1.1.1 mark 1
Второй запрос должен использовать:
table 200 via 192.168.1.52
Диагностика трафика
Трафик конкретного WireGuard-клиента можно наблюдать:
tcpdump -ni wg0 host 10.20.0.2
HTTPS:
tcpdump -ni wg0 'host 10.20.0.2 and port 443'
UDP:
tcpdump -ni wg0 'host 10.20.0.2 and udp'
DNS и HTTPS одновременно:
tcpdump -ni wg0 \
'host 10.20.0.2 and (port 53 or port 443)'
Это основной способ поиска сервисов, которые используют дополнительные CDN, UDP endpoints или прямые IP-соединения.
Автозапуск
После перезагрузки CT103 должны быть активны:
systemctl is-active nftables
systemctl is-active dnsmasq
systemctl is-active wg-quick@wg0
systemctl is-active selective-routing
Ожидаемый результат:
active active active active
Сервис selective routing:
selective-routing.service
восстанавливает:
- маршрут локальной сети в table 200;
- default route через CT502;
- правило fwmark 0x1.
Итоговая схема маршрутизации
WireGuard Client
10.20.0.x
|
v
CT103 vpn-gateway
|
+--------------------------------------+
| |
| обычный destination | selected destination
| |
v v
192.168.1.1 nftables mark 0x1
| |
| v
| table 200
| |
| v
| 192.168.1.52
| |
| v
| HAPP/VLESS
| |
+------------------+-------------------+
|
v
Internet
Текущее состояние
| Сервис | Маршрут | Метод | Статус |
|---|---|---|---|
| YouTube | HAPP | DNS / nftset | Работает |
| HAPP | DNS / nftset | Работает | |
| Telegram | HAPP | Статические IP-сети + DNS | Работает |
| ChatGPT / OpenAI | HAPP | DNS / nftset | Работает |
| Discord | Direct WAN | Исключён из selective routing | Голос через HAPP отключён |
| Остальной трафик | Direct WAN | Main routing table | Работает |
Безопасность
Закрытые ключи WireGuard не должны публиковаться в Wiki, Git или конфигурационных примерах.
В документации допускается указывать:
- IP-адреса;
- порты;
- имена интерфейсов;
- публичные ключи при необходимости;
- архитектуру сети.
Не следует публиковать:
- WireGuard PrivateKey;
- API keys;
- HAPP/VLESS credentials;
- токены;
- пароли.
Дальнейшее развитие
Возможные следующие этапы:
- Добавление новых сервисов через dnsmasq/nftset.
- Автоматическая диагностика новых destination IP.
- Разделение динамических nftables sets по сервисам.
- Статистика трафика отдельно для каждого сервиса.
- Web-интерфейс состояния gateway.
- Автоматическое тестирование HAPP-серверов.
- Мониторинг WireGuard-клиентов.
- Безопасная автоматизация добавления и удаления WireGuard-пользователей.