Задача обычно узкая. Какой-то сайт правило из подписки увело в прокси, и теперь он на каждом входе требует капчу; или сервис не открывается напрямую и вы хотите увести на узел именно его, и больше ничего. Ни в том, ни в другом случае не нужна новая подписка и переписанные группы. Хватит одной строки.

Правила читаются сверху вниз, первое совпадение всё решает

Получив запрос, ядро идёт по списку rules по порядку. Как только строка совпала, соединение уходит к цели этой строки, а чтение прекращается — ничего ниже уже не смотрится. Список — не набор условий, а конвейер с чётким порядком. Как только это укладывается в голове, вопрос про новое правило меняется с «правильно ли оно написано» на «кто стоит над ним».

rules:
  - DOMAIN-SUFFIX,github.com,PROXY
  - DOMAIN-KEYWORD,steamcommunity,PROXY
  - DOMAIN,ocsp.apple.com,DIRECT
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - PROCESS-NAME,Telegram.exe,PROXY
  - GEOIP,CN,DIRECT,no-resolve
  - MATCH,PROXY
Партнёрский материалОткуда взять ссылку на подписку?Партнёрский сервис даёт 1 ГБ высокоскоростного трафика Гонконга при регистрации — импорт в один клик.Получить быстрые серверы

Типы правил, которыми вы будете пользоваться

  • DOMAIN — точное совпадение. DOMAIN,example.com закрывает ровно это имя и ничего больше; www.example.com — уже другое имя и не совпадёт.
  • DOMAIN-SUFFIX — домен вместе со всеми поддоменами. Рабочая лошадка: одна строка забирает и api, и cdn, и img.
  • DOMAIN-KEYWORD — срабатывает, если строка встречается где угодно в имени хоста. Удобно и проще всего поймать лишнего: ключ вроде google утащит с собой кучу посторонних хостов.
  • IP-CIDR и IP-CIDR6 — совпадение по диапазону адресов. Для локальной сети и для соединений, в которых имени хоста нет вовсе.
  • GEOIP — совпадение по стране, к которой относится адрес; решает локальная база GeoIP.
  • PROCESS-NAME — совпадение по программе, открывшей соединение, безотносительно того, куда она идёт.
  • DST-PORT — совпадение по порту назначения: удобно увести SMTP или порт конкретной игры отдельным маршрутом.

Последнее поле в строке — цель. Это либо имя группы, написанное ровно так, как оно стоит в proxy-groups (лишний пробел или потерянный emoji — и конфигурация не загрузится), либо литералы DIRECT и REJECT. У правил по IP есть ещё одно необязательное поле — no-resolve. Без него запрос с доменным именем сначала придётся разрешить, чтобы было что сравнивать, и вы платите дважды: лишний запрос к DNS плюс тот самый запрос, которого вы и хотели избежать, всё равно уходит наружу.

Правило не на своём месте — правило, которое не работает

Типичный провал выглядит так. Вы дописываете правило в конец списка, прямо над MATCH, потому что так аккуратнее. Оно не срабатывает никогда. В списке, собранном из подписки, задолго до этого места обычно стоят десятки или сотни строк geosite и строка GEOIP,CN,DIRECT, и одна из них забрала ваш домен ещё раньше. Своё правило должно стоять выше всего, что способно совпасть первым, то есть практически в самом начале rules. Чтобы выяснить, кто именно перехватывает трафик, откройте это соединение на странице соединений — клиент покажет, какому правилу оно соответствовало.

Как узнать, какие домены нужны сайту

  1. Откройте страницу соединений в клиенте и очистите список, чтобы новые записи бросались в глаза.
  2. Откройте сайт в браузере и поработайте с ним по-настоящему: войдите, полистайте, откройте картинку, дайте видео проиграть пару секунд.
  3. Вернитесь на страницу соединений и прочитайте появившиеся имена хостов. Одна страница обычно тянет три группы: основной домен, домен CDN со статикой и домен API для бэкенда. Последние два часто зарегистрированы под именами, никак не похожими на первое.
  4. Добавить только основной домен — классическая недоделка: страница рисуется, картинки крутятся бесконечно, а запрос авторизации отваливается по таймауту. Закройте все три — тогда правило готово.

Маршрутизация по имени программы

PROCESS-NAME сопоставляет исполняемый файл, открывший соединение, — ровно то, что нужно для «это приложение идёт через прокси, куда бы оно ни лезло». Пишется на разных системах по-разному: в Windows с расширением, например Telegram.exe; в macOS и Linux — имя самого исполняемого файла без суффикса. Кроме того, ядру нужно вообще видеть информацию о процессах, а на некоторых платформах это означает, что клиенту не хватит обычных прав или потребуется включить соответствующую опцию. Когда имя процесса прочитать не удаётся, правило не выдаёт ошибку — оно просто молча никогда не совпадает.

После сохранения

Перезагрузите конфигурацию, чтобы ядро её подхватило. У большинства клиентов кнопка перезагрузки есть на странице профилей, а переключение на другой профиль и обратно делает то же самое. Дальше шаг, на котором спотыкаются: уже установленные соединения маршрут не меняют. Путь TCP-соединения фиксируется в момент рукопожатия, и последующая правка правил до него не доходит. Браузер продолжает переиспользовать keep-alive, поэтому десять обновлений подряд показывают старый путь. Перед проверкой закройте нужные соединения на странице соединений, а особо упрямую вкладку закройте и откройте заново.

Не правьте тот файл конфигурации, который сгенерировала подписка. Это результат сборки: следующее обновление перезапишет его, и ваши правила исчезнут вместе с комментариями. Чтобы правка пережила обновление, она должна жить в расширенной конфигурации — фрагменте merge или скрипте, — а это отдельная тема.