Перейти к содержанию

RAMBA Selective VPN Gateway

Материал из RAMBA Wiki
(перенаправлено с «RAMBA 20Selective VPN Gateway»)


RAMBA Selective VPN Gateway

RAMBA Selective VPN Gateway — шлюз селективной маршрутизации трафика на базе WireGuard + nftables + dnsmasq + HAPP/VLESS.

Система позволяет подключать мобильные устройства к домашней сети через WireGuard и отправлять через HAPP только трафик выбранных сервисов.

Остальной интернет-трафик выходит напрямую через основной маршрутизатор.

По состоянию на сентябрь 2026 года через HAPP маршрутизируются:

  • YouTube
  • Instagram
  • 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.

Instagram

Используются:

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 Работает
Instagram 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;
  • токены;
  • пароли.

Дальнейшее развитие

Возможные следующие этапы:

  1. Добавление новых сервисов через dnsmasq/nftset.
  2. Автоматическая диагностика новых destination IP.
  3. Разделение динамических nftables sets по сервисам.
  4. Статистика трафика отдельно для каждого сервиса.
  5. Web-интерфейс состояния gateway.
  6. Автоматическое тестирование HAPP-серверов.
  7. Мониторинг WireGuard-клиентов.
  8. Безопасная автоматизация добавления и удаления WireGuard-пользователей.