Зачем нужна маршрутизация в VPN-клиенте
Маршрутизация (routing) — это механизм, который определяет, какой трафик должен идти через VPN-туннель, а какой — напрямую. В клиенте Happ этот функционал реализован через профили маршрутизации, которые позволяют гибко управлять доступом к сайтам и приложениям.
Основная проблема, которую решает маршрутизация, — конфликт между необходимостью использовать VPN для обхода блокировок и одновременной работой с локальными сервисами. Например, российские банковские приложения или госуслуги могут блокировать доступ с зарубежных IP-адресов. Если весь трафик идёт через VPN, такие сервисы перестают работать. Маршрутизация позволяет оставить VPN включённым, но направлять запросы к российским ресурсам напрямую, а к заблокированным — через туннель.
В Happ маршрутизация построена на основе гео-баз GeoIP и GeoSite, которые содержат списки IP-адресов и доменов, сгруппированных по категориям. Эти базы поставляются вместе с приложением и обновляются вместе с ядром. Благодаря этому клиент готов к работе сразу после установки, без необходимости вручную скачивать дополнительные файлы.
Архитектура маршрутизации в Happ децентрализована: каждая подписка (включая список серверов) имеет собственный изолированный набор правил и профилей. Это означает, что изменения в одном профиле не влияют на другие, а удаление подписки автоматически удаляет связанные с ней профили и кэшированные геофайлы.
Как работают профили маршрутизации
Профиль маршрутизации — это JSON-объект, который содержит все настройки: список правил для прямого подключения, прокси и блокировки, параметры DNS, стратегию обработки доменов и другие опции. Профиль может быть создан вручную, импортирован из ссылки или получен вместе с подпиской от провайдера.
В Happ существует несколько способов добавления профиля:
- happ://routing/add/{base64} — добавляет профиль в список, но не активирует его. Первый добавленный профиль становится активным только после успешной загрузки геофайлов.
- happ://routing/onadd/{base64} — добавляет и сразу активирует профиль, даже если другие профили уже активны.
- happ://routing/off — отключает функционал маршрутизации.
Если профиль с таким же именем уже существует, он перезаписывается. При импорте профиля, если в подписке его не было, профиль привязывается к этой подписке и начинается скачивание геофайлов.
Важная особенность: для JSON-подписок действует ограниченный режим (Restricted Mode). В нём у подписки может быть строго 0 или 1 профиль маршрутизации, который приходит только вместе с самой подпиской. Пользователь не может вручную создавать, копировать или изменять такой профиль — все настройки жёстко заблокированы. Это сделано для предотвращения рассинхронизации настроек приложения с метаданными провайдера.
Структура профиля: основные параметры
Каждый профиль маршрутизации содержит набор ключевых параметров, которые определяют его поведение. Рассмотрим их подробнее.
Name — имя профиля для идентификации. По умолчанию используется "Default".
GlobalProxy — глобальный переключатель. Если установлено true, весь трафик по умолчанию идёт через прокси (первым в списке outbound устанавливается proxy). Если false — используется прямое соединение (direct). Этот параметр также определяет «выход» по умолчанию, если ни одно правило маршрутизации не сработало.
LastUpdated — метка времени последнего изменения профиля или геофайлов. Управляет актуальностью баз GeoIP/GeoSite на устройствах. Если при сохранении профиля поле заполнено, приложение принудительно скачает геофайлы, даже если их URL совпадают со стандартными. Это позволяет инициировать принудительное обновление баз.
DomainStrategy — стратегия обработки доменов при маршрутизации:
AsIs— Xray не резолвит домены на этапе маршрутизации, передаёт их «как есть».IPIfNonMatch— сначала пытается сопоставить запрос с правилами по домену, если не находит — делает DNS-запрос и проверяет правила по IP.IPOnDemand— всегда резолвит домен в IP перед проверкой правил.
UseChunkFiles — оптимизация для iOS. Позволяет вырезать из геофайлов указанные секции и передавать ядру уже обрезанные файлы, что предотвращает падение ядра при ограничениях памяти (50 МБ). Нарезка выполняется при сохранении нового профиля с путями по умолчанию, после завершения скачивания геофайла или после выхода из редактора правил.
Настройка DNS: разделение на локальный и удалённый
DNS-запросы в Happ разделяются на два типа: локальные (Domestic) и удалённые (Remote). Это позволяет оптимизировать скорость отклика и учитывать географическое расположение ресурсов.
Удалённый DNS (Remote) используется для запросов к ресурсам, которые идут через прокси. Настраивается через параметры:
RemoteDNSType— протокол запроса: DoH (DNS over HTTPS) или DoU (DNS over UDP).RemoteDNSDomain— адрес сервера (обязателен для DoH). По умолчаниюhttps://cloudflare-dns.com/dns-query.RemoteDNSIP— статический IP-адрес сервера для исключения проблем с поиском самого DNS-сервера. По умолчанию1.1.1.1.
Локальный DNS (Domestic) используется для запросов к ресурсам, которые идут напрямую. Параметры аналогичны: DomesticDNSType, DomesticDNSDomain, DomesticDNSIP. По умолчанию используются Google DNS (https://dns.google/dns-query и 8.8.8.8).
DNS Hosts — список ручных соответствий «Домен: IP», работает как системный файл hosts. Например, можно переопределить cloudflare-dns.com на 1.1.1.1, чтобы ускорить доступ к DNS-серверу. Эти записи встраиваются напрямую в секцию dns.hosts конфигурации Xray.
FakeDNS — подмена реального IP-адреса виртуальным. Гарантирует, что все запросы направляются только в Xray, исключая их перехват системным DNS. Это полезно для обхода DNS-блокировок и повышения конфиденциальности.
Правила маршрутизации: direct, proxy, block
Трафик распределяется по трём категориям, каждая из которых задаётся списками сайтов и IP-адресов.
Direct — ресурсы, доступ к которым осуществляется напрямую, без прокси. Задаётся через DirectSites (домены) и DirectIp (IP-адреса или подсети). Обычно сюда включают частные подсети (например, 10.0.0.0/8, 192.168.0.0/16), а также гео-категории вроде geoip:ru для российских IP.
Proxy — ресурсы, требующие туннелирования. Задаётся через ProxySites и ProxyIp. Если списки пусты, а GlobalProxy установлен в true, то весь трафик, не попавший в direct или block, будет идти через прокси.
Block — запрещённые ресурсы (реклама, трекеры, нежелательные сайты). Задаётся через BlockSites и BlockIp. Трафик к таким ресурсам блокируется полностью.
Порядок проверки правил определяется параметром RouteOrder. Например, block-direct-proxy означает, что сначала проверяется блокировка, затем direct, и только потом proxy. Это позволяет гибко управлять приоритетами.
Гео-базы поддерживают специальные синтаксисы: geoip:ru, geosite:category-ru, geosite:category-gov-ru, geosite:mailru, geosite:vk и другие. Это упрощает создание правил без необходимости вручную перечислять все домены и IP.
Создание профиля через визуальный редактор
Для удобства настройки существует веб-инструмент routing.happ.su — визуальный редактор конфигурации роутинга. Он позволяет создавать профили без необходимости вручную писать JSON.
Интерфейс редактора включает:
- Поле для импорта существующей Happ-ссылки или Base64/JSON конфигурации.
- Визуальные настройки: имя профиля, глобальный прокси, порядок маршрутизации, типы DNS, списки direct/proxy/block.
- Переключатель для создания укороченных версий geofiles (экономия RAM).
- JSON-редактор с синхронизацией — изменения в визуальном режиме автоматически отражаются в JSON и наоборот.
После настройки редактор генерирует ссылку вида happ://routing/add/{base64} или happ://routing/onadd/{base64}. Эту ссылку можно передать в приложение одним из способов:
- Вставить в буфер обмена и импортировать через меню «Маршрутизация» → «Импорт профиля».
- Передать в виде HTTP-заголовка
routingили в теле подписки.
При импорте профиль сразу привязывается к подписке, в которой он пришёл. Если профиль с таким именем уже существует, он перезаписывается.
Пример конфигурации для России
Рассмотрим практический пример профиля, который решает задачу разделения трафика для российских пользователей. Такой профиль часто называют «умной маршрутизацией».
Логика работы:
- Direct: все российские IP (
geoip:ru) и частные подсети (geoip:private), а также сайтыvk.com,mail.ru,gosuslugi.ruи категорииgeosite:category-ru,geosite:category-gov-ru. - Proxy: всё остальное (так как
GlobalProxy: true, а спискиProxySitesиProxyIpпусты). - Block: ничего (списки пустые).
DNS-настройки:
- Локальный DNS: Яндекс DNS (
77.88.8.8, DoU) для российских запросов. - Удалённый DNS: Cloudflare DNS через DoH (
https://cloudflare-dns.com/dns-query, IP1.1.1.1) для прокси-запросов. - DNS Hosts: переопределение
cloudflare-dns.com→1.1.1.1иdns.google→8.8.8.8для ускорения.
Порядок маршрутизации: block-direct-proxy.
Итог: российские сервисы работают напрямую (быстро, без задержек VPN), а заблокированные и зарубежные — через VPN. VPN остаётся включённым, но не мешает работе российских сайтов.
Такой профиль можно получить, скопировав готовую ссылку happ://routing/add/... из вики-страницы или создав её через редактор routing.happ.su.
Обновление профилей и обработка ошибок
Процесс обновления профиля запускается, когда в систему поступает команда на импорт профиля с уже существующим именем. Система переводит сущность в транзитное состояние Update и начинает фоновую загрузку новых геофайлов по ссылкам из обновлённой версии.
Важно: во время загрузки состояние Current остаётся неизменным. Ядро продолжает работать со старыми правилами и старыми геофайлами, обеспечивая бесперебойную маршрутизацию. Как только все геофайлы успешно докачаны, происходит атомарная подмена: состояние Current перезаписывается новыми правилами, состояние Default обновляется, а Update помечается как завершённый.
Приложение использует менеджер загрузки геофайлов, который работает в фоновом режиме. Если загрузка не завершается в течение 3 минут, процесс останавливается. На главном экране появляется сообщение об ошибке, а рядом с проблемным профилем отображается красный восклицательный знак.
Проблемное состояние исчезает автоматически после удаления проблемного профиля. Если в списке больше нет проблемных профилей, уведомления об ошибках удаляются.
Ограничения и особенности JSON-подписок
Для JSON-конфигураций действует режим жёстких ограничений (Restricted Mode), который предотвращает рассинхронизацию настроек приложения с метаданными провайдера.
Основные ограничения:
- У JSON-подписки может быть строго 0 или 1 профиль маршрутизации.
- Профиль не может быть добавлен вручную, скопирован из другой подписки или импортирован из буфера обмена. Он приходит исключительно вместе с самой подпиской.
- Пользователь не может вручную управлять активностью такого профиля или менять его параметры. Главный тогл маршрутизации принудительно заблокирован в состоянии true (или false, если отключение прислал сам провайдер).
- Изменение имени, ссылок и самих геофайлов полностью заблокировано.
Также в JSON-подписках поля Remote DNS переименованы в Tunnel DNS (Tunnel DNS Type, Tunnel IP, Tunnel Domain) и используются локально для настройки системного туннеля, не инжектируясь в сам JSON-файл провайдера.
При использовании JSON-конфигурации важно помнить: нарезка секций (UseChunkFiles) осуществляется на основе профиля маршрутизации, а не JSON-конфигурации. Убедитесь, что в профиле маршрутизации созданы те же теги, что и в вашей JSON-конфигурации.
Практические советы по настройке
При настройке маршрутизации в Happ стоит учитывать несколько практических рекомендаций.
Начните с готового профиля. Если вы не хотите разбираться во всех параметрах, используйте готовые конфигурации, например, для России. Их можно найти в вики-сообществах или создать через редактор routing.happ.su.
Используйте категории гео-баз. Вместо ручного перечисления доменов используйте категории: geosite:category-ru, geosite:category-gov-ru, geoip:ru. Это упрощает поддержку и обновление правил.
Настройте DNS правильно. Для российских сервисов используйте локальный DNS (например, Яндекс DNS), для зарубежных — удалённый (Cloudflare или Google). Это ускорит разрешение имён и повысит стабильность.
Проверяйте порядок маршрутизации. Убедитесь, что RouteOrder соответствует вашим приоритетам. Например, block-direct-proxy сначала блокирует нежелательный трафик, затем направляет локальные ресурсы напрямую, и только потом всё остальное через прокси.
Следите за обновлениями. Регулярно обновляйте профили и геофайлы, чтобы базы GeoIP/GeoSite оставались актуальными. Используйте параметр LastUpdated для принудительного обновления.
Тестируйте изменения. После изменения профиля перезапустите соединение (Reconnect), так как изменения применяются только после перезапуска. Проверьте, что российские сервисы работают напрямую, а заблокированные — через VPN.
Вопросы и ответы
Что такое happ://routing/add/ и happ://routing/onadd/?
Это специальные ссылки для добавления профиля маршрутизации в Happ. Ссылка happ://routing/add/{base64} добавляет профиль в список, но не активирует его (первый добавленный профиль становится активным только после успешной загрузки геофайлов). Ссылка happ://routing/onadd/{base64} добавляет и сразу активирует профиль, даже если другие профили уже активны. Если профиль с таким именем уже существует, он перезаписывается.
Как настроить маршрутизацию, чтобы российские сайты работали напрямую, а заблокированные — через VPN?
Создайте профиль маршрутизации, в котором в списки Direct добавьте geoip:ru, geoip:private, а также домены и категории российских сервисов (например, geosite:category-ru, geosite:category-gov-ru, geosite:vk, geosite:mailru). Установите GlobalProxy: true, чтобы весь остальной трафик шёл через прокси. Настройте локальный DNS (например, Яндекс DNS) для прямых запросов и удалённый DNS (Cloudflare) для прокси. Порядок маршрутизации установите block-direct-proxy.
Что такое GeoIP и GeoSite базы и зачем они нужны?
GeoIP и GeoSite — это базы данных, содержащие списки IP-адресов и доменов, сгруппированных по категориям (страны, типы ресурсов и т.д.). Они используются для определения, к какой категории относится тот или иной ресурс, и позволяют автоматически применять правила маршрутизации. Например, geoip:ru включает все российские IP-адреса, а geosite:category-ru — российские сайты. Базы поставляются вместе с приложением и обновляются вместе с ядром.
Почему изменения в профиле маршрутизации не применяются сразу?
В Happ изменения любых настроек (переключение тумблера маршрутизации, выбор другого профиля) записываются в базу данных, но применяются только после перезапуска соединения (Reconnect). Это связано с архитектурой приложения: ядро продолжает работать со старыми правилами до тех пор, пока не будет выполнено переподключение. Поэтому после изменения профиля обязательно выполните Reconnect.
Что делать, если при загрузке геофайлов возникает ошибка?
Если загрузка геофайлов не завершается в течение 3 минут, процесс останавливается, на главном экране появляется сообщение об ошибке, а рядом с проблемным профилем отображается красный восклицательный знак. Проблемное состояние исчезает автоматически после удаления проблемного профиля. Если в списке больше нет проблемных профилей, уведомления об ошибках удаляются. Попробуйте удалить проблемный профиль и добавить его заново, либо проверьте интернет-соединение.
Можно ли вручную изменить профиль маршрутизации для JSON-подписки?
Нет. Для JSON-конфигураций действует режим жёстких ограничений (Restricted Mode). У JSON-подписки может быть строго 0 или 1 профиль маршрутизации, который приходит только вместе с самой подпиской. Пользователь не может вручную создавать, копировать или изменять такой профиль. Главный тогл маршрутизации принудительно заблокирован, а изменение имени, ссылок и геофайлов полностью запрещено.