MagiTrickle (произносится как Мэджитрикл) – утилита для точечной маршрутизации сетевого трафика по заданным доменным именам. Представляет собой установочный пакет, устанавливаемый в дополнение к операционной системе маршрутизатора.
Принцип работы основан на подмене основного DNS-сервера через промежуточный компонент без его отключения. Это позволяет перехватывать входящие DNS-запросы, кешировать ответы и сопоставлять IP-адреса с доменными именами. Благодаря этому становится возможной маршрутизация трафика без необходимости очистки DNS-кэша на стороне клиентов. Очистка кэша требуется только при запуске или перезапуске сервиса MagiTrickle, поскольку в этот момент кэш ещё не прогрет, и маршрутизация невозможна до первого запроса к нужному домену.
Это форк MagiTrickle с дополнительными возможностями: redir-tproxy, подписки на правила, захват DNS-запросов и др.
Entware (Keenetic):
opkg update && opkg install wget-ssl ca-certificates && wget -qO- https://raw.githubusercontent.com/badigit/MagiTrickle_mod_badigit/mod_badigit/scripts/install.sh | sh
OpenWrt:
wget -qO- https://raw.githubusercontent.com/badigit/MagiTrickle_mod_badigit/mod_badigit/scripts/install.sh | sh
Скрипт автоматически определяет платформу (Entware / OpenWrt opkg / OpenWrt apk), архитектуру, скачивает последнюю версию с GitHub и устанавливает. Для обновления — та же команда.
Охватывает указанный домен и все его поддомены.
Например, при записи example.com будут обрабатываться:
✅ example.com
✅ sub.example.com
✅ sub.sub.example.com
❌ anotherexample.com
❌ example.net
Шаблон с * и ? — позволяет задавать гибкие условия:
* — любое количество любых символов? — ровно один любой символНапример, при записи *example.com будут обрабатываться:
✅ example.com
✅ sub.example.com
✅ sub.sub.example.com
✅ anotherexample.com
❌ example.net
Правило применяется только к строго указанному домену, без поддоменов.
Например, при записи sub.example.com будут обрабатываться:
❌ example.com
✅ sub.example.com
❌ sub.sub.example.com
❌ anotherexample.com
❌ example.net
Для опытных пользователей. Используется парсер dlclark/regexp2.
Например, при записи ^[a-z]*example\.com$ будут обрабатываться:
✅ example.com
❌ sub.example.com
❌ sub.sub.example.com
✅ anotherexample.com
❌ example.net
MagiTrickle поддерживает маршрутизацию трафика через прозрачный прокси (например, mihomo, sing-box) с использованием комбинации TCP REDIRECT + UDP TPROXY.
Преимущества:
Ограничения:
Прокси-сервер (mihomo, sing-box и т.д.) должен принимать перенаправленный трафик (TCP REDIRECT + UDP TPROXY) на выбранном порту.
Пример для mihomo (config.yaml):
redir-port: 5001
Важно: в mihomo используйте именно
redir-port, а неtproxy-port. MagiTrickle перенаправляет TCP через nat/REDIRECT, а UDP через mangle/TPROXY —redir-portкорректно обрабатывает оба типа трафика на одном порту. При использованииtproxy-portTCP-соединения будут устанавливаться, но ответы не будут доходить до клиента.
Важно:
allow-lan: trueобязателен. Без него mihomo слушает только на127.0.0.1, и перенаправленный iptables трафик от устройств в сети не будет принят.
Полный минимальный пример конфига mihomo: examples/mihomo-global.yaml
DNS-запросы обрабатывает роутер, mihomo DNS выключен. Самый простой вариант для режима global.
mihomo:
dns:
enable: false
MagiTrickle:
app:
dnsProxy:
upstream:
address: 127.0.0.1
port: 53
mihomo резолвит DNS и ведёт маппинг IP↔домен. Нужен, если mihomo использует доменные правила.
mihomo:
dns:
enable: true
listen: 0.0.0.0:6868
enhanced-mode: redir-host
nameserver:
- 8.8.8.8
- 8.8.4.4
MagiTrickle:
app:
dnsProxy:
upstream:
address: 127.0.0.1
port: 6868
То же, что вариант B, но DNS-запросы маршрутизируются через указанную proxy-group — провайдер не видит DNS. После # указывается имя группы из proxy-groups.
mihomo:
dns:
enable: true
listen: 0.0.0.0:6868
enhanced-mode: redir-host
nameserver:
- "8.8.8.8#GLOBAL"
- "8.8.4.4#GLOBAL"
proxy-server-nameserver:
- 8.8.8.8
- 8.8.4.4
proxy-server-nameserver — DNS для резолва адресов самих прокси-серверов (без #, напрямую, чтобы избежать рекурсии).
MagiTrickle:
app:
dnsProxy:
upstream:
address: 127.0.0.1
port: 6868
В вариантах B и C redir-host позволяет mihomo сопоставлять IP-адреса с доменами из своего DNS-кэша.
В конфиге /opt/var/lib/magitrickle/config.yaml укажите порт прокси-сервера:
netfilter:
tproxyPort: 5001
Где tproxyPort — тот же порт, что настроен в прокси-сервере на шаге 1.
/opt/etc/init.d/S99magitrickle restart
После запуска в веб-интерфейсе MagiTrickle появится виртуальный интерфейс redir-tproxy. Назначьте его группам правил, трафик которых должен идти через прозрачный прокси.
В разделе «Настройки» можно указать IP-адреса или CIDR-подсети клиентов, трафик которых не должен обрабатываться MagiTrickle. Те же параметры доступны в конфиге:
app:
clientRouting:
mode: exclude
sourceNetworks:
- 192.168.1.50
- 192.168.2.0/24
- 2001:db8:1234::/64
Изменение применяется к новым соединениям без перезапуска. Для отдельных IPv4-устройств рекомендуется закрепить адрес в DHCP; временные IPv6-адреса лучше исключать стабильной клиентской подсетью.
Если один и тот же IP попадает и в direct-группу, и в группу с туннелем, побеждает direct — независимо от того, где группы стоят в списке. Это поведение по умолчанию. Конфигам, где широкая direct-группа стоит внизу как catch-all, а узкие группы с туннелем выше, нужен режим «по порядку»:
app:
netfilter:
directPriority: byOrder # absolute (по умолчанию) | byOrder
В режиме byOrder direct участвует в общей очереди наравне с остальными группами: пересечение выигрывает та группа, что выше в списке. Настройка читается при старте, поэтому её смена требует перезапуска демона.
Поведение обоих режимов проверяется интеграционным тестом на настоящем netfilter — в изолированных network namespace, без участия роутера:
sudo bash scripts/integration-test.sh
Раннер поднимает пару namespace и гоняет в них ВСЕ интеграционные тесты пакета (включая проверку client-bypass, которая раньше писала в ядро хоста). Тест приоритета, соединённых veth, применяет правила рабочим кодом, пропускает трафик на IP, который лежит сразу в двух группах, и по счётчикам правил проверяет, какая группа его перехватила. Требуется Linux с root, ip, iptables и ipset (в WSL работает).
Go
49.3%
Svelte
20.7%
TypeScript
13.7%
Shell
7.3%
Python
6.4%
PowerShell
1.5%
MagiTrickle (произносится как Мэджитрикл) – утилита для точечной маршрутизации сетевого трафика по заданным доменным именам. Представляет собой установочный пакет, устанавливаемый в дополнение к операционной системе маршрутизатора.
Принцип работы основан на подмене основного DNS-сервера через промежуточный компонент без его отключения. Это позволяет перехватывать входящие DNS-запросы, кешировать ответы и сопоставлять IP-адреса с доменными именами. Благодаря этому становится возможной маршрутизация трафика без необходимости очистки DNS-кэша на стороне клиентов. Очистка кэша требуется только при запуске или перезапуске сервиса MagiTrickle, поскольку в этот момент кэш ещё не прогрет, и маршрутизация невозможна до первого запроса к нужному домену.
Это форк MagiTrickle с дополнительными возможностями: redir-tproxy, подписки на правила, захват DNS-запросов и др.
Entware (Keenetic):
opkg update && opkg install wget-ssl ca-certificates && wget -qO- https://raw.githubusercontent.com/badigit/MagiTrickle_mod_badigit/mod_badigit/scripts/install.sh | sh
OpenWrt:
wget -qO- https://raw.githubusercontent.com/badigit/MagiTrickle_mod_badigit/mod_badigit/scripts/install.sh | sh
Скрипт автоматически определяет платформу (Entware / OpenWrt opkg / OpenWrt apk), архитектуру, скачивает последнюю версию с GitHub и устанавливает. Для обновления — та же команда.
Охватывает указанный домен и все его поддомены.
Например, при записи example.com будут обрабатываться:
✅ example.com
✅ sub.example.com
✅ sub.sub.example.com
❌ anotherexample.com
❌ example.net
Шаблон с * и ? — позволяет задавать гибкие условия:
* — любое количество любых символов? — ровно один любой символНапример, при записи *example.com будут обрабатываться:
✅ example.com
✅ sub.example.com
✅ sub.sub.example.com
✅ anotherexample.com
❌ example.net
Правило применяется только к строго указанному домену, без поддоменов.
Например, при записи sub.example.com будут обрабатываться:
❌ example.com
✅ sub.example.com
❌ sub.sub.example.com
❌ anotherexample.com
❌ example.net
Для опытных пользователей. Используется парсер dlclark/regexp2.
Например, при записи ^[a-z]*example\.com$ будут обрабатываться:
✅ example.com
❌ sub.example.com
❌ sub.sub.example.com
✅ anotherexample.com
❌ example.net
MagiTrickle поддерживает маршрутизацию трафика через прозрачный прокси (например, mihomo, sing-box) с использованием комбинации TCP REDIRECT + UDP TPROXY.
Преимущества:
Ограничения:
Прокси-сервер (mihomo, sing-box и т.д.) должен принимать перенаправленный трафик (TCP REDIRECT + UDP TPROXY) на выбранном порту.
Пример для mihomo (config.yaml):
redir-port: 5001
Важно: в mihomo используйте именно
redir-port, а неtproxy-port. MagiTrickle перенаправляет TCP через nat/REDIRECT, а UDP через mangle/TPROXY —redir-portкорректно обрабатывает оба типа трафика на одном порту. При использованииtproxy-portTCP-соединения будут устанавливаться, но ответы не будут доходить до клиента.
Важно:
allow-lan: trueобязателен. Без него mihomo слушает только на127.0.0.1, и перенаправленный iptables трафик от устройств в сети не будет принят.
Полный минимальный пример конфига mihomo: examples/mihomo-global.yaml
DNS-запросы обрабатывает роутер, mihomo DNS выключен. Самый простой вариант для режима global.
mihomo:
dns:
enable: false
MagiTrickle:
app:
dnsProxy:
upstream:
address: 127.0.0.1
port: 53
mihomo резолвит DNS и ведёт маппинг IP↔домен. Нужен, если mihomo использует доменные правила.
mihomo:
dns:
enable: true
listen: 0.0.0.0:6868
enhanced-mode: redir-host
nameserver:
- 8.8.8.8
- 8.8.4.4
MagiTrickle:
app:
dnsProxy:
upstream:
address: 127.0.0.1
port: 6868
То же, что вариант B, но DNS-запросы маршрутизируются через указанную proxy-group — провайдер не видит DNS. После # указывается имя группы из proxy-groups.
mihomo:
dns:
enable: true
listen: 0.0.0.0:6868
enhanced-mode: redir-host
nameserver:
- "8.8.8.8#GLOBAL"
- "8.8.4.4#GLOBAL"
proxy-server-nameserver:
- 8.8.8.8
- 8.8.4.4
proxy-server-nameserver — DNS для резолва адресов самих прокси-серверов (без #, напрямую, чтобы избежать рекурсии).
MagiTrickle:
app:
dnsProxy:
upstream:
address: 127.0.0.1
port: 6868
В вариантах B и C redir-host позволяет mihomo сопоставлять IP-адреса с доменами из своего DNS-кэша.
В конфиге /opt/var/lib/magitrickle/config.yaml укажите порт прокси-сервера:
netfilter:
tproxyPort: 5001
Где tproxyPort — тот же порт, что настроен в прокси-сервере на шаге 1.
/opt/etc/init.d/S99magitrickle restart
После запуска в веб-интерфейсе MagiTrickle появится виртуальный интерфейс redir-tproxy. Назначьте его группам правил, трафик которых должен идти через прозрачный прокси.
В разделе «Настройки» можно указать IP-адреса или CIDR-подсети клиентов, трафик которых не должен обрабатываться MagiTrickle. Те же параметры доступны в конфиге:
app:
clientRouting:
mode: exclude
sourceNetworks:
- 192.168.1.50
- 192.168.2.0/24
- 2001:db8:1234::/64
Изменение применяется к новым соединениям без перезапуска. Для отдельных IPv4-устройств рекомендуется закрепить адрес в DHCP; временные IPv6-адреса лучше исключать стабильной клиентской подсетью.
Если один и тот же IP попадает и в direct-группу, и в группу с туннелем, побеждает direct — независимо от того, где группы стоят в списке. Это поведение по умолчанию. Конфигам, где широкая direct-группа стоит внизу как catch-all, а узкие группы с туннелем выше, нужен режим «по порядку»:
app:
netfilter:
directPriority: byOrder # absolute (по умолчанию) | byOrder
В режиме byOrder direct участвует в общей очереди наравне с остальными группами: пересечение выигрывает та группа, что выше в списке. Настройка читается при старте, поэтому её смена требует перезапуска демона.
Поведение обоих режимов проверяется интеграционным тестом на настоящем netfilter — в изолированных network namespace, без участия роутера:
sudo bash scripts/integration-test.sh
Раннер поднимает пару namespace и гоняет в них ВСЕ интеграционные тесты пакета (включая проверку client-bypass, которая раньше писала в ядро хоста). Тест приоритета, соединённых veth, применяет правила рабочим кодом, пропускает трафик на IP, который лежит сразу в двух группах, и по счётчикам правил проверяет, какая группа его перехватила. Требуется Linux с root, ip, iptables и ipset (в WSL работает).
Go
49.3%
Svelte
20.7%
TypeScript
13.7%
Shell
7.3%
Python
6.4%
PowerShell
1.5%