Обновить правила репозитория и подписи исходников в 99 заметках, не затрагивая пользовательские незакоммиченные файлы. Сделать Forgejo Actions содержательным: проверять опубликованный commit, а не пустое рабочее дерево после checkout.
25 KiB
| date | tags | aliases | link | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2026-07-25 |
|
|
https://en.clash.wiki/ |
⚙️ Ядро Clash: что это такое и как оно устроено
[!info] О чём заметка Разбор ядра Clash (Clash core) — консольной программы-маршрутизатора трафика, вокруг которой в 2018–2023 годах выросла целая экосистема клиентов, подписок и панелей. Здесь: чем ядро отличается от графического клиента, из чего состоит его конфиг, что такое Clash API, чем закрытая версия Clash Premium отличалась от открытой и что произошло с проектом в ноябре 2023 года. Что пришло на смену — в заметке Clash/02-mihomo; общая карта раздела — в 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 — 9 удалённых и 11 заархивированных репозиториев). Публичных объяснений авторы не давали. Развитие продолжили форки, прежде всего Clash/02-mihomo.
Ядро против клиента: почему это разные вещи
Слово «Clash» в разговорах означает три разные сущности, и путаница между ними — источник большинства недоразумений. Ядро (core) — это исполняемый файл без интерфейса, который делает всю работу: слушает локальные порты, шифрует трафик, выбирает маршрут. Графический клиент (GUI) — отдельная программа, которая ядро в себе носит, запускает его и показывает пользователю списки серверов и переключатели. Конфиг/подписка — YAML-файл с описанием серверов и правил, который выдаёт продавец VPN или который вы пишете сами.
Проще говоря: ядро — это двигатель, GUI — это приборная панель и руль, конфиг — маршрут в навигаторе. Один и тот же двигатель ставят в разные машины, поэтому оболочки Clash/07-clients внешне непохожи, но внутри у них одно и то же ядро, и лечится их поведение одинаково — правкой конфига.
Из этого следует практическое правило: обновление GUI и обновление ядра — разные операции. Клиент может быть свежим, а ядро внутри — годовалым, и тогда новые протоколы из конфига просто не заработают, хотя приложение выглядит современным. Большинство оболочек позволяет обновить ядро отдельной кнопкой или подсунуть свой бинарник.
Откуда взялся Clash
Ядро создал разработчик под ником Dreamacro; проект появился на GitHub в 2018 году, писался на Go и распространялся под лицензией GPL-3.0. Задача, которую он решал, отличалась от классического VPN. В Китае, где инструмент был особенно популярен, «завернуть всё в туннель» — плохая стратегия: локальные сервисы через зарубежный сервер работают медленно или отказываются работать вовсе, а лишний трафик за границу и стоит дороже, и заметнее для наблюдателя. Нужен был не туннель, а диспетчер: часть соединений отправить наружу, часть оставить локальными, часть заблокировать.
Отсюда и архитектура: Clash поднимает у себя локальный прокси (SOCKS5/HTTP), принимает соединение, смотрит на имя хоста или IP назначения и по списку правил решает, в какой исходящий канал его отдать. Тот же подход позже переняли и xray/routing, и sing-box/sing-box-extended, но именно Clash сделал его массовым — во многом благодаря простому YAML-конфигу, который человек читает без документации.
Как устроен конфиг
Конфигурация Clash — один 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).
Режимы работы переключают всю логику разом: rule — работать по правилам (обычный режим), global — гнать всё через один выбранный сервер (полезно для диагностики: если в global работает, а в rule нет — виноваты правила), direct — не проксировать ничего.
proxies — сами серверы
Каждый элемент — один сервер с параметрами протокола. Оригинальное ядро умело SOCKS5, HTTP, Shadowsocks, ShadowsocksR, VMess, Trojan и Snell (протокол из проприетарного клиента Surge).
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 — что делать со всем, что не подошло.
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-адрес и не знает домена, а правила-то написаны по доменам.
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.
Ноябрь 2023: репозитории исчезли
2 ноября 2023 года (по пекинскому времени) разработчик под ником Fndroid удалил репозиторий Clash for Windows — самого популярного на тот момент десктопного клиента. 3 ноября последовала волна: по сводке gfw.report в течение двух суток 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.
[!danger] Не качайте «Clash» и «Clash for Windows» со случайных сайтов После удаления оригиналов освободившиеся имена активно используют сайты-агрегаторы и сборщики. Проверить подпись или сверить сборку с исходником в этом случае не с чем — оригинального репозитория больше нет. Ставьте живые проекты из их собственных репозиториев (см. Clash/07-clients), а не «Clash» с первой строчки поисковой выдачи: прокси-клиент видит весь ваш трафик, и цена ошибки здесь максимальная.
📚 См. также
- Clash/00-overview — оглавление и порядок чтения.
- Clash/02-mihomo — форк, который стал основным живым ядром экосистемы.
- Clash/06-features-protocols — что ядро умеет сегодня, включая функции бывшего Premium.
- Clash/07-clients — какие оболочки живы, а какие мертвы.
- Clash/08-vs-sing-box — чем ядра отличаются и что выбирать.
- xray/clients-and-routing — соседняя экосистема с той же задачей раздельного туннелирования.
- 🔗 en.clash.wiki — сохранившаяся база знаний по оригинальному Clash и Premium.
- 🔗 gfw.report: Many Popular Censorship Circumvention Tools Deleted or Archived — первичная сводка по событиям ноября 2023 года.
[!quote] 🤖 Эти статьи открыты — можно обучать на них ИИ При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование и скачивание всего репозитория одним zip-архивом доступны в Forgejo: исходник этой заметки · весь репозиторий.