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

Маршрутизация (Routing)

Приложение поддерживает настройку маршрутизации трафика через профили маршрутизации. В приложении предустановлены геофайлы для работы сразу после установки. Обновление происходит при обновлении профиля или вручную.

Добавление профилей

Профили маршрутизации можно добавлять через:

  • Буфер обмена
  • Deeplink-ссылки
  • QR-коды
  • HTTP-заголовки (routing)
  • Тело подписки (body)

Типы ссылок

Формат ссылки Описание
incy://routing/add/{base64} Добавляет профиль; активируется после успешной загрузки геофайлов
incy://routing/onadd/{base64} Добавляет и сразу активирует профиль
incy://routing/off Полностью отключает встроенную маршрутизацию (без данных)

{base64} — JSON-профиль, закодированный в base64.

incy://routing/off выключает встроенную маршрутизацию целиком — эквивалент выключения тумблера профилей маршрутизации в настройках: конфиг генерируется без правил роутинга. Выбранный профиль сохраняется (обратимо: провайдер может снова включить через onadd).

Обратная совместимость: ссылки ://routing/add/ и ://routing/onadd/ также поддерживаются.

Обработка ошибок

Менеджер загрузки геофайлов работает в фоновом режиме:

  • Загрузки, превышающие 3 минуты, прерываются
  • Сообщения об ошибках отображаются на главном экране
  • Проблемные профили отмечаются красным восклицательным знаком в списке
  • Проблемы исчезают после успешной загрузки файлов или удаления профиля

HTTP-заголовок

Профиль передаётся в заголовке routing в base64-формате. Поддерживаются два формата:

Формат 1 — base64 напрямую:

HTTP/2 200
routing: ewogICJOYW1lIjogIlJvc2NvbVZQTiIs...

Формат 2 — полная ссылка (любая схема):

HTTP/2 200
routing: ://routing/onadd/ewogICJOYW1lIjogIlJvc2NvbVZQTiIs...

Формат 3 — отключение маршрутизации:

