Some checks failed
Published content check / validate (push) Failing after 3s
Обновить правила репозитория и подписи исходников в 99 заметках, не затрагивая пользовательские незакоммиченные файлы. Сделать Forgejo Actions содержательным: проверять опубликованный commit, а не пустое рабочее дерево после checkout.
189 lines
16 KiB
Markdown
189 lines
16 KiB
Markdown
---
|
||
date: 2026-07-25
|
||
tags:
|
||
- clash
|
||
- mihomo
|
||
- маршрутизация
|
||
- правила
|
||
- новичкам
|
||
aliases:
|
||
- Правила Clash
|
||
- Маршрутизация mihomo
|
||
- rules Clash
|
||
- Рецепты правил
|
||
---
|
||
|
||
# 🧭 Правила маршрутизации: рецепты и отладка
|
||
|
||
> [!info] О чём заметка
|
||
> Практическая часть про блок `rules` в конфиге [[Clash/02-mihomo|mihomo]]: как читаются правила, как заставить конкретный сайт, приложение или устройство ходить нужным путём, откуда брать готовые списки и как понять, какое правило сработало. Устройство конфига целиком — в [[Clash/01-clash-core|Ядре Clash]], полный перечень типов правил в современном ядре — в [[Clash/06-features-protocols|возможностях mihomo]].
|
||
|
||
## TL;DR
|
||
|
||
- Правила читаются **сверху вниз до первого совпадения**, поэтому порядок важнее содержания: частное — выше, общее — ниже, `MATCH` — всегда последним.
|
||
- Формат строки: `ТИП,ЗНАЧЕНИЕ,ЦЕЛЬ`. Цель — это `DIRECT` (напрямую), `REJECT` (оборвать) или имя группы из `proxy-groups`.
|
||
- Ссылайтесь в правилах **на группы, а не на конкретные узлы** — иначе при смене серверов придётся переписывать весь список.
|
||
- Для больших списков (реклама, категории сайтов) используйте **готовые наборы правил** через `rule-providers`, а не тысячу строк в конфиге.
|
||
- Самый быстрый способ понять, что происходит, — вкладка **соединений** в клиенте: там видно, какое правило сработало для каждого соединения.
|
||
- Типовая ошибка новичка — правило `GEOIP` выше доменных: оно требует разрешения имени в адрес и перехватывает больше, чем задумано.
|
||
|
||
## Как читается список правил
|
||
|
||
Каждая строка — это условие и действие. Ядро берёт новое соединение и идёт по списку сверху вниз: первое подошедшее правило определяет судьбу соединения, остальные не проверяются.
|
||
|
||
```yaml
|
||
rules:
|
||
- DOMAIN-SUFFIX,gosuslugi.ru,DIRECT
|
||
- DOMAIN-KEYWORD,youtube,PROXY
|
||
- DOMAIN-SUFFIX,doubleclick.net,REJECT
|
||
- GEOIP,RU,DIRECT
|
||
- MATCH,PROXY
|
||
```
|
||
|
||
Читается это так: всё на домене `gosuslugi.ru` — напрямую; всё, где в имени встречается `youtube`, — через группу `PROXY`; рекламный домен — оборвать; всё, что ведёт на российские адреса, — напрямую; всё остальное — через `PROXY`.
|
||
|
||
**Три специальные цели** нужно запомнить сразу: `DIRECT` — соединение идёт мимо туннеля, `REJECT` — обрывается (так блокируют рекламу и трекеры), имя группы — уходит в туннель через выбранный в этой группе узел.
|
||
|
||
Проще говоря: список правил — это анкета, которую ядро заполняет за вас на каждое соединение, а `MATCH` в конце — ответ «во всех остальных случаях».
|
||
|
||
## Основные типы правил
|
||
|
||
| Тип | По чему сравнивает | Пример |
|
||
|---|---|---|
|
||
| `DOMAIN` | Точное имя хоста | `DOMAIN,example.com,PROXY` |
|
||
| `DOMAIN-SUFFIX` | Домен и все поддомены | `DOMAIN-SUFFIX,ya.ru,DIRECT` |
|
||
| `DOMAIN-KEYWORD` | Подстрока в имени | `DOMAIN-KEYWORD,google,PROXY` |
|
||
| `IP-CIDR` / `IP-CIDR6` | Подсеть назначения | `IP-CIDR,10.0.0.0/8,DIRECT,no-resolve` |
|
||
| `GEOIP` | Страна адреса назначения | `GEOIP,RU,DIRECT` |
|
||
| `SRC-IP-CIDR` | Адрес источника (кто в вашей сети) | `SRC-IP-CIDR,192.168.1.50/32,PROXY` |
|
||
| `DST-PORT` | Порт назначения | `DST-PORT,25,REJECT` |
|
||
| `PROCESS-NAME` | Имя приложения | `PROCESS-NAME,Telegram.exe,PROXY` |
|
||
| `RULE-SET` | Готовый набор правил из провайдера | `RULE-SET,ads,REJECT` |
|
||
| `MATCH` | Всё остальное | `MATCH,PROXY` |
|
||
|
||
В [[Clash/02-mihomo|mihomo]] к этому добавлены `GEOSITE` (категории доменов), `IP-ASN` (по номеру автономной системы), `DOMAIN-REGEX`, логические `AND`/`OR`/`NOT` и правила по типу входящего соединения — их перечень с пояснениями собран в [[Clash/06-features-protocols|возможностях ядра]].
|
||
|
||
> [!note] Что делает `no-resolve`
|
||
> Правила по IP-адресу требуют знать адрес, а в начале соединения ядро часто видит только домен. Без флага `no-resolve` оно сходит в DNS, чтобы проверить правило, — и это и задержка, и лишний запрос наружу. Флаг говорит: «если адреса ещё нет, просто пропусти это правило». Ставьте его на все `IP-CIDR` и `GEOIP`, которые стоят выше доменных правил.
|
||
|
||
## Рецепты
|
||
|
||
Ниже — готовые фрагменты под частые задачи. Вставляются в блок `rules` вашего конфига; если конфиг приходит из подписки, ищите в клиенте раздел вроде «переопределения», «override» или «слияние профиля» — он позволяет дописать свои правила поверх присланных, не теряя их при обновлении.
|
||
|
||
**Российские сайты напрямую, остальное через туннель.** Базовая раскладка, с которой начинают почти все.
|
||
|
||
```yaml
|
||
rules:
|
||
- DOMAIN-SUFFIX,ru,DIRECT
|
||
- DOMAIN-SUFFIX,su,DIRECT
|
||
- DOMAIN-SUFFIX,рф,DIRECT
|
||
- GEOIP,RU,DIRECT,no-resolve
|
||
- MATCH,PROXY
|
||
```
|
||
|
||
**Локальная сеть и роутер — всегда напрямую.** Иначе домашние устройства и веб-интерфейс роутера уедут в туннель и перестанут открываться.
|
||
|
||
```yaml
|
||
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
|
||
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
|
||
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
|
||
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
|
||
```
|
||
|
||
**Реклама и трекеры — в обрыв.** Точечно это делается доменами, но по-настоящему удобно — набором правил (см. следующий раздел).
|
||
|
||
```yaml
|
||
- DOMAIN-SUFFIX,doubleclick.net,REJECT
|
||
- DOMAIN-KEYWORD,adservice,REJECT
|
||
```
|
||
|
||
**Конкретное приложение через туннель.** Работает на десктопе, где ядро видит имя процесса.
|
||
|
||
```yaml
|
||
- PROCESS-NAME,Telegram.exe,PROXY
|
||
- PROCESS-NAME,discord.exe,PROXY
|
||
```
|
||
|
||
**Одно устройство в доме через туннель, остальные напрямую.** Пригодится, когда mihomo стоит шлюзом для всей квартиры.
|
||
|
||
```yaml
|
||
- SRC-IP-CIDR,192.168.1.50/32,PROXY
|
||
- MATCH,DIRECT
|
||
```
|
||
|
||
**Торренты мимо туннеля.** Многие продавцы не разрешают P2P, да и скорость через прокси обычно хуже.
|
||
|
||
```yaml
|
||
- PROCESS-NAME,qbittorrent.exe,DIRECT
|
||
```
|
||
|
||
**Разные страны для разных сервисов.** Если в подписке есть группы по регионам, правило может указывать на конкретную группу.
|
||
|
||
```yaml
|
||
- DOMAIN-SUFFIX,netflix.com,Streaming-NL
|
||
- DOMAIN-SUFFIX,openai.com,US-Nodes
|
||
```
|
||
|
||
> [!tip] Ссылайтесь на группы, а не на узлы
|
||
> Правило `DOMAIN-SUFFIX,openai.com,US-Nodes` переживёт смену серверов: сменились узлы в подписке — группа наполнилась новыми, правило работает. Правило, указывающее на конкретный узел «США-3», сломается в тот день, когда продавец переименует сервер.
|
||
|
||
## Готовые наборы правил
|
||
|
||
Списки рекламных доменов, категорий сайтов и подсетей исчисляются десятками тысяч строк — держать их в конфиге бессмысленно. Для этого есть **`rule-providers`**: набор загружается по URL, обновляется по расписанию и подключается одной строкой.
|
||
|
||
```yaml
|
||
rule-providers:
|
||
ads:
|
||
type: http
|
||
behavior: domain
|
||
url: "https://example.com/ads.yaml"
|
||
path: ./ruleset/ads.yaml
|
||
interval: 86400
|
||
|
||
rules:
|
||
- RULE-SET,ads,REJECT
|
||
- MATCH,PROXY
|
||
```
|
||
|
||
Ключевые поля: **`behavior`** — какого вида список (`domain` — только домены, `ipcidr` — подсети, `classical` — полноценные правила любых типов), **`interval`** — как часто обновлять (в секундах), **`path`** — где хранить локальную копию.
|
||
|
||
Формат файла задаётся полем `format`: `yaml`, `text` или **`mrs`** — компактный бинарный формат mihomo, который экономит память на больших списках. Готовые наборы и геоданные команда MetaCubeX публикует в репозитории **meta-rules-dat** (подробнее — в [[Clash/06-features-protocols|возможностях ядра]]).
|
||
|
||
> [!warning] Чужой набор правил — это доверие
|
||
> Подключая список по чужому URL, вы отдаёте его автору право решать, какие домены у вас блокируются, а какие идут напрямую. Испорченный или враждебно изменённый набор может, например, направить банковский домен в туннель или заблокировать нужный сервис. Берите наборы из репозиториев с историей и не подключайте десяток списков «на всякий случай».
|
||
|
||
## Как понять, какое правило сработало
|
||
|
||
Здесь начинается отладка, и она проще, чем кажется.
|
||
|
||
**Вкладка соединений.** В любом клиенте на ядре mihomo есть список активных соединений (в веб-дашбордах — Connections). Для каждого показано: хост назначения, сработавшее правило, выбранный узел, объём трафика. Открыли проблемный сайт — увидели, какое правило его перехватило. Это отвечает на 90 % вопросов «почему оно идёт не туда».
|
||
|
||
**Логи.** Уровень `info` показывает основные события, `debug` — подробности разрешения имён и выбора маршрута. Держать `debug` постоянно не стоит: он шумный и пишет в файл историю ваших соединений.
|
||
|
||
**Приём «сравни с Global».** Если в режиме `Global` сайт открывается, а в `Rule` нет — виноваты правила, и надо смотреть, какое из них перехватывает соединение. Если не открывается и в `Global` — дело не в правилах, а в узле, протоколе или блокировке (см. [[Clash/05-troubleshooting|диагностику проблем]]).
|
||
|
||
## Частые ошибки
|
||
|
||
**`GEOIP` слишком высоко.** Правило по стране требует адреса, поэтому оно тянет за собой разрешение имени и перехватывает соединения раньше доменных правил. Держите его ниже доменных и с флагом `no-resolve`.
|
||
|
||
**Забытый `MATCH`.** Без завершающего правила поведение для «всего остального» определяется настройкой `final`, и она может оказаться не той, что вы ожидаете. Проще явно поставить `MATCH` последней строкой.
|
||
|
||
**Правила выше, чем локальная сеть.** Если `MATCH,PROXY` стоит раньше исключений для `192.168.0.0/16`, веб-интерфейс роутера и сетевые принтеры уедут в туннель.
|
||
|
||
**Дубли и противоречия.** Два правила на один домен с разными целями — не ошибка синтаксиса: просто сработает верхнее. Если поведение непонятно, ищите первое совпадение сверху, а не последнее.
|
||
|
||
**Правки поверх подписки затираются.** Если конфиг приходит из подписки, ваши правки при обновлении исчезнут — используйте механизм переопределений в клиенте, а не редактирование скачанного файла.
|
||
|
||
## 📚 См. также
|
||
|
||
- [[Clash/03-first-run|Первый запуск]] — если клиент ещё не настроен.
|
||
- [[Clash/01-clash-core|Ядро Clash]] — как правила связаны с группами, DNS и режимом fake-ip.
|
||
- [[Clash/06-features-protocols|Возможности и протоколы mihomo]] — расширенные типы правил, `GEOSITE`, `IP-ASN`, логические условия и формат `.mrs`.
|
||
- [[Clash/05-troubleshooting|Типичные проблемы]] — что делать, когда правило вроде верное, а результат не тот.
|
||
- [[xray/routing|Маршрутизация в Xray]] — как та же задача решается в соседней экосистеме.
|
||
- [[Clash/09-glossary|Словарь терминов]] — расшифровка встреченных понятий.
|
||
|
||
---
|
||
|
||
> [!quote] 🤖 Эти статьи открыты — можно обучать на них ИИ
|
||
> При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование и скачивание всего репозитория одним zip-архивом доступны в Forgejo: [исходник этой заметки](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main/Clash/04-rules.md) · [весь репозиторий](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main).
|