Обновить

Точечная маршрутизация на роутере через VLESS/Trojan-подписку со своей балансировкой (OpenWrt/Keenetic)

Уровень сложностиСредний
Время на прочтение18 мин
Охват и читатели17K
Всего голосов 16: ↑16 и ↓0+18
Комментарии22

Комментарии 22

В Re:HomeProxy уже это есть + можно установить и настроить что-бы трафик на определенные ресурсы шел через Zapret или Bydpi.

https://habr.com/ru/articles/1036064/

Крутой проект - но решает немного другую задачу:HomeProxy (как и Zapret/ByDPI) больше про обход DPI на конкретных ресурсах, а SmartRoute — про то, как стабильно жить с подпиской на пул из десятков серверов (через балансировку)

Из того, чего в HomeProxy явно нет:

  • Кроссплатформенность — один и тот же пакет ставится и на KeenticOS, и на чистый OpenWrt (там встроенный перехват трафика xkeen -ap не работает на nftables — пришлось писать свой).

  • Постоянный балансировщик — это вообще главная идея проекта. Каждые N минут SmartRoute гоняет Xray'евский Observatory (app/observatory, реальный health-check через полный VLESS/REALITY-хендшейт, а не просто TCP-пинг) по всем серверам подписки и выбирает живой с наименьшей задержкой. Причём если сработало правило — например, переход на конкретный сайт — серверы именно этого правила проверяются в приоритете, а не наравне со всем пулом.

Ещё пара отличий: в статье про HomeProxy явно написано, что в кастомных правилах можно использовать только доменные списки (причем указанна ссылка на списки ItDog, чьей статьёй я и вдохновлялся). А у нас была потребность ещё и в CIDR/IP-диапазонах — часть трафика (Telegram MTProto и подобное) вообще не несёт SNI/DNS, по домену её не поймать. Поэтому в кастомных правилах SmartRoute — geosite-списки, свои домены и CIDR-диапазоны можно собрать во едину в одно правило (а CIDR можно вбить руками или загрузить в формате .bat-роутов Keenetic).

Плюс из ИБ: Kill-Switch без окна уязвимости и защита от утечек — DNS, IPv6, QUIC/HTTP3.

Хоумпрокси это монстр, который тащит за собой кучу зависимостей и жрет память как не в себя. Для слабого кинетика нужен легковесный скрипт, а не комбайн для всего на свете

Честно говоря, не понял преимущества над решением itdog, сам последний активно использую. И балансировка на singbox отлично работает. И домены дополнительные можно легко прописывать через интерфейс в ip sets. И любые правила по ИП или диапазону как входящему, так и исходящему можно гибко создавать, указывая им соответствующую таблицу. Единственное, давно не видел обновления в репозитории itdog и на новых прошивках не работает. Поэтому навайбкодил форк для openwrt 25+ версий, немного упростив для своих целей.

Скрытый текст

Он его уже давно не поддерживает, так как появился podkop

О! Не знал, что подкоп его. Всегда думал, что это просто прокси, оказалось что тот же domain routing + fake ip. А где можно прочитать про "отравление" днс-записей в приложениях, которые сами кэшируют IP, в случае смены сети. Речь в первую очередь про стек cronet (youtube, google maps, etc)?

Очень не хватало именно такого решения. Запарился руками перебирать конфиги через xkeen-UI. Голову сломал в попытках понять и завести Zashboard. У вас все выглядит очень органично, интуитивно просто и понятно. Спасибо за ваш труд!

Passwall2 на OpenWRT вроде имеет все эти функции

Passwall2 комбайн, с множеством настроек, для рядового пользователя придется покурить его фичи

Я правильно понимаю что это будет работать пока ркн не заблокирует оставшиеся фингерпринты?

С килл-свитчами всегда одна история - они отлично блокируют утечки, но при падении демона кладут весь локальный интернет в доме. Жена спасибо не скажет, когда умный пылесос отвалится из-за зависшего бинарника

