Some checks failed
Published content check / validate (push) Failing after 3s
Обновить правила репозитория и подписи исходников в 99 заметках, не затрагивая пользовательские незакоммиченные файлы. Сделать Forgejo Actions содержательным: проверять опубликованный commit, а не пустое рабочее дерево после checkout.
172 lines
25 KiB
Markdown
172 lines
25 KiB
Markdown
---
|
||
date: 2026-07-25
|
||
tags:
|
||
- clash
|
||
- proxy
|
||
- обход-блокировок
|
||
- история
|
||
- маршрутизация
|
||
aliases:
|
||
- Ядро Clash
|
||
- Clash core
|
||
- Что такое Clash
|
||
- Clash Premium
|
||
link: https://en.clash.wiki/
|
||
---
|
||
|
||
# ⚙️ Ядро Clash: что это такое и как оно устроено
|
||
|
||
> [!info] О чём заметка
|
||
> Разбор **ядра Clash** (Clash core) — консольной программы-маршрутизатора трафика, вокруг которой в 2018–2023 годах выросла целая экосистема клиентов, подписок и панелей. Здесь: чем ядро отличается от графического клиента, из чего состоит его конфиг, что такое Clash API, чем закрытая версия Clash Premium отличалась от открытой и что произошло с проектом в ноябре 2023 года. Что пришло на смену — в заметке [[Clash/02-mihomo|mihomo (бывший Clash.Meta)]]; общая карта раздела — в [[Clash/00-overview|обзоре]].
|
||
|
||
## TL;DR
|
||
|
||
- **Clash — это ядро, а не приложение с кнопками.** Оригинальное ядро (репозиторий `Dreamacro/clash`, язык Go, лицензия GPL-3.0) — консольный бинарник: читает YAML-конфиг, поднимает локальные прокси-порты и раскидывает соединения по правилам. Всё «красивое» рисуют отдельные графические оболочки.
|
||
- Ключевая идея — **rule-based tunnel**, туннель на правилах: не «весь трафик в VPN», а решение по каждому соединению отдельно — этот домен напрямую, тот через сервер в Нидерландах, рекламные домены в чёрную дыру.
|
||
- Конфиг состоит из пяти смысловых блоков: входящие порты, список серверов (`proxies`), группы политик (`proxy-groups`), правила (`rules`) и DNS. Плюс `external-controller` — HTTP-API управления.
|
||
- **Clash API стал отраслевым стандартом**: почти все дашборды и графические клиенты умеют разговаривать именно по нему, поэтому формат пережил само ядро.
|
||
- Существовала закрытая сборка **Clash Premium**: TUN-режим, eBPF/auto-redir, rule-providers, скриптовые правила и профилирование. Открытое ядро этого не умело — и разрыв между «бесплатным» и «премиальным» стал одной из причин появления форков.
|
||
- **2–3 ноября 2023 года** репозиторий Clash и десятки связанных проектов были удалены или заархивированы их авторами (по данным [отчёта gfw.report](https://gfw.report/blog/developers_deleted_repos/en/) — 9 удалённых и 11 заархивированных репозиториев). Публичных объяснений авторы не давали. Развитие продолжили форки, прежде всего [[Clash/02-mihomo|mihomo]].
|
||
|
||
## Ядро против клиента: почему это разные вещи
|
||
|
||
Слово «Clash» в разговорах означает три разные сущности, и путаница между ними — источник большинства недоразумений. **Ядро (core)** — это исполняемый файл без интерфейса, который делает всю работу: слушает локальные порты, шифрует трафик, выбирает маршрут. **Графический клиент (GUI)** — отдельная программа, которая ядро в себе носит, запускает его и показывает пользователю списки серверов и переключатели. **Конфиг/подписка** — YAML-файл с описанием серверов и правил, который выдаёт продавец VPN или который вы пишете сами.
|
||
|
||
Проще говоря: ядро — это двигатель, GUI — это приборная панель и руль, конфиг — маршрут в навигаторе. Один и тот же двигатель ставят в разные машины, поэтому оболочки [[Clash/07-clients|Clash Verge Rev, FlClash, Mihomo Party и другие]] внешне непохожи, но внутри у них одно и то же ядро, и лечится их поведение одинаково — правкой конфига.
|
||
|
||
Из этого следует практическое правило: **обновление GUI и обновление ядра — разные операции**. Клиент может быть свежим, а ядро внутри — годовалым, и тогда новые протоколы из конфига просто не заработают, хотя приложение выглядит современным. Большинство оболочек позволяет обновить ядро отдельной кнопкой или подсунуть свой бинарник.
|
||
|
||
## Откуда взялся Clash
|
||
|
||
Ядро создал разработчик под ником **Dreamacro**; проект появился на GitHub в 2018 году, писался на Go и распространялся под лицензией GPL-3.0. Задача, которую он решал, отличалась от классического VPN. В Китае, где инструмент был особенно популярен, «завернуть всё в туннель» — плохая стратегия: локальные сервисы через зарубежный сервер работают медленно или отказываются работать вовсе, а лишний трафик за границу и стоит дороже, и заметнее для наблюдателя. Нужен был не туннель, а **диспетчер**: часть соединений отправить наружу, часть оставить локальными, часть заблокировать.
|
||
|
||
Отсюда и архитектура: Clash поднимает у себя локальный прокси (SOCKS5/HTTP), принимает соединение, смотрит на **имя хоста или IP назначения** и по списку правил решает, в какой исходящий канал его отдать. Тот же подход позже переняли и [[xray/routing|маршрутизация в Xray]], и [[sing-box/sing-box-extended|sing-box]], но именно Clash сделал его массовым — во многом благодаря простому YAML-конфигу, который человек читает без документации.
|
||
|
||
## Как устроен конфиг
|
||
|
||
Конфигурация Clash — один YAML-файл. Разберём его по блокам, потому что вся логика работы ядра описана именно там.
|
||
|
||
### Входящие порты — где ядро принимает трафик
|
||
|
||
```yaml
|
||
mixed-port: 7890 # HTTP + SOCKS5 на одном порту
|
||
allow-lan: false # принимать ли подключения из локальной сети
|
||
mode: rule # rule | global | direct
|
||
log-level: info
|
||
external-controller: 127.0.0.1:9090
|
||
secret: "пароль-к-API"
|
||
```
|
||
|
||
`mixed-port` — самый удобный вариант: один порт понимает и HTTP-прокси, и SOCKS5, туда указывают браузер и системные настройки. Исторически были и раздельные `port` (HTTP) и `socks-port`. Для Linux-шлюзов существуют `redir-port` и `tproxy-port` — прозрачный перехват через iptables/nftables, когда приложения вообще не знают, что их трафик проксируется (у Hysteria тот же механизм описан в [[Hysteria/tproxy|заметке про TPROXY]]).
|
||
|
||
**Режимы работы** переключают всю логику разом: `rule` — работать по правилам (обычный режим), `global` — гнать всё через один выбранный сервер (полезно для диагностики: если в global работает, а в rule нет — виноваты правила), `direct` — не проксировать ничего.
|
||
|
||
### `proxies` — сами серверы
|
||
|
||
Каждый элемент — один сервер с параметрами протокола. Оригинальное ядро умело SOCKS5, HTTP, Shadowsocks, ShadowsocksR, VMess, Trojan и Snell (протокол из проприетарного клиента Surge).
|
||
|
||
```yaml
|
||
proxies:
|
||
- name: "NL-1"
|
||
type: trojan
|
||
server: example.com
|
||
port: 443
|
||
password: "secret"
|
||
sni: example.com
|
||
```
|
||
|
||
Списки серверов редко пишут руками: их отдаёт **подписка** — URL, по которому продавец или ваша собственная панель возвращает готовый YAML. Ядро умеет тянуть такие списки автоматически через `proxy-providers` с интервалом обновления и проверкой доступности узлов.
|
||
|
||
### `proxy-groups` — политики выбора
|
||
|
||
Группа — это виртуальный «сервер», который на самом деле выбирает один из вложенных. Правила ссылаются не на конкретный узел, а на группу, поэтому конфиг не приходится переписывать при смене серверов.
|
||
|
||
| Тип группы | Что делает |
|
||
|---|---|
|
||
| `select` | Ручной выбор — то, что вы переключаете в интерфейсе клиента |
|
||
| `url-test` | Автовыбор самого быстрого по задержке (периодический запрос к тест-URL) |
|
||
| `fallback` | Первый живой по списку: пока верхний отвечает — работает он, упал — переход к следующему |
|
||
| `load-balance` | Раскидывает соединения по нескольким узлам (по хешу домена или round-robin) |
|
||
| `relay` | Цепочка: трафик идёт через несколько серверов подряд |
|
||
|
||
Разница между `url-test` и `fallback` неочевидна, но важна на практике. `url-test` гонится за скоростью и может дёргать вас между узлами при каждой проверке, из-за чего рвутся долгие сессии. `fallback` держится за один узел до последнего и переключается только при реальном отказе — для стриминга и загрузок это обычно комфортнее.
|
||
|
||
### `rules` — правила маршрутизации
|
||
|
||
Список обрабатывается **сверху вниз, до первого совпадения**, и последней строкой всегда стоит `MATCH` — что делать со всем, что не подошло.
|
||
|
||
```yaml
|
||
rules:
|
||
- DOMAIN-SUFFIX,ru,DIRECT
|
||
- GEOIP,RU,DIRECT
|
||
- DOMAIN-KEYWORD,youtube,Proxy
|
||
- DOMAIN-SUFFIX,doubleclick.net,REJECT
|
||
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
|
||
- MATCH,Proxy
|
||
```
|
||
|
||
Базовый набор типов правил: `DOMAIN`, `DOMAIN-SUFFIX`, `DOMAIN-KEYWORD` (по имени хоста), `IP-CIDR`/`IP-CIDR6` и `GEOIP` (по адресу назначения), `SRC-IP-CIDR` (по источнику — полезно на шлюзе), `DST-PORT`/`SRC-PORT`, `PROCESS-NAME` (по имени приложения, если ядро видит процесс). Три «целевых» действия зарезервированы: `DIRECT` — напрямую, `REJECT` — оборвать, имя группы — через неё.
|
||
|
||
Флаг `no-resolve` в правилах по IP означает «не разрешать домен в адрес ради этой проверки». Без него ядро при каждом соединении по имени будет лезть в DNS раньше, чем это нужно, — а это и задержка, и утечка запроса.
|
||
|
||
### DNS и режим fake-ip
|
||
|
||
DNS в Clash — не просто «какой сервер спрашивать», а часть маршрутизации. Проблема в том, что при прозрачном перехвате (TUN, redir) ядро видит уже готовый IP-адрес и не знает домена, а правила-то написаны по доменам.
|
||
|
||
```yaml
|
||
dns:
|
||
enable: true
|
||
enhanced-mode: fake-ip
|
||
fake-ip-range: 198.18.0.1/16
|
||
nameserver: [223.5.5.5, 8.8.8.8]
|
||
```
|
||
|
||
**Режим `fake-ip`** решает это так: на DNS-запрос приложения ядро мгновенно отвечает подставным адресом из служебного диапазона (по умолчанию `198.18.0.0/16`) и запоминает связку «фиктивный IP ↔ домен». Когда приложение открывает соединение на этот адрес, ядро по таблице восстанавливает исходное имя и применяет доменные правила. Побочная выгода — скорость: настоящий DNS-запрос делается только для тех соединений, которые реально пойдут напрямую.
|
||
|
||
**Режим `redir-host`** — старый вариант: ядро запоминает имя из запроса, но отдаёт приложению настоящий адрес. Работает без служебной подсети, но чаще ошибается на CDN и медленнее, потому что честный DNS-запрос делается всегда.
|
||
|
||
> [!warning] Fake-ip ломает то, что ждёт настоящий адрес
|
||
> Приложения, которые сами резолвят домен и потом проверяют адрес (некоторые игры, часть корпоративных VPN-клиентов, локальные устройства с mDNS), от подставных IP ломаются. Для таких доменов в конфиге есть исключение `fake-ip-filter` — список имён, которые нужно резолвить честно. Симптом попадания в эту ловушку узнаваемый: браузер работает, а конкретное приложение «видит сеть, но не подключается».
|
||
|
||
## Clash API: почему формат пережил само ядро
|
||
|
||
Строка `external-controller: 127.0.0.1:9090` включает **RESTful HTTP-API управления**. Через него можно получить список групп и переключить активный узел (`/proxies`), подписаться на поток логов (`/logs`) и на текущую скорость (`/traffic`), посмотреть и оборвать активные соединения (`/connections`), перечитать конфиг (`/configs`), заглянуть в правила и провайдеры.
|
||
|
||
Это и стало главным архитектурным следствием: раз управление вынесено в сетевой API, **графический клиент можно писать на чём угодно и кем угодно**. Так появились веб-дашборды (yacd, clash-dashboard, позже metacubexd и zashboard) и десктопные оболочки — все они не встраиваются в ядро, а просто дёргают его API. Поэтому «Clash API» сегодня — это отдельный, живущий своей жизнью стандарт: его поддерживают форки ядра, его эмулируют сторонние проекты, а панели управления рассчитывают именно на него.
|
||
|
||
> [!note] API — это доступ к вашему трафику
|
||
> `external-controller` даёт полный контроль над маршрутизацией и видимость всех соединений. Держите его на `127.0.0.1`, а если нужен доступ извне (например, дашборд роутера) — обязательно задавайте `secret` и закрывайте порт файрволом. Открытый в интернет контроллер без пароля — это чужой человек, переключающий ваши узлы и читающий список ваших соединений.
|
||
|
||
## Clash Premium: закрытая ветка
|
||
|
||
Параллельно с открытым ядром Dreamacro выпускал **Clash Premium** — сборку без исходников, распространявшуюся готовыми бинарниками. По документации проекта в неё входили: **TUN-режим** (виртуальный сетевой интерфейс, перехватывающий весь TCP/UDP системы), **eBPF и auto-redir** для перехвата на Linux, **rule-providers** (правила, подгружаемые из внешних файлов и URL вместо простыни в конфиге), **скриптовые правила** (движки `expr` и Starlark — маршрут вычисляется кодом, а не таблицей) и **профилирование** в духе экспортера метрик.
|
||
|
||
Практический смысл разделения был такой: всё, ради чего Clash ставили на роутер или использовали как системный VPN, жило в закрытой сборке. Открытое ядро оставалось «локальным прокси на порту». Этот разрыв — вместе с невозможностью самостоятельно править закрытый код и добавлять протоколы — и подтолкнул сообщество к форкам, которые реализовали премиальные функции открыто; так вырос [[Clash/02-mihomo|Clash.Meta, ныне mihomo]].
|
||
|
||
## Ноябрь 2023: репозитории исчезли
|
||
|
||
2 ноября 2023 года (по пекинскому времени) разработчик под ником **Fndroid** удалил репозиторий Clash for Windows — самого популярного на тот момент десктопного клиента. 3 ноября последовала волна: по [сводке gfw.report](https://gfw.report/blog/developers_deleted_repos/en/) в течение двух суток **9 репозиториев были удалены** (в их числе само ядро Clash, Clash for Windows, clash-dashboard, ClashForAndroid, GUI.for.Clash) и **11 заархивированы или очищены от истории** (Clash.Meta, ClashX, Clash Verge, ClashMetaForAndroid, tuic, ShellClash и другие).
|
||
|
||
> [!warning] Причины официально не названы
|
||
> Авторы публичных объяснений не оставили, и отчёт gfw.report прямо фиксирует отсутствие подтверждённой причины: задокументированы только сами удаления, их даты и синхронность. В сообществе преобладает версия о давлении на разработчиков в материковом Китае и желании авторов обезопасить себя, но это **предположение, а не установленный факт**. Различайте: факт — репозитории исчезли 2–3 ноября 2023 года; гипотеза — почему.
|
||
|
||
Что это означало практически. Оригинальное ядро Clash развитие прекратило — последние версии остались в зеркалах и форках, обновлений безопасности у них нет. Clash for Windows перестал существовать как проект (распространявшиеся после этого сборки — чужие копии, доверять им как оригиналу нельзя). А вот **формат конфига и Clash API никуда не делись**: они были уже слишком широко внедрены в подписки, панели и клиенты, чтобы исчезнуть вместе с репозиторием. Дальнейшую разработку подхватили форки — про главный из них и написана заметка [[Clash/02-mihomo|mihomo]].
|
||
|
||
> [!danger] Не качайте «Clash» и «Clash for Windows» со случайных сайтов
|
||
> После удаления оригиналов освободившиеся имена активно используют сайты-агрегаторы и сборщики. Проверить подпись или сверить сборку с исходником в этом случае не с чем — оригинального репозитория больше нет. Ставьте живые проекты из их собственных репозиториев (см. [[Clash/07-clients|обзор клиентов]]), а не «Clash» с первой строчки поисковой выдачи: прокси-клиент видит весь ваш трафик, и цена ошибки здесь максимальная.
|
||
|
||
## 📚 См. также
|
||
|
||
- [[Clash/00-overview|Обзор раздела Clash]] — оглавление и порядок чтения.
|
||
- [[Clash/02-mihomo|mihomo (Clash.Meta)]] — форк, который стал основным живым ядром экосистемы.
|
||
- [[Clash/06-features-protocols|Возможности и протоколы mihomo]] — что ядро умеет сегодня, включая функции бывшего Premium.
|
||
- [[Clash/07-clients|Клиенты на ядре Clash/mihomo]] — какие оболочки живы, а какие мертвы.
|
||
- [[Clash/08-vs-sing-box|mihomo против sing-box и Xray]] — чем ядра отличаются и что выбирать.
|
||
- [[xray/clients-and-routing|Клиенты и маршрутизация Xray]] — соседняя экосистема с той же задачей раздельного туннелирования.
|
||
- 🔗 [en.clash.wiki](https://en.clash.wiki/) — сохранившаяся база знаний по оригинальному Clash и Premium.
|
||
- 🔗 [gfw.report: Many Popular Censorship Circumvention Tools Deleted or Archived](https://gfw.report/blog/developers_deleted_repos/en/) — первичная сводка по событиям ноября 2023 года.
|
||
|
||
---
|
||
|
||
> [!quote] 🤖 Эти статьи открыты — можно обучать на них ИИ
|
||
> При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование и скачивание всего репозитория одним zip-архивом доступны в Forgejo: [исходник этой заметки](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main/Clash/01-clash-core.md) · [весь репозиторий](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main).
|