Маршрутизация (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 напрямую:
Формат 2 — полная ссылка (любая схема):
Формат 3 — отключение маршрутизации:
Значение off (или ссылка ://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, указанных в профиле. Для экономии трафика используется хеш-проверка.
Алгоритм¶
- Скачивается
{filename}.sha256(несколько байт) с того же URL - Если хеш совпадает с сохранённым и файл существует локально → скачивание пропускается (даже при ручном обновлении)
- Если
.sha256недоступен, обычный импорт профиля может пропустить загрузку по совпавшемуLastUpdated. Ручная и периодическая проверки геофайлов игнорируют эту временную метку. - Нужные файлы скачиваются во временную папку. Клиент вычисляет SHA-256 и сверяет его с опубликованной контрольной суммой, если она доступна. Незавершённый HTTP-ответ или несовпадение хеша завершают обновление с ошибкой.
- Рабочие файлы заменяются только после успешной загрузки всех необходимых файлов. При сетевой ошибке сохраняется прежняя пара; ошибка установки второго файла вызывает откат первого.
- Хеши и время успешной проверки сохраняются после установки. Подробнее — обработка ошибок и повторы.
Рекомендация для провайдеров¶
Размещайте файл geoip.dat.sha256 и geosite.dat.sha256 рядом с геофайлами. Файл должен содержать только hex-строку SHA-256 хеша (64 символа). Это позволит клиентам пропускать скачивание неизменившихся файлов и экономить трафик.
Пример содержимого geoip.dat.sha256:
Обрезка геофайлов (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-заголовок:
В текстовом теле подписки (в том числе внутри base64):
Значение — целое число часов от 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 подписки: одинаковые имена не приводят к перезаписи профиля другой подписки. Переименование провайдера обновляет подпись существующего профиля. Ранее импортированные профили без привязки сохраняются, чтобы не удалять вручную настроенные правила.