Зачем нужна маршрутизация в VPN-клиенте
Обычный VPN-клиент направляет весь трафик через прокси-сервер. Это создаёт проблемы, когда часть сайтов блокирует доступ с зарубежных IP-адресов. Российские банки, госуслуги и некоторые медиаресурсы могут работать нестабильно или вовсе отказывать в доступе, если ваш IP выглядит иностранным. Постоянно включать и выключать VPN неудобно, а забывчивость приводит к тому, что нужный сервис оказывается недоступен в самый ответственный момент.
Маршрутизация решает эту проблему, разделяя трафик на категории. Одни ресурсы идут напрямую, минуя VPN, другие — через прокси. В результате VPN остаётся включённым, но работает «умно»: российские сервисы открываются быстро и без задержек, а заблокированные или зарубежные сайты — через защищённое соединение. Такой подход называют split tunneling или умным туннелированием.
В клиенте Happ маршрутизация реализована через профили, которые содержат правила распределения трафика, настройки DNS и списки сайтов и IP-адресов. Профили можно создавать вручную, импортировать по ссылке или получать вместе с подпиской от провайдера. Понимание того, как устроены эти профили, позволяет гибко настраивать поведение VPN под свои задачи.
Как устроены профили маршрутизации в Happ
Профиль маршрутизации — это JSON-объект, который содержит все параметры, определяющие логику обработки трафика. Он включает имя профиля, флаг глобального проксирования, порядок проверки правил, настройки DNS, списки сайтов и IP-адресов для прямого подключения, проксирования и блокировки, а также дополнительные параметры, такие как стратегия работы с доменами и использование оптимизированных геофайлов.
Профиль по умолчанию имеет имя Default и содержит базовые настройки, которые используются, если какой-то параметр отсутствует или указан некорректно. При импорте профиля с уже существующим именем его данные обновляются. Если в профиле указана дата последнего обновления в формате Unix и она больше предыдущей, происходит принудительное обновление геофайлов.
Важно понимать, что в Happ маршрутизация децентрализована: каждая подписка (включая список серверов) имеет собственный изолированный набор правил и профилей. Это означает, что изменения в одном профиле не влияют на другие. При удалении подписки каскадно удаляются все связанные с ней профили и кэшированные геофайлы.
Основные параметры профиля: GlobalProxy и RouteOrder
Параметр GlobalProxy определяет, куда направляется трафик, если ни одно правило маршрутизации не сработало. Если он установлен в true, весь трафик по умолчанию идёт через прокси (первым в списке outbound становится прокси). Если false — используется прямое соединение. Это базовый переключатель, который задаёт поведение «по умолчанию».
Параметр RouteOrder задаёт порядок проверки правил. Трафик последовательно сравнивается с правилами из списка, и как только найдено совпадение, применяется соответствующее действие. Например, порядок block-proxy-direct означает, что сначала проверяются правила блокировки, затем проксирования, и только потом — прямого подключения. Если ни одно правило не подошло, трафик направляется в основной выход, определённый параметром GlobalProxy.
Правильная настройка порядка критически важна. Если поставить direct первым, то все сайты, которые должны идти через прокси, могут случайно попасть в прямое подключение, если их домен совпадёт с правилом direct. Рекомендуется сначала проверять блокировки, затем прокси, и только потом direct, чтобы избежать случайного обхода VPN для ресурсов, которые должны быть заблокированы или проксированы.
Настройка DNS: разделение на локальные и удалённые запросы
DNS-запросы в Happ разделяются на два типа: локальные (Domestic) и удалённые (Remote). Локальный DNS используется для запросов ресурсов, которые идут напрямую (direct), а удалённый — для запросов через прокси. Это позволяет оптимизировать скорость и учитывать географическое расположение ресурсов.
Для каждого типа DNS можно указать протокол: DoH (DNS over HTTPS) или DoU (DNS over UDP). Для DoH обязательно указывается домен сервера, например https://cloudflare-dns.com/dns-query. Для DoU достаточно IP-адреса. Также можно задать статический IP-адрес DNS-сервера, чтобы исключить проблемы с поиском самого DNS-сервера.
В профиле есть параметр DnsHosts — список ручных соответствий «домен: IP», который работает как системный файл hosts. Это удобно для переопределения адресов DNS-серверов или других доменов. Например, можно указать "cloudflare-dns.com": "1.1.1.1", чтобы гарантированно использовать нужный IP. Параметр FakeDNS включает подмену реального IP-адреса виртуальным, что гарантирует, что все запросы направляются только в Xray и обрабатываются строго согласно конфигурации.
Списки сайтов и IP-адресов: Direct, Proxy, Block
Трафик распределяется по трём категориям: прямое подключение (direct), проксирование (proxy) и блокировка (block). Для каждой категории можно задать списки сайтов (доменов) и IP-адресов. Списки могут содержать как конкретные домены, так и гео-категории, например geosite:category-ru или geoip:ru.
Гео-базы geoip.dat и geosite.dat содержат обширные списки IP-адресов и доменов, сгруппированных по странам и категориям. По умолчанию используются файлы из репозитория Loyalsoldier/v2ray-rules-dat. Эти базы можно обновлять, указывая новые URL в параметрах Geoipurl и Geositeurl.
Пример настройки для России: в DirectSites можно добавить geosite:category-ru, geosite:category-gov-ru, geosite:mailru, geosite:vk, а в DirectIp — geoip:ru и geoip:private. Это обеспечит прямой доступ к российским сервисам, а всё остальное пойдёт через прокси, если GlobalProxy установлен в true.
Продвинутые параметры: DomainStrategy и UseChunkFiles
Параметр DomainStrategy определяет, как Xray сопоставляет домены с правилами IP. Вариант AsIs означает, что Xray не пытается резолвить домен на этапе маршрутизации и передаёт его «как есть». IPIfNonMatch сначала пытается сопоставить запрос с правилами по домену, и если подходящего правила нет, делает DNS-запрос и проверяет правила по IP. IPOnDemand всегда резолвит домен в IP перед проверкой правил. Выбор стратегии влияет на скорость и точность маршрутизации.
Параметр UseChunkFiles позволяет вырезать из геофайлов указанные секции и передавать ядру уже обрезанные файлы. Это особенно полезно для устройств с ограниченной памятью, например iOS (лимит 50 МБ). Нарезка выполняется при сохранении нового профиля с путями по умолчанию, после завершения скачивания геофайла или после выхода из редактора правил, если в них были внесены изменения.
Важно: если вы используете JSON-конфигурацию подписки, нарезка секций осуществляется на основе профиля маршрутизации, а не JSON-конфигурации. Убедитесь, что в профиле маршрутизации созданы те же теги, что и в вашей JSON-конфигурации, иначе правила могут не работать корректно.
Импорт и обновление профилей: ссылки и ограничения
Профили маршрутизации можно добавлять автоматически с помощью специальных ссылок, которые создаются на сайте routing.happ.su. Ссылки имеют формат happ://routing/add/{base64} — добавляет профиль в список, и happ://routing/onadd/{base64} — добавляет и автоматически активирует профиль. Если профиль с таким именем уже существует, он перезаписывается.
Ссылки могут передаваться через HTTP-заголовки или тело подписки. Для передачи через заголовок используется параметр routing, а для добавления в тело подписки достаточно указать ссылку. При импорте профиля из заголовков или тела он сразу привязывается к подписке, в которой пришёл.
Для JSON-подписок действует режим жёстких ограничений (Restricted Mode). У JSON-подписки может быть строго 0 или 1 профиль маршрутизации, и он не может быть добавлен вручную, скопирован или импортирован из буфера обмена. Профиль приходит исключительно вместе с подпиской от провайдера. Пользователь не может отключить или изменить такой профиль: главный тогл маршрутизации заблокирован, изменение имени, ссылок и геофайлов полностью запрещено. Поля Remote DNS в интерфейсе переименованы в Tunnel DNS и используются локально для настройки системного туннеля, не инжектируясь в сам JSON-файл провайдера.
Обработка ошибок и обновление геофайлов
Приложение использует менеджер загрузки геофайлов, который работает в фоновом режиме. Если загрузка не завершается в течение 3 минут, процесс останавливается, на главном экране появляется сообщение об ошибке, а рядом с проблемным профилем отображается красный восклицательный знак. Проблемное состояние исчезает автоматически после удаления проблемного профиля или успешной загрузки.
Обновление профиля происходит следующим образом: система получает новый импорт профиля с уже существующим именем, сущность переходит в транзитное состояние Update, начинается фоновая загрузка новых геофайлов. Важно, что в процессе загрузки состояние Current остаётся неизменным — ядро продолжает работать со старыми правилами и геофайлами, обеспечивая бесперебойную маршрутизацию. Как только все геофайлы успешно докачались, происходит атомарная подмена: состояние Current перезаписывается новыми правилами, а состояние Default обновляется.
Параметр LastUpdated в профиле управляет актуальностью геофайлов. При первой установке, если поле заполнено, приложение принудительно скачает геофайлы, даже если URL совпадают со стандартными. При обновлении скачивание начнётся, если новая дата позже текущей или старая дата отсутствует.
Практический пример: настройка маршрутизации для России
Рассмотрим готовый профиль, который решает проблему с российскими сервисами. Конфигурация использует порядок block-direct-proxy: сначала блокировки, затем direct, и только потом proxy. В DirectSites указаны geosite:category-ru, geosite:category-gov-ru, geosite:mailru, geosite:vk, а в DirectIp — geoip:ru и geoip:private. Это обеспечивает прямой доступ к российским сайтам и частным IP-адресам.
Параметр GlobalProxy установлен в true, поэтому всё остальное идёт через прокси. DNS настроен так: российские DNS-запросы идут через Яндекс DNS (77.88.8.8, DoU), остальные — через Cloudflare DNS через DoH и Google 8.8.8.8. В DnsHosts переопределены адреса cloudflare-dns.com на 1.1.1.1 и dns.google на 8.8.8.8, чтобы гарантировать использование нужных IP.
Чтобы использовать этот профиль, скопируйте ссылку happ://routing/add/... (base64-кодированный JSON), откройте Happ, перейдите в настройки (шестерёнка), затем в раздел «Маршрутизация», нажмите «…» в правом верхнем углу и выберите «Импорт профиля». Вставьте конфигурацию. После импорта профиль будет добавлен и активирован. Если использовать ссылку happ://routing/onadd/..., профиль активируется автоматически, даже если другие профили уже активны.
Инструменты для создания и редактирования профилей
Для создания и редактирования профилей маршрутизации удобно использовать визуальный редактор на сайте routing.happ.su. Он позволяет импортировать существующую Happ-ссылку или Base64/JSON конфигурацию, настроить параметры через удобный интерфейс и автоматически сгенерировать ссылку для импорта. Изменения синхронизируются с JSON в реальном времени.
В редакторе можно настроить все основные параметры: имя профиля, GlobalProxy, RouteOrder, типы DNS, списки Direct/Proxy/Block, DnsHosts, DomainStrategy, FakeDNS, UseChunkFiles и другие. Также доступен JSON-редактор для прямого редактирования конфигурации с синхронизацией.
При создании профиля важно учитывать, что для JSON-подписок действуют ограничения: профиль не может быть добавлен вручную, только вместе с подпиской. Поэтому для таких подписок лучше полагаться на профиль, предоставленный провайдером, или использовать отдельную подписку с собственным профилем маршрутизации.
Вопросы и ответы
Что такое маршрутизация в Happ и зачем она нужна?
Маршрутизация в Happ — это механизм, который позволяет разделять трафик на категории: одни ресурсы идут напрямую, другие — через прокси, третьи блокируются. Это решает проблему, когда российские сервисы ограничивают доступ с зарубежных IP-адресов. С помощью маршрутизации можно настроить VPN так, чтобы российские сайты работали напрямую и быстро, а заблокированные или зарубежные — через VPN. VPN остаётся включённым, но не мешает работе локальных сервисов.
Как импортировать профиль маршрутизации в Happ?
Профиль маршрутизации можно импортировать несколькими способами. Самый простой — скопировать ссылку вида happ://routing/add/{base64} или happ://routing/onadd/{base64} и открыть её в Happ. Также можно перейти в настройки Happ (шестерёнка), затем в раздел «Маршрутизация», нажать «…» в правом верхнем углу и выбрать «Импорт профиля», после чего вставить конфигурацию. Профиль также может прийти вместе с подпиской от провайдера через HTTP-заголовок routing или тело подписки.
В чём разница между ссылками happ://routing/add и happ://routing/onadd?
Ссылка happ://routing/add/{base64} добавляет профиль в список профилей, но не активирует его автоматически. Первый добавленный профиль становится активным только после успешной загрузки геофайлов. Ссылка happ://routing/onadd/{base64} добавляет и автоматически активирует профиль, даже если другие профили уже активны. Если профиль с таким именем уже существует, он перезаписывается в обоих случаях.
Что такое геофайлы geoip.dat и geosite.dat и зачем они нужны?
Геофайлы geoip.dat и geosite.dat содержат обширные списки IP-адресов и доменов, сгруппированных по странам и категориям. Они используются для маршрутизации: например, правило geoip:ru направляет все российские IP-адреса напрямую, а geosite:category-ru — все российские сайты. По умолчанию используются файлы из репозитория Loyalsoldier/v2ray-rules-dat. Эти файлы можно обновлять, указывая новые URL в параметрах Geoipurl и Geositeurl.
Почему российские сервисы не работают при включённом VPN?
Многие российские сервисы (банки, госуслуги, медиа) ограничивают доступ с зарубежных IP-адресов. Когда VPN включён, ваш трафик выходит через зарубежный сервер, и сервис может блокировать доступ или работать нестабильно. Решение — настроить маршрутизацию так, чтобы российские ресурсы шли напрямую, минуя VPN. Для этого в профиле маршрутизации нужно добавить соответствующие правила direct для российских сайтов и IP-адресов.
Можно ли изменить профиль маршрутизации, полученный вместе с JSON-подпиской?
Нет, для JSON-подписок действует режим жёстких ограничений. Профиль маршрутизации приходит исключительно вместе с подпиской от провайдера, и пользователь не может вручную управлять его активностью или менять параметры. Главный тогл маршрутизации заблокирован, изменение имени, ссылок и геофайлов полностью запрещено. Если вам нужна гибкая настройка, используйте отдельную подписку с собственным профилем маршрутизации.
Что делать, если при загрузке геофайлов возникает ошибка?
Если загрузка геофайлов не завершается в течение 3 минут, процесс останавливается, на главном экране появляется сообщение об ошибке, а рядом с проблемным профилем отображается красный восклицательный знак. Проблемное состояние исчезает автоматически после удаления проблемного профиля или успешной загрузки. Убедитесь, что у вас стабильное интернет-соединение, и попробуйте обновить профиль или перезапустить приложение.