Маршрутизация
Маршруты решают, куда пойдёт каждое соединение: через VPN, напрямую, через другой сервер или никуда. Ядро проверяет их сверху вниз, и срабатывает первый подходящий.
| Куда | Что происходит |
|---|---|
| Через VPN | через сервер, к которому вы подключены |
| Напрямую | мимо VPN, сайт видит ваш обычный адрес |
| Другой сервер | через другой сервер из вашего списка, см. какой сервер подходит |
| Блокировать | соединение не открывается |
Порядок
Порядок одинаковый для обоих ядер. Маршруты внутри одной строки проверяются в том порядке, в каком стоят на экране. Строки 4, 6 и 7 можно менять местами, см. Свой порядок.
- Блокировка. Стоит первой, поэтому действует даже на приложения, у которых есть свой маршрут.
- Ваш сервер. Адрес сервера, звеньев цепочки и серверов из маршрутов «Другой сервер» всегда идёт напрямую. Иначе соединение с сервером пошло бы через сам сервер.
- Отдельные приложения. Сначала проверяются сайты и списки приложения, потом весь его трафик. Домашняя сеть (роутер, принтер) идёт напрямую ещё раньше, так что правило «весь трафик приложения через сервер» её не затрагивает.
- Напрямую. Пока вы не меняли порядок, проверяется раньше «Через VPN»: если сайт есть в обоих маршрутах, он пойдёт напрямую.
- Локальная сеть. Адреса вида 192.168.x.x и 10.x.x.x всегда идут напрямую, отправить их в VPN маршрутом нельзя.
- Другой сервер.
- Через VPN.
- Всё остальное. Сюда попадает всё, что не подошло выше. Куда это пойдёт, решаете вы: через VPN, напрямую или в блок.
Маршрут, в котором указан протокол или порт, стоит на той же строке, что и обычный маршрут с той же целью.
Свой порядок
В разделе «Все приложения» маршрут можно зажать и перетащить выше или ниже. После этого ядро проверяет маршруты раздела в том порядке, в каком они стоят на экране, а не по цели. Так можно пустить один сайт через VPN, когда остальные сайты его страны идут напрямую: поставьте маршрут сайта выше маршрута страны.
Новый маршрут по-прежнему встаёт на место по своей цели: «Напрямую» выше, «Через VPN» ниже. Блокировка, отдельные приложения и локальная сеть остаются на своих местах, а «Всё остальное» всегда последнее. У каждого профиля свой порядок. В ссылку на профиль он не попадает.
Как это выглядит в конфиге ядра
Возьмём для примера такие маршруты: «Блокировать» ads.example, geosite:category-ads-all, «Напрямую» direct.example, 10.10.0.0/16, «Другой сервер» route.example, geoip:de, «Через VPN» proxy.example, geosite:google, «Всё остальное» через VPN. Текущий сервер 198.51.100.33, другой сервер 198.51.100.34.
"rules": [
{"ip": ["169.254.0.0/16", "224.0.0.0/4", "255.255.255.255/32"], "outboundTag": "block", "ruleTag": "block-special"},
{"port": "53", "network": "tcp,udp", "outboundTag": "dns-out", "ruleTag": "dns-out"},
{"domain": ["full:www.cloudflare.com"], "outboundTag": "proxy", "ruleTag": "exit-ip-probe"},
{"domain": ["domain:ads.example", "geosite:category-ads-all"], "outboundTag": "block", "ruleTag": "block-domains"},
{"ip": ["198.51.100.33"], "outboundTag": "direct", "ruleTag": "server-ip"},
{"ip": ["198.51.100.34"], "outboundTag": "direct", "ruleTag": "route-server-0"},
{"domain": ["domain:direct.example"], "outboundTag": "direct", "ruleTag": "direct-domains"},
{"ip": ["10.10.0.0/16", "10.0.0.0/8", "192.168.0.0/16", "…"], "outboundTag": "direct", "ruleTag": "direct-private"},
{"domain": ["domain:route.example"], "outboundTag": "keq-srv-0", "ruleTag": "keq-srv-0-domains"},
{"ip": ["geoip:de"], "outboundTag": "keq-srv-0", "ruleTag": "keq-srv-0-geoip"},
{"domain": ["domain:proxy.example", "geosite:google"], "outboundTag": "proxy", "ruleTag": "proxy-domains"},
{"ip": ["0.0.0.0/0", "::/0"], "outboundTag": "proxy", "ruleTag": "final"}
]Это Xray. У mihomo те же шаги в том же порядке, только записаны они как DOMAIN-SUFFIX,direct.example,DIRECT и так далее, а в конце стоит MATCH.
Последнее правило записано как «любой IP», а не «любое соединение», потому что в примере есть свой IP (10.10.0.0/16). Xray узнаёт адрес сайта и проверяет правила по IP, только если ни одно правило не совпало по имени, а правило «любое соединение» совпадало бы всегда.
Имя или IP
Правила по имени (vk.com, geosite:) сравнивают имя сайта, а правила по адресу (1.2.3.4, 10.0.0.0/8, geoip:) – его IP. Иногда программа передаёт ядру только имя, и правилу по адресу не с чем сравнивать.
Если среди ваших маршрутов есть свои IP или подсети, ядро в таком случае само узнаёт адрес сайта, но только когда ни одно правило по имени не подошло. Записи geoip: этого не включают: иначе ради проверки страны пришлось бы делать лишний DNS-запрос на каждое соединение. Это поведение меняется настройкой «Стратегия доменов в правилах».
Как писать сайты и адреса
Записи разделяются запятой, пробелом или переносом строки.
| Запись | Что под неё попадает |
|---|---|
vk.com | vk.com и все поддомены |
.vk.com, *.vk.com | то же самое |
ru | всё, что заканчивается на .ru |
full:vk.com | только vk.com, без поддоменов |
regexp:… | имена, подходящие под регулярное выражение |
geosite:google | готовый список доменов сервиса |
1.2.3.4 | один адрес |
10.0.0.0/8 | подсеть |
geoip:de | адреса страны |
В geosite лежат списки сервисов, а не стран. Для страны используйте geoip.
На Android встроена урезанная база стран: в ней только коды, которые нужны готовым спискам (private, ru, telegram, refilter и иранские). Чтобы работала любая другая страна, например geoip:de, скачайте полную базу: «О приложении» → «Скачать полную базу». Без неё такая запись перед подключением отбрасывается, а на экране маршрута появляется предупреждение «Нет в гео-базах, будет проигнорировано».
Списки по ссылке
В поле сайтов можно вставить ссылку на список AdBlock или hosts. Приложение скачает его и будет обновлять раз в сутки, а новая версия начнёт действовать со следующего подключения.
Из списков AdBlock берутся только правила для целого домена, вида ||example.com^. Правила с путями, косметические правила и правила для отдельных сайтов пропускаются. Ядро такие правила не поддерживает, а если считать их правилом для всего домена, заблокируется больше, чем задумал автор списка.
Готовые списки
| Список | Что внутри |
|---|---|
| Российские сайты | geosite:category-ru |
| Иранские сайты | geosite:ir, geoip:ir и иранские CDN |
| Реклама и трекеры | geosite:category-ads-all |
| Re-filter | geosite:refilter, geoip:refilter |
| Белые списки мобильной связи | geosite:ru-whitelist |
В «Российских сайтах» нет geoip:ru. Дело в том, что российскими по адресу выглядят и кэш-серверы зарубежных сервисов, которые стоят у российских провайдеров. С geoip:ru такой сервис пойдёт напрямую на свой кэш и перестанет открываться там, где он заблокирован. Если нужного сайта нет в списке, добавьте его отдельным маршрутом.
Какое правило сработало
На экране «Соединения» видно, какое правило сработало для каждого соединения. Для mihomo это тип и значение правила, например DomainSuffix(vk.com). Для Xray – имя правила:
| Имя | Что это |
|---|---|
block-domains, block-geoip, block-ips | Блокировать |
direct-domains, direct-geoip | Напрямую |
direct-private | локальная сеть и свои IP из «Напрямую» |
keq-srv-N-… | Другой сервер, N – его номер среди серверов маршрутов, считая с нуля |
proxy-domains, proxy-geoip, proxy-ips | Через VPN |
keq-app-N… | маршрут отдельного приложения |
keq-proto-N… | маршрут с протоколом или портом |
server-…, chain-hop-N, route-server-N | адреса серверов |
user-… | ваши маршруты поверх готового конфига провайдера |
block-quic | QUIC на сервере с Vision, см. ниже |
exit-ip-probe | запрос страны для флага |
dns-out, tun-dns | DNS |
outside-vpn | приложение вне VPN пыталось пройти через туннель, см. Правки в ядрах |
tun-… | раздельное туннелирование на ПК |
| без правила | Всё остальное |
Профили
Маршруты и «Всё остальное» хранятся в профиле. Профиль «Основной» действует для всех подписок, у которых нет своего. При подключении приложение берёт профиль той подписки, из которой выбран сервер. У подписки может быть только один профиль. Если профиль выключить, вместо него работает «Основной». Раздельное туннелирование общее для всех профилей.
Провайдер может прислать профиль вместе с подпиской. Он работает в том виде, в каком прислан: его можно посмотреть, но нельзя изменить. Если включить «Правила» в «Не учитывать от провайдера», новые профили от провайдера перестанут приходить, а уже полученный станет вашим.
Готовый конфиг провайдера
У готового конфига Xray или Clash свои правила, и они проверяются первыми. Ваши маршруты работают для всего, что под них не попало. Что приложение оставляет в таком конфиге, а что удаляет, описано на странице Подписки и серверы.
Пункт «Правила» в «Не учитывать от провайдера» убирает из конфига правила, которые отправляют сайты напрямую или блокируют их, а также его собственное «всё остальное». Тогда решают ваши маршруты. Как это работает с шаблоном mihomo с группами, описано на странице Группы mihomo.
QUIC на серверах с Vision
Если сервер подключён через VLESS с Vision (xtls-rprx-vision), а «Всё остальное» идёт через VPN, приложение на Xray блокирует QUIC (UDP на порт 443). Сервер с Vision всё равно не пропускает QUIC, но отказывает только после полного рукопожатия, и браузер на каждой попытке терял время. С блокировкой браузер сразу переходит на обычное соединение. С вариантом xtls-rprx-vision-udp443 блокировки нет, потому что там сервер пропускает QUIC.