Всем привет.
Хочу показать небольшой пакет для Entware, который сделал для себя и родных, — вдруг кому-то пригодится, и заодно прошу помочь потестировать на других моделях.
Задача была простая: на роутере есть туннель (у меня клиент поверх TCP 443, но это неважно), и хочется, чтобы через него шло всё зарубежное, а российское — напрямую. Чтобы Кинопоиск, ОЗОН, банки и Госуслуги видели российский IP, а Telegram, YouTube и зарубежные сайты, которые провайдер блокирует или замедляет, работали через туннель. Для всех устройств сразу, включая ТВ и приставки, и без переключений.
Пробовал Bird4Static + antifilter. Работает, но логика «список заблокированного — в туннель» мне не подошла:
новые блокировки и замедления не попадают в список сразу;
зарубежные хостинги, которые провайдер душит (у меня TCP замирает после ~16–33 КБ), идут напрямую;
в antifilter оказалось ~1 900 российских подсетей — CDN, DDoS-защита, сети онлайн-кинотеатров. Из-за них KION уходил в туннель, видел иностранный IP и не показывал фильмы.
Поэтому сделал наоборот:
ручные списки «всегда напрямую» / «всегда в туннель» (домены, IP, подсети, AS);
сети РФ (~8 600 подсетей, ipdeny / ipverse, обновление раз в сутки) — напрямую;
всё остальное — в туннель.
Технически это ip rule и две таблицы маршрутизации, без прокси и перехвата трафика. Скорость = скорость туннеля, CPU не нагружается. Около 1 400 строк POSIX sh.
Что ещё есть:
kill switch: если туннель не отвечает 2 минуты, зарубежное с устройств не утекает напрямую — http-сайты показывают страницу «туннель не работает, российское работает, вот кому написать», остальное сразу получает отказ. Трафик самого роутера (DNS, переподключение) при этом идёт напрямую, чтобы туннель смог подняться. Можно переключить в режим «при падении — всё напрямую»;
сторож в cron: чинит маршруты, когда клиент пересоздаёт интерфейс, меняется шлюз провайдера или адрес сервера;
AS в списках: AS13238 раскрывается во все подсети автономной системы через RIPEstat. Есть готовый список AS российских онлайн-кинотеатров;
веб-панель (свой lighttpd, CGI на shell): статус, режим, редактор списков и проверка «куда пойдёт адрес» — по каждому IP видно, куда он идёт, почему, по какой записи списка и чья это AS, и можно одной кнопкой добавить домен / IP / AS в нужный список;
установка одной строкой, повторный запуск = обновление, есть uninstall. Если стоит Bird4Static — списки переносятся.
curl -fsSL https://raw.githubusercontent.com/kubokot-tech/razvilka/main/dist/razvilka-setup.sh | sh -s -- install
Чего здесь сознательно нет:
это не VPN — туннель ваш, подойдёт любой клиент с интерфейсом (AmneziaWG/WireGuard, sing-box, Xray через tun2socks, OpenConnect, OpenVPN, SSTP). Прозрачные прокси без интерфейса (как XKeen) не подходят;
нет DNS-фильтрации и маршрутизации по доменам — только по IP. Поэтому важен DNS: включите DoH/DoT в KeeneticOS с зарубежными резолверами (1.1.1.1, 9.9.9.9). Тогда DNS-запросы роутера сами уходят в туннель, и провайдер не подсовывает адреса своих заглушек на заблокированные домены — иначе такой домен получит российский адрес, пойдёт напрямую и не откроется. Если туннель упал, трафик самого роутера идёт напрямую, так что DNS не пропадает;
нет IPv6;
GeoIP — по регистрации сетей, поэтому российский сервис на зарубежном CDN пойдёт в туннель. Для таких случаев — ручные списки и проверка адреса в панели.
Это не замена большим решениям с правилами — скорее простой и прозрачный вариант для тех, кому нужна именно схема «РФ напрямую, остальное в туннель», а возиться с прокси не хочется.
Проверено только на Keenetic Ultra (KN-1811, aarch64, KeeneticOS 5.2). Буду рад отчётам с других моделей, особенно mipsel, и с Netcraze — и любой критике: что сломалось, что неудобно, что сделано не так.
Код и описание: https://github.com/kubokot-tech/razvilka (MIT)