Перейти к содержимому

Профили маршрутизации

Профиль маршрутизации определяет, какой трафик идёт через прокси, какой напрямую, какой блокируется, и какие DNS-серверы используются. Формат — JSON профиля маршрутизации Happ. Профиль может прислать подписка, а пользователь может добавить его из ссылки, из QR-кода или вручную в разделе Маршруты.

Профиль — это JSON-объект. Обязателен только Name.

Ключ Тип Действие
Name непустая строка Название профиля.
GlobalProxy bool (или строки "true"/"false") true: весь трафик идёт через прокси, списки ниже не используются. Локальные сети и DNS по-прежнему обрабатываются первыми.
DirectSites строка или массив строк Домены, которые идут напрямую.
DirectIp строка или массив строк IP и CIDR, которые идут напрямую.
ProxySites строка или массив строк Домены, которые идут через прокси.
ProxyIp строка или массив строк IP и CIDR, которые идут через прокси.
BlockSites строка или массив строк Домены, которые блокируются.
BlockIp строка или массив строк IP и CIDR, которые блокируются.
DomainStrategy AsIs, IPIfNonMatch, IPOnDemand (любой регистр) Стратегия доменов Xray. По умолчанию AsIs.
RemoteDNSType DoH или DoU DNS для трафика через прокси: DNS поверх HTTPS или обычный UDP.
RemoteDNSDomain строка DoH: резолвер как URL (https://1.1.1.1/dns-query) или имя хоста (https:// и /dns-query добавляются). DoU: имя хоста резолвера, используется как udp://<хост>, если IP не задан. Вместе с https:// должно давать корректный хост.
RemoteDNSIP строка IP резолвера. Для DoH — также адрес, по которому доступно имя хоста резолвера без запроса. Для DoU — адрес сервера.
DomesticDNSType DoH или DoU DNS для прямого трафика.
DomesticDNSDomain строка Как RemoteDNSDomain.
DomesticDNSIP строка Как RemoteDNSIP.
DnsHosts объект Статические имена хостов: { "example.com": "203.0.113.5" }.
FakeDNS bool (или "true"/"false") Проверяется и сохраняется, но не применяется: клиент всегда передаёт собственную настройку пользователя FakeDNS (Настройки → Расширенные, по умолчанию выключена), и решает она.
Geoipurl строка Адрес https:// файла geoip.dat.
Geositeurl строка Адрес https:// файла geosite.dat.
LastUpdated число или строка Время изменения профиля (и его геофайлов): Unix-секунды или миллисекунды, дата ISO 8601 либо то же число текстом. Значение новее последней загрузки геофайлов вызывает повторную загрузку.

Правила для значений:

  • Список, заданный строкой, делится по запятым и переводам строк. Элементы записываются в синтаксисе маршрутизации Xray: geosite:category-ru, geoip:ru, geoip:private, domain:example.com, full:www.example.com, keyword:ads, regexp:..., CIDR вроде 10.0.0.0/8.
  • Ключ со значением неверного типа отклоняет весь профиль («Expected string», «Expected boolean», «DNS type must be DoH or DoU», «Invalid domain strategy», «Invalid DNS endpoint», «DnsHosts must be an object», «Expected string or list of strings»). Логические значения можно писать строками.
  • Неизвестный ключ игнорируется с предупреждением («Unknown routing profile key»). Имена ключей зависят от регистра.
  • Комментарии JSON и завершающие запятые допускаются.

Правила проверяются сверху вниз; срабатывает первое подходящее.

  1. DNS-трафик уходит во встроенный обработчик DNS.
  2. Если у пользователя включён Обход локальных сетей, частные адреса (geoip:private) идут напрямую.
  3. Исключённые маршруты пользователя идут напрямую.
  4. Запросы локального (domestic) резолвера идут напрямую; запросы удалённого (remote) резолвера — через прокси.
  5. В режиме Правила и если GlobalProxy не равен true: BlockSites, BlockIp, DirectSites, DirectIp, ProxySites, ProxyIp — в таком порядке.
  6. Всё остальное: прокси (или напрямую в режиме Напрямую).

Режим маршрутизации пользователь выбирает отдельно: Правила используют профиль, Весь трафик отправляет всё через прокси, Напрямую — всё напрямую; списки профиля в последних двух режимах не используются.

DNS: удалённый резолвер обслуживает трафик через прокси. Локальный резолвер обслуживает домены из DirectSites и ожидает ответы внутри DirectIp, поэтому эти имена разрешаются локально. Если ничего не задано, клиент использует https://1.1.1.1/dns-query.

Записям geosite: и geoip: нужны файлы геоданных в формате v2ray.

  • mins скачивает Geoipurl как geoip.dat, а Geositeurl как geosite.dat. Адреса должны быть HTTPS; выполняется не более 5 перенаправлений, и каждое тоже должно быть HTTPS.
  • Если существует файл <url>.sha256sum, его ведущий 64-символьный хеш должен совпасть с загрузкой; при несовпадении загрузка отклоняется, а прежний файл сохраняется.
  • Файл скачивается, если его нет, если с последней загрузки прошло 7 дней и более или если LastUpdated профиля новее последней загрузки. Перед заменой старого файла новый проверяется.
  • Если в правилах есть geoip: или geosite:, а адресов в профиле нет, mins скачивает файлы runetfreedom/russia-v2ray-rules-dat.
  • Пользователь может управлять файлами и вручную в Маршруты → Геоданные.

На экране Маршруты есть три шаблона, они сохраняются как обычные профили и показывают полный профиль:

Шаблон GlobalProxy DirectSites DirectIp Геофайлы
Глобальный true нет geoip:private Loyalsoldier/v2ray-rules-dat
Россия · напрямую false geosite:category-ru geoip:private, geoip:ru runetfreedom/russia-v2ray-rules-dat
Китай · напрямую false geosite:cn geoip:private, geoip:cn Loyalsoldier/v2ray-rules-dat

У всех трёх общие значения: BlockSites: ["geosite:category-ads-all"], пустые ProxySites, ProxyIp и BlockIp, RemoteDNSType: "DoH", RemoteDNSDomain: "https://1.1.1.1/dns-query", RemoteDNSIP: "1.1.1.1", DomesticDNSType: "DoH", DomesticDNSDomain: "https://dns.google/dns-query", DomesticDNSIP: "8.8.8.8", DomainStrategy: "IPIfNonMatch", FakeDNS: false.

{
"Name": "Russia",
"GlobalProxy": false,
"DirectSites": ["geosite:category-ru"],
"DirectIp": ["geoip:private", "geoip:ru"],
"BlockSites": ["geosite:category-ads-all"],
"ProxySites": [],
"ProxyIp": [],
"BlockIp": [],
"RemoteDNSType": "DoH",
"RemoteDNSDomain": "https://1.1.1.1/dns-query",
"RemoteDNSIP": "1.1.1.1",
"DomesticDNSType": "DoH",
"DomesticDNSDomain": "https://dns.google/dns-query",
"DomesticDNSIP": "8.8.8.8",
"DomainStrategy": "IPIfNonMatch",
"FakeDNS": false,
"Geositeurl": "https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/geosite.dat",
"Geoipurl": "https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/geoip.dat",
"LastUpdated": "1798761600"
}
Как Подробности
Заголовок ответа routing (или строка #routing:) Значение — профиль одной строкой JSON, base64 от JSON (можно с префиксом base64:), адрес https:// с JSON либо ссылка маршрутизации mins://, happ:// или incy://. См. Заголовки ответа.
Ссылка маршрутизации отдельной строкой в теле Те же ссылки, что в разделе Ссылки и deep link.

Как клиент обращается с профилем подписки:

  • Он сохраняется как неактивный профиль и виден в Маршруты с источником Из подписки; он заменяется при каждом обновлении подписки, которое несёт профиль внутри ответа. Профиль, заданный только адресом, скачивается при импорте подписки и обновлениями подписки заново не скачивается.
  • Серверы этой подписки используют его только после того, как пользователь принял routing-enable (заголовок routing с профилем сам выставляет его в true). routing-enable: false не даёт этим серверам использовать профиль маршрутизации вообще. См. Подтверждение.
  • Серверы, переданные как полный Xray JSON, профиль подписки не используют; у них остаётся собственный раздел routing.

Профили, доставленные ссылками mins://routing/add|onadd/... и QR-кодами, отделены от подписок: они сохраняются как импортированные профили и активны только при onadd.