Значение off (или ссылка ://routing/off) отключает встроенную маршрутизацию целиком — провайдер выключает роутинг прямо из ответа подписки, без действий пользователя:

HTTP/2 200
routing: off

Тело подписки

Строка маршрутизации размещается в теле подписки наряду с серверными конфигурациями:

vless://uuid@server1:443?security=tls#Server1
vmess://eyJhZGQiOiAic2VydmVyMi...
incy://routing/onadd/ewogICJOYW1lIjogIlJvc2NvbVZQTiIs...

Обновление существующих профилей

  • Профили с одинаковым полем Name обновляются, а не дублируются
  • Поле LastUpdated с Unix timestamp контролирует актуальность — обновление происходит при значении большем, чем у сохранённого профиля

Структура профиля

Пример профиля

{
    "Name": "RoscomVPN",
    "GlobalProxy": "true",
    "RemoteDNSType": "DoH",
    "RemoteDNSDomain": "https://cloudflare-dns.com/dns-query",
    "RemoteDNSIP": "1.1.1.1",
    "DomesticDNSType": "DoH",
    "DomesticDNSDomain": "https://dns.google/dns-query",
    "DomesticDNSIP": "8.8.8.8",
    "Geoipurl": "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat",
    "Geositeurl": "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat",
    "DnsHosts": {
        "cloudflare-dns.com": "1.1.1.1",
        "dns.google": "8.8.8.8"
    },
    "DirectSites": ["geosite:ru"],
    "DirectIp": ["geoip:ru", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "169.254.0.0/16", "224.0.0.0/4", "255.255.255.255"],
    "ProxySites": [],
    "ProxyIp": [],
    "BlockSites": ["geosite:category-ads-all"],
    "BlockIp": [],
    "DomainStrategy": "IPIfNonMatch",
    "FakeDNS": "false"
}

Описание полей

Основные настройки

Поле Тип По умолчанию Описание
Name string "Default" Имя профиля
GlobalProxy string "true" "true" — весь трафик через прокси; "false" — прямое соединение. Определяет поведение при отсутствии совпадений в правилах маршрутизации
LastUpdated string Unix timestamp. Контролирует принудительное обновление геофайлов при первом сохранении или при обновлении профиля с более новой временной меткой

Настройки DNS

Система разделяет DNS-запросы на удалённые (Remote, через прокси) и локальные (Domestic, прямое соединение).

Удалённый DNS (для прокси-ресурсов):

Поле Тип По умолчанию Описание
RemoteDNSType string "DoH" Протокол: DoH, DoU
RemoteDNSDomain string "https://cloudflare-dns.com/dns-query" Адрес DNS-сервера (обязателен для DoH)
RemoteDNSIP string "1.1.1.1" IP DNS-сервера
RemoteDns string Альтернативное поле для RemoteDNSIP (обратная совместимость)

Локальный DNS (для прямых ресурсов):

Поле Тип По умолчанию Описание
DomesticDNSType string "DoU" Протокол: DoH, DoU
DomesticDNSDomain string "" Адрес DNS-сервера (по умолчанию пусто — используется DomesticDNSIP по UDP)
DomesticDNSIP string "8.8.8.8" IP DNS-сервера
DomesticDns string Альтернативное поле для DomesticDNSIP (обратная совместимость)

Дополнительные DNS-настройки:

Поле Тип Описание
DnsHosts object Ручные DNS-записи (аналог файла hosts). Формат: {"domain": "ip"}
FakeDNS string "true" — подставляет виртуальные IP вместо реальных, чтобы Xray обрабатывал все запросы согласно конфигурации

VPN DNS → Internal и FakeDNS

Это разные настройки. В Apple-клиенте с HEV режим Internal (198.18.0.2) использует mapdns: система получает виртуальный IPv4 из 240.0.0.0/4, а HEV восстанавливает исходный домен перед передачей соединения в Xray. Поэтому такие адреса возможны даже при FakeDNS=false в профиле. Они должны оставаться внутри VPN и не являются адресами сервера провайдера.

FakeDNS профиля управляет механизмом Xray. RemoteDNS и DomesticDNS задают резолверы профиля, а не включают или выключают HEV mapdns. Полный JSON подписки может содержать собственные DNS-настройки.

В исправлениях октября 2026 mapdns восстанавливается в Android, включая маршрут виртуальных адресов при обходе LAN. В incy-linux для Internal добавлен аналог на встроенном FakeDNS Xray без замены Xray TUN на HEV. Он сохраняет резолверы и явные пулы подписки; правила выбора DNS могут давать реальные ответы для отдельных доменов. Профиль на диске при этом не меняется. Доступность исправлений зависит от установленной сборки.

Для режима с реальными IP выберите публичный пресет VPN DNS и отключите FakeDNS в профиле. У сгенерированных конфигураций перехват DNS остаётся в Xray, поэтому сохраняются Remote/Domestic DNS и правила профиля. Для полного JSON также проверьте его собственные DNS и правила перехвата. После смены режима переподключите VPN и перезапустите проблемный браузер, чтобы исключить старый DNS-кеш. Если сбой остался, приложите журнал и результат проверки DNS: наличие виртуального IP само по себе не доказывает причину ошибки JavaScript или WebSocket.

Правила маршрутизации

Трафик распределяется по трём категориям:

Поле Тип Описание
DirectSites string[] Домены/категории для прямого доступа (без прокси)
DirectIp string[] IP-адреса и подсети для прямого доступа
ProxySites string[] Домены/категории, направляемые через прокси
ProxyIp string[] IP-адреса и подсети через прокси
BlockSites string[] Блокируемые домены/категории (реклама, трекеры)
BlockIp string[] Блокируемые IP-адреса и подсети

Правила поддерживают гео-категории (geosite:ru, geoip:ru), конкретные домены и IP/CIDR-подсети.

Геофайлы

Поле Тип Описание
Geoipurl string URL для скачивания geoip.dat
Geositeurl string URL для скачивания geosite.dat

Стратегия маршрутизации

Поле DomainStrategy определяет порядок проверки правил (по умолчанию AsIs):

Значение Описание
AsIs Домены передаются как есть, без DNS-резолва (по умолчанию)
IPIfNonMatch Сначала проверка по домену; если не совпало — резолв DNS и проверка по IP-правилам
IPOnDemand Всегда резолвит домены в IP перед проверкой правил

Геофайлы: оптимизированное скачивание

Геофайлы (geoip.dat, geosite.dat) скачиваются с URL, указанных в профиле. Для экономии трафика используется хеш-проверка.

Алгоритм

  1. Скачивается {filename}.sha256 (несколько байт) с того же URL
  2. Если хеш совпадает с сохранённым и файл существует локально → скачивание пропускается (даже при ручном обновлении)
  3. Если .sha256 недоступен, обычный импорт профиля может пропустить загрузку по совпавшему LastUpdated. Ручная и периодическая проверки геофайлов игнорируют эту временную метку.
  4. Нужные файлы скачиваются во временную папку. Клиент вычисляет SHA-256 и сверяет его с опубликованной контрольной суммой, если она доступна. Незавершённый HTTP-ответ или несовпадение хеша завершают обновление с ошибкой.
  5. Рабочие файлы заменяются только после успешной загрузки всех необходимых файлов. При сетевой ошибке сохраняется прежняя пара; ошибка установки второго файла вызывает откат первого.
  6. Хеши и время успешной проверки сохраняются после установки. Подробнее — обработка ошибок и повторы.

Рекомендация для провайдеров

Размещайте файл geoip.dat.sha256 и geosite.dat.sha256 рядом с геофайлами. Файл должен содержать только hex-строку SHA-256 хеша (64 символа). Это позволит клиентам пропускать скачивание неизменившихся файлов и экономить трафик.

Пример содержимого geoip.dat.sha256:

556d4041c378123499c307abc6165ab61eda2a7541f792def3d52c160e2fdd05


Обрезка геофайлов (chunk files)

Полные geoip/geosite файлы весят десятки мегабайт. Если профиль использует только ограниченное подмножество geoip:/geosite: тегов, клиент может обрезать скачанные файлы до реально нужных записей.

Поле профиля

Поле Тип Описание
useChunkFiles boolean Если true — клиент вызывает внутреннее CutGeoData() после скачивания и оставляет только упомянутые в правилах теги
  • По умолчанию false на всех платформах — обратная совместимость со старыми профилями.
  • Android / iOS реализуют обрезку через встроенный Go-модуль incycore.CutGeoData() (protobuf-парсинг geoip/geosite и выброс лишних записей).
  • Desktop (Linux / Windows) пока использует полные файлы — useChunkFiles игнорируется; процесс xray работает с неукороченными .dat.
  • После обрезки хеш пересчитывается локально и сохраняется в профиле — повторное скачивание не запустится, пока исходный .sha256 на сервере не сменится.

Когда использовать

Включите, если:

  • В proxy / direct / block используется мало геотегов (например, только geoip:ru, geoip:cn, geosite:google).
  • Пользователи жалуются на память при загрузке тяжёлых списков.

Не включайте, если:

  • Профиль использует много тегов — обрезка не даст выигрыша.
  • Есть кастомные geosite-файлы с нестандартным layout — клиент может не распознать структуру.

Автообновление геофайлов профиля

Провайдер может задавать периодическую проверку существующих GeoIP/GeoSite-файлов независимо от обновления подписки. Premium не требуется.

HTTP-заголовок:

routing-geo-update-interval: 24

В текстовом теле подписки (в том числе внутри base64):

#routing-geo-update-interval: 24

Значение — целое число часов от 0 до 8760. 0 или отсутствие параметра отключает периодические проверки при отсутствии локального переопределения. Некорректные значения игнорируются; корректный HTTP-заголовок имеет приоритет над телом. profile-update-interval по-прежнему управляет только обновлением подписки.

Поддерживается на iOS/tvOS (включая Designed for iPad на macOS), Android/TV и Desktop. Настройка применяется к профилю маршрутизации, переданному вместе с подпиской. Сам заголовок не задаёт адреса скачивания: они берутся из Geoipurl и Geositeurl профиля.

Выбор интервала

В заголовке всегда указываются часы, даже если редактор показывает дни:

Интервал в редакторе Значение заголовка
3 дня 72
7 дней 168
15 дней 360
30 дней 720
90 дней 2160

В редакторе любого профиля, в разделе геофайлов, доступен свой интервал: Не обновлять, 1, 6, 12, 24 часа или 3, 7, 15, 30, 90 дней, либо Как у провайдера. Локальный выбор сохраняется при перезапуске и обновлении подписки. Без значения провайдера режим «Как у провайдера» означает отсутствие расписания. Первичная загрузка, ручное обновление и обработка изменённого профиля сохраняются независимо от расписания.

Ошибки скачивания и повторные попытки

При периодической проверке неизменившийся LastUpdated не препятствует загрузке новых данных по прежнему URL. Если доступен .sha256 и хеш совпадает, повторная загрузка не нужна. Время успешной проверки сохраняется и при неизменившихся файлах.

GeoIP и GeoSite сначала загружаются во временную папку. Проверяются полнота HTTP-ответа, непустой файл и контрольная сумма, если сервер публикует .sha256. Только после успешной загрузки обоих файлов обновляются рабочие копии. При сетевой ошибке, обрыве или неверной контрольной сумме прежние файлы остаются на месте; время успешной проверки не меняется. Ошибка установки второго файла вызывает откат первого.

После ошибки автоматической проверки повтор выполняется не раньше чем через 30 минут, затем через 1, 2, 4 и максимум 6 часов, пока приложение работает. Успех сбрасывает задержку. Это задержка в текущем сеансе: перезапуск приложения разрешает новую попытку. Ручное обновление доступно сразу. На iOS загрузка отдельного файла дополнительно имеет до трёх попыток с короткой задержкой.

Неудачная попытка не запускает заново выбранный интервал 3/7/15/30/90 дней: для неё действует более короткая задержка повтора. Автоматические повторы требуют включённого автообновления геофайлов. Если оно выключено, доступно ручное обновление. До успешного обновления правила продолжают использовать ранее скачанные файлы. При самой первой загрузке прежней копии для восстановления ещё нет.

Проверки выполняются во время работы приложения и после его запуска; ОС может задержать их в фоне или во сне. Новый путь к геофайлам применяется при следующем подключении — приложение не разрывает VPN ради обновления.

Профили разных провайдеров

Импортированный профиль отображается как «Название профиля [GoVPN]». Имя в скобках берётся из названия подписки, переданного провайдером (profile-title), а при его отсутствии — из имени подписки. Привязка хранится по локальному ID подписки: одинаковые имена не приводят к перезаписи профиля другой подписки. Переименование провайдера обновляет подпись существующего профиля. Ранее импортированные профили без привязки сохраняются, чтобы не удалять вручную настроенные правила.