Я это тестил специально три дня, Килл свитч, ток на конкретный маршрут устанавливается - у меня было требование от ревьювера - хочу что бы клод не запалил мой РФ IP. Поэтому глобально на всю сеть он не работает (пылесос не сдохнет).
Кстати да, если бинарь сдохнет, то клоду может в теории пропалиться реальный IP (это я проверю попозже)

Вы завели XKeen на OpenWRT? Не понимаю, какая часть документации относится к тем, у кого нет кинетиков.

Именно, вся документация для тех у кого нет кинетиков - все спокойно штатно заводиться на OpenWRT (и вся дока под OpenWRT - все было протестированно полностью)

Весь этот чужеродный рантайм ( Entware и XKeen ) ставится вами на OpenWRT? Есть другие проекты с такими системными требованиями - или вы единственный?

Лично мой интерес простой: я не прочь попробовать и ради этого остановить рабочий Re: HomeProxy на моей 25.12.5. Но не хочу вступать на скользкую дорогу в один конец, нужен путь отката.

Ну гарантий естесвенно дать не могу, я же без понятия какой роутер у вас. К тому же я все еще дорабатываю и тестирую в полную проект. Причем на OpenWRT и кинитике одновременно. Вот например, скрины с WRT без SmartRouteUI (без нашего красивого UI) на голом WRT: https://github.com/LackyCraft/xkeen-smartroute/tree/master/docs/screenshots/OpenWRTUI

Ну если хочеться попробывать или бекап делать полный или роутер взять тестовый старый, какой-нибудь.

Очень много вопросов, и проблем в ЛС не успеваю всем отвечать.
1. Да кинетик сейчас недоконца поддержан - продолжаю адаптировать пакет, в отдельной ветке сейчас тестирую работу на кинетике и стабилизирую (ветка уже есть на гитхабе) - но не до конца дописана и протестирована
2. У многих возникают мелкие вопросы по установке, постараюсь записать видео инструкцию и выложу дополнительно в статью.

  1. Полная поддержка Кинетиков добавлена в версии v2.1.0

2.🛠 XKeen SmartRoute v2.2.0 — фикс для свежего OpenWrt
Если у вас OpenWrt 25.12+ и установка падала с ошибкой не удалось поставить entware xray-core — это была реальная проблема, воспроизведена и исправлена на живом железе (Netis N6, чистая установка OpenWrt 25.12.5). Причина — конфликт пакетов из-за того, как теперь работает установщик xkeen.Обновление уже в master, тег v2.2.0. Ставьте заново той же командой из README — проверено end-to-end: установка, реальная подписка, профиль, маршрутизация трафика.

https://github.com/LackyCraft/xkeen-smartroute/releases/tag/v2.2.0

@DanyByLuckyCraft
1) Часть людей настраивает роутинг (профили маршрутизации) путем исключения русских зон адресов и/или доменов *.ru, а не разрешения ограниченного набора внешних серверов. Как это сделать в вашем gui (1001)?
2) На keenetic/netcraze entware у вас не работает пинг серверов в подписке. Если почините, то нужно еще сделать выбор между способами пинга: icmp ping, tcp port, http head (да, head вместо тяжелого get).
3) Я бы рекомендовал вам для недостающих команд использовать вашу собственную сборку busybox-static, но можете другой путь.
4) Кто-то забыл при обычной или идемпотентеной установке выполнить генерацию скрипта автозапуска xkeen -ri , из-за чего админка xkeen-ui (1000) не может перезапустить ядро.
5) Еще можно в документации предложить пользователю предварительно самостоятельно поставить xray-core, а также xray-geoip, xray-geosite через opkg и убрать страшное ограничение для свободного места в этом случае. Проблема в том, что ваш скрипт пытается какую-то отдельную версию xray-core поставить, отличную от доступной в системе.
6) Ваш скрипт жестко завязан на wget, который в keenetic/netcraze кривой, даже если доустановить через opkg install wget-ssl wget-nossl wget, потому что сертификатов не хватает. Хорошо было бы разрешать opkg install curl как альтернативу, чтобы ваш скрипт при установке втихую не зависал.
7) Кроме того opkg зависит от своей облегченной версии wget-nossl или подобной из busybox, поэтому wget лучше не трогать, чтобы при одном из обнолений неожиданно не сломался в процессе opkg.
8) Я не знаю насколько критично для засорения оперативной памяти, замедления, но я пожал бинарники в /opt, включая очевидно самый громадный, чтобы всё влезло на внутреннюю флешку 55 MB, через команду (upx --best --lzma /path/to/your_binary_here): https://pastebin.com/uYgxKHF9

1) Сознательно не хотел этого делать, но подумаю об этом.
2) Пинг работает, если есть воспроизводящая ошибка - зарегистрируете в issue на гитхабе - посмотрим. На двух кинтеках тестировали.
2.1)  выбор между способами  - внесли в беклог

3) Подумаем над этим
4) Внесли в беклог
5) Внесли в беклог
6) Баг это на самом деле, который мы временно да исправили через wget-ssl wget-nossl wget - Внесли в беклог. Ваше предложение куда лучше
7) Учтем при разборе п 6)
8) Возьмем на заметку

@DanyByLuckyCraft Оставшиеся уточнения, начиная с наиболее важных...

9) В профилях маршрутизации нужны Супергруппы (все сервера из подписки вместо конкретных) помимо Групп и Конкретных Серверов. Ваша идея с обновлением измененных параметров конкретных серверов хорошая в идеальном мире собственных серверов. Однако в мире пользователей качественных платных массовых готовых подписок за неделю сервера внутри подписки меняются все на новые, за исключением разве что пары бесполезных медленных резервных. Поэтому я получаю необходимость заходить в ваш gui 1001 каждый день-два и руками проставлять галки на новых серверах вместо ушедших. Режим задействования набора подписок или отдельной подписки целиком в виде Супергрупп в моём случае более разумен (в сочетании вашей автоматической проверкой жизнеспособности observatory).

10) Баг при установке, когда пытается создать конфиги в еще несуществующей папке, поэтому в начале вашего скрипта установки нужно добавить: mkdir -p /opt/etc/xray/configs

11) Для пользователей внутренней памяти ubifs/jffs2 вместо внешней usb флешки ext3/ext4 я упоминал про возможность сжатия бинарников через upx, так вот пробы показали, что самый большой бинарник xray, а также bash, сжимать не нужно, потому что он при распаковке забивает почти всю оперативку (распаковать их обратно можно через upx -d). А вот остальные служебные программы, такие как wget-ssl, wget, curl, file, upx, jq, coreutils-base64, coreutils-tr, coreutils-timeout, unzip, tar, grep, sed и прочие, которые можно добавить до вашей установки, можно сжимать.

12) В вашем gui 1001 кнопки Reastart/Перезапустить конечно полезны, но я бы сделал недоступной кнопку Stop/Стоп для самого gui 1001 (Панель SmartRoute gateway), потому что уже несколько раз на нее нажимал случайно, и потом приходилось роутер перезагружать или по ssh подключаться и сервис поднимать (в большинстве случаев вполне достаточно кнопок Start и Restart). Или хотя бы предупреждение при нажатии, действительно ли хотите выключить полностью до следующей перезагрузки роутера.

13) Для меня было не очень очевидно, что основное ядро маршрутизации при необходимости лучше останавливать через gui 1001, а не через gui 1000. А также для меня неочевидно зачем держать по умолчанию включенным gui 1000 (ведь отображаемые в нем конфиги часто перетираются).

14) Остается неочевидным момент, в какой конфиг я могу прописать вручную дополнительные правила исключения для русских ip и доменов, чтобы ваша система их не перетирала.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации