Задача обычно узкая. Какой-то сайт правило из подписки увело в прокси, и теперь он на каждом входе требует капчу; или сервис не открывается напрямую и вы хотите увести на узел именно его, и больше ничего. Ни в том, ни в другом случае не нужна новая подписка и переписанные группы. Хватит одной строки.
Правила читаются сверху вниз, первое совпадение всё решает
Получив запрос, ядро идёт по списку 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. Чтобы выяснить, кто именно перехватывает трафик, откройте это соединение на странице соединений — клиент покажет, какому правилу оно соответствовало.
Как узнать, какие домены нужны сайту
- Откройте страницу соединений в клиенте и очистите список, чтобы новые записи бросались в глаза.
- Откройте сайт в браузере и поработайте с ним по-настоящему: войдите, полистайте, откройте картинку, дайте видео проиграть пару секунд.
- Вернитесь на страницу соединений и прочитайте появившиеся имена хостов. Одна страница обычно тянет три группы: основной домен, домен CDN со статикой и домен API для бэкенда. Последние два часто зарегистрированы под именами, никак не похожими на первое.
- Добавить только основной домен — классическая недоделка: страница рисуется, картинки крутятся бесконечно, а запрос авторизации отваливается по таймауту. Закройте все три — тогда правило готово.
Маршрутизация по имени программы
PROCESS-NAME сопоставляет исполняемый файл, открывший соединение, — ровно то, что нужно для «это приложение идёт через прокси, куда бы оно ни лезло». Пишется на разных системах по-разному: в Windows с расширением, например Telegram.exe; в macOS и Linux — имя самого исполняемого файла без суффикса. Кроме того, ядру нужно вообще видеть информацию о процессах, а на некоторых платформах это означает, что клиенту не хватит обычных прав или потребуется включить соответствующую опцию. Когда имя процесса прочитать не удаётся, правило не выдаёт ошибку — оно просто молча никогда не совпадает.
После сохранения
Перезагрузите конфигурацию, чтобы ядро её подхватило. У большинства клиентов кнопка перезагрузки есть на странице профилей, а переключение на другой профиль и обратно делает то же самое. Дальше шаг, на котором спотыкаются: уже установленные соединения маршрут не меняют. Путь TCP-соединения фиксируется в момент рукопожатия, и последующая правка правил до него не доходит. Браузер продолжает переиспользовать keep-alive, поэтому десять обновлений подряд показывают старый путь. Перед проверкой закройте нужные соединения на странице соединений, а особо упрямую вкладку закройте и откройте заново.