Маршрутизация (Routing)¶
Приложение поддерживает настройку маршрутизации трафика через профили маршрутизации. В приложении предустановлены геофайлы для работы сразу после установки. Обновление происходит при обновлении профиля или вручную.
Добавление профилей¶
Профили маршрутизации можно добавлять через:
- Буфер обмена
- Deeplink-ссылки
- QR-коды
- HTTP-заголовки (
routing) - Тело подписки (body)
Типы ссылок¶
| Формат ссылки | Описание |
|---|---|
incy://routing/add/{base64} |
Добавляет профиль; активируется после успешной загрузки геофайлов |
incy://routing/onadd/{base64} |
Добавляет и сразу активирует профиль |
{base64}— JSON-профиль, закодированный в base64.Обратная совместимость: ссылки
://routing/add/и://routing/onadd/также поддерживаются.
Обработка ошибок¶
Менеджер загрузки геофайлов работает в фоновом режиме:
- Загрузки, превышающие 3 минуты, прерываются
- Сообщения об ошибках отображаются на главном экране
- Проблемные профили отмечаются красным восклицательным знаком в списке
- Проблемы исчезают после успешной загрузки файлов или удаления профиля
HTTP-заголовок¶
Профиль передаётся в заголовке routing в base64-формате. Поддерживаются два формата:
Формат 1 — base64 напрямую:
Формат 2 — полная ссылка (любая схема):
Тело подписки¶
Строка маршрутизации размещается в теле подписки наряду с серверными конфигурациями:
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 обрабатывал все запросы согласно конфигурации |
Правила маршрутизации¶
Трафик распределяется по трём категориям:
| Поле | Тип | Описание |
|---|---|---|
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недоступен → fallback на сравнение временных метокLastUpdated - Полный файл скачивается → вычисляется SHA-256 → файл заменяется
- Новый хеш сохраняется в профиле
Рекомендация для провайдеров¶
Размещайте файл 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 — клиент может не распознать структуру.