Keenetic Hopper DSL + Entware + XKeen

Keenetic Hopper DSL + Entware + XKeen: VLESS на старом роутере, проблемы, XMUX и решения

Я настра­и­ваю роу­те­ры кли­ен­там, и каж­дая модель при­но­сит свои осо­бен­но­сти. На Keenetic Hopper DSL (KN-3610) уда­лось уста­но­вить Entware и запу­стить VLESS-кли­ент XKeen. Уста­нов­ка упёр­лась в выбор архи­тек­ту­ры и в канал до репо­зи­то­рия. После запус­ка ско­рость ока­за­лась близ­ка к ско­ро­сти кана­ла, а при нагруз­ке выяви­лись два огра­ни­че­ния: плат­фор­мы (про­цес­сор, память) и кон­фи­гу­ра­ции (пара­метр XMUX транс­пор­та xhttp). Для посто­ян­но­го прок­си­ро­ва­ния под нагруз­кой я реко­мен­дую более новую модель, напри­мер Netcraze Titan SE.


Исходные данные

Пара­метр Зна­че­ние
Модель Keenetic Hopper DSL (KN-3610)
Про­шив­ка KeeneticOS 5.01.C.7.0-4
SoC EcoNet EN7516G, 900 МГц
Опе­ра­тив­ная память 256 МБ (в про­стое сво­бод­но око­ло 135 МБ)
Архи­тек­ту­ра (show version, поле arch) mips (big-endian)
Нако­пи­тель USB-флеш­ка, ext4, один USB-порт
Зада­ча VLESS-кли­ент на роу­те­ре с раз­де­ле­ни­ем трафика

Поче­му VLESS. По моим наблю­де­ни­ям, сред­ства филь­тра­ции тра­фи­ка всё луч­ше рас­по­зна­ют WireGuard и AmneziaWG, осо­бен­но в сто­ро­ну круп­ных зару­беж­ных хостин­гов. VLESS с мас­ки­ров­кой под TLS рабо­та­ет в таких усло­ви­ях ста­биль­нее. Это прак­ти­че­ское наблю­де­ние, фор­маль­но­го иссле­до­ва­ния я не проводил.


Проблема 1. Не та архитектура установщика

Симп­том. Уста­нов­ка не стар­ту­ет или ста­вят­ся несов­ме­сти­мые пакеты.

При­чи­на. Боль­шин­ство инструк­ций рас­счи­та­но на совре­мен­ные моде­ли и пред­ла­га­ет aarch64. Ста­рые моде­ли на EcoNet рабо­та­ют на big-endian MIPS, и для них нужен дру­гой каталог.

Реше­ние. Опре­де­лить архи­тек­ту­ру в CLI роутера:

show version

Поле arch опре­де­ля­ет установщик:

arch Ката­лог на bin​.entware​.net
mips mipssf-k3.4
mipsel mipselsf-k3.4
aarch64 aarch64-k3.10

Для arch: mips:

https://bin.entware.net/mipssf-k3.4/installer/mips-installer.tar.gz

Вет­ка mips-k3.4 под­дер­жи­ва­ет­ся мень­ше, чем aarch64 и mipsel, и выбор паке­тов в ней уже.


Проблема 2. Два способа запуска установки

Спо­соб А. Файл на нако­пи­те­ле. Ска­чать архив на ком­пью­тер, поло­жить на нако­пи­тель в пап­ку install без рас­па­ков­ки, затем выбрать нако­пи­тель на стра­ни­це OPKG.

Спо­соб Б. Ссыл­ка в коман­де CLI:

opkg no disk
opkg disk <идентификатор_накопителя>:/ https://bin.entware.net/mipssf-k3.4/installer/mips-installer.tar.gz

Роу­тер сам ска­чи­ва­ет уста­нов­щик по ссылке.

Что про­ве­рить. Иден­ти­фи­ка­тор нако­пи­те­ля дол­жен суще­ство­вать. Спи­сок томов выво­дит коман­да ls в CLI. Несу­ще­ству­ю­щий иден­ти­фи­ка­тор роу­тер при­ни­ма­ет без ошиб­ки, но уста­нов­ка не начи­на­ет­ся. Если после выбо­ра дис­ка в жур­на­ле есть толь­ко запись о назна­че­нии дис­ка, уста­нов­щик не запущен.

При­знак успеш­но­го стар­та: в систем­ном жур­на­ле появ­ля­ют­ся запи­си installer с шага­ми [1/5] … [5/5].


Проблема 3. Загрузка пакетов обрывается на шаге [2/5]

Симп­том. Уста­нов­ка дохо­дит до загруз­ки основ­ных паке­тов и оста­нав­ли­ва­ет­ся. На нако­пи­те­ле оста­ёт­ся око­ло 11 МБ дан­ных, порт 222 не отвечает.

При­чи­на. Паке­ты загру­жа­ют­ся с bin.entware.net. Резуль­тат зави­сит от кана­ла до это­го сер­ве­ра, а не от роу­те­ра. У ряда про­вай­де­ров соеди­не­ния с ним рвут­ся или силь­но замедляются.

Диа­гно­сти­ка, от про­сто­го к сложному:

  1. Открыть https://bin.entware.net/mipssf-k3.4/ в бра­у­зе­ре и ска­чать файл покрупнее.
  2. Повто­рить с мобиль­но­го интер­не­та и сравнить.
  3. На роу­те­ре выпол­нить tools ping bin.entware.net, про­ве­рить дату и время.
  4. Про­ве­рить DNS в настрой­ках под­клю­че­ния и срав­нить пуб­лич­ные адре­са с DNS провайдера.
  5. Про­ве­рить MTU. В моём слу­чае он был в нор­ме (1500 на WAN, 1420 на WireGuard), при­чи­на ока­за­лась не в нём.

Реше­ние. На вре­мя уста­нов­ки я пустил тра­фик роу­те­ра через WireGuard-тун­нель. После это­го загруз­ка и уста­нов­ка паке­тов, а затем и настрой­ка XKeen про­шли без обры­вов. Подой­дёт и дру­гой канал, напри­мер раз­да­ча с теле­фо­на. Уста­нов­щик загру­жа­ет немно­го дан­ных, после уста­нов­ки канал мож­но вернуть.

Состо­я­ние тун­не­ля сто­ит про­ве­рять отдель­но: show interface <имя>, све­жий last-handshake и рас­ту­щие счёт­чи­ки. Ина­че мож­но при­нять рабо­ту через канал за рабо­ту через туннель.


Проблема 4. Could not lock /opt/tmp/opkg.lock

Симп­том. Любая коман­да opkg сооб­ща­ет, что ресурс вре­мен­но недоступен.

При­чи­на. Дру­гой про­цесс opkg ещё рабо­та­ет. Чаще это преды­ду­щий opkg install, кото­рый мед­лен­но загру­жа­ет зависимость.

Диа­гно­сти­ка:

ps | grep opkg
ls -l /opt/tmp/opkg-*/

Выпол­нить ls два­жды с пау­зой 10 – 15 секунд. Если раз­мер ска­чи­ва­е­мо­го фай­ла рас­тёт, загруз­ка идёт. Если не меня­ет­ся боль­ше мину­ты, она остановилась.

Реше­ние, толь­ко если загруз­ка остановилась:

killall opkg wget
rm -f /opt/tmp/opkg.lock
rm -rf /opt/tmp/opkg-*
opkg update

Не пре­ры­вать про­цесс, пока уста­нов­щик Entware не про­шёл шаги [1/5]–[5/5].


Проблема 5. Повреждённые остатки после обрыва

Симп­том. В жур­на­ле при стар­те роу­те­ра: failed to inflate ... tar block is not aligned, затем ошиб­ка мене­дже­ра OPKG.

При­чи­на. После обо­рван­ной загруз­ки на нако­пи­те­ле оста­лись непол­ные архивы.

Реше­ние. Уда­лить вре­мен­ные фай­лы /opt/tmp/opkg-*. Если ошиб­ка повто­ря­ет­ся или уста­нов­ка явно повре­жде­на, отфор­ма­ти­ро­вать нако­пи­тель в ext4 и начать уста­нов­ку заново.


Проблема 6. Два порта SSH

Порт Что откры­ва­ет­ся При­гла­ше­ние Коман­ды
22 CLI KeeneticOS (config)> show, opkg disk, components
222 Обо­лоч­ка Entware ~ # opkg update, opkg install, ps, ls

Коман­да opkg update в CLI роу­те­ра вер­нёт no such command. Порт 222 появ­ля­ет­ся толь­ко после успеш­ной уста­нов­ки Entware. Стан­дарт­ный пароль на 222 нуж­но сме­нить сра­зу после установки.


Проблема 7. Массовая недоступность сайтов под нагрузкой: XMUX

Симп­том. Тун­нель под­нят и рабо­та­ет, но при несколь­ких одно­вре­мен­ных про­вер­ках доступ­но­сти или при рабо­те несколь­ких устройств часть сай­тов недо­ступ­на. Нагруз­ка на про­цес­сор роу­те­ра при этом под­ска­ки­ва­ет до предела.

Что я наблю­дал. На моём соб­ствен­ном роу­те­ре в схе­ме с транс­пор­том xhttp и TLS мобиль­ное при­ло­же­ние Happ с тем же сер­ве­ром ста­биль­но про­хо­ди­ло тесты и дер­жа­ло тун­нель, а роу­тер с XKeen нет. Пара­метр XMUX в кон­фи­ге кли­ен­та на роу­те­ре я про­пи­сал послед­ним, после того как выяс­нил, что Happ зада­ёт эту настрой­ку по умол­ча­нию. После этой прав­ки роу­тер стал ста­биль­но про­хо­дить тесты. Осталь­ные изме­не­ния (огра­ни­че­ние пор­тов, кон­троль дескрип­то­ров) к тому момен­ту уже были внесены.

Реше­ние. В streamSettings исхо­дя­ще­го под­клю­че­ния явно ука­зать xmux:

"xhttpSettings": {
  "path": "/",
  "mode": "auto",
  "xmux": {
    "maxConcurrency": 32
  }
}

maxConcurrency: 32 озна­ча­ет, что до 32 парал­лель­ных запро­сов исполь­зу­ют одно соеди­не­ние, преж­де чем откры­ва­ет­ся новое.

Огра­ни­че­ние. maxConnections и maxConcurrency вза­и­мо­ис­клю­ча­ю­щие, зада­вать нуж­но толь­ко одно из них. Xray-core отвер­га­ет кон­фиг, где нену­ле­вые зна­че­ния зада­ны оба.

Чего я не выяс­нял. Поче­му явная настрой­ка помо­га­ет, если у ядра есть свои зна­че­ния по умол­ча­нию. По исто­рии про­ек­та Xray-core, зна­че­ния по умол­ча­нию там зада­ны как диа­па­зон 16 – 32, поэто­му при­чи­на может зави­сеть от вер­сии ядра или от того, что хра­нит кли­ент­ский кон­фиг. Чис­ло соеди­не­ний до сер­ве­ра с xmux и без него я не счи­тал, поэто­му меха­низм опи­сы­ваю как гипо­те­зу: без явной настрой­ки роу­тер откры­ва­ет мно­го отдель­ных TLS-соединений.

Что важ­но для тех, кто соби­ра­ет кон­фиг. Кон­вер­то­ры ссы­лок и URI в JSON-кон­фиг для Xray, как пра­ви­ло, не добав­ля­ют xmux само­сто­я­тель­но. Про­верь­те резуль­тат вручную.

Как про­ве­рить на сво­ём роу­те­ре. Меняй­те один пара­метр за раз:

  1. Выяс­нить вер­сию ядра: xray version.
  2. Про­гнать нагру­зоч­ный тест без xmux. Во вре­мя теста выпол­нить xkeen -cfd и посчи­тать соеди­не­ния к сер­ве­ру: netstat -tn | grep <адрес_сервера>:<порт> | wc -l, а так­же посмот­реть top.
  3. Доба­вить xmux, выпол­нить xkeen -restart и повто­рить тест с теми же замерами.

Тестирование Hopper DSL

Ско­рость. Заме­ры ско­ро­сти через роу­тер с XKeen ока­за­лись близ­ки к заме­рам на кана­ле провайдера.

Син­те­ти­че­ский тест доступ­но­сти. Я про­гнал роу­тер через тест на стра­ни­це https://​rootrouter​.ru/​o​n​line/. Тест не прой­ден. Во вре­мя теста загруз­ка про­цес­со­ра под­ска­ки­ва­ла до 100%. Тун­не­лю не хва­та­ло сес­сий, сра­ба­ты­ва­ло пра­ви­ло чёр­ной дыры, и часть соеди­не­ний отбра­сы­ва­лась. На этом роу­те­ре пара­метр XMUX в кон­фиг не был прописан.

Руч­ная про­вер­ка. Доступ­ность при руч­ной про­вер­ке соста­ви­ла око­ло 100%. В обыч­ных сце­на­ри­ях (веб, видео, мес­сен­дже­ры) роу­тер рабо­та­ет штатно.

Как я это трак­тую. Син­те­ти­че­ский тест созда­ёт мно­го парал­лель­ных соеди­не­ний за корот­кое вре­мя. Это пре­дель­ный режим, по нему я оце­ни­ваю запас, а не повсе­днев­ную рабо­ту. Повтор­ный тест на Hopper DSL с про­пи­сан­ным XMUX у меня в пла­нах. Пока я не знаю, насколь­ко пара­метр сдви­нет пото­лок на этой моде­ли, а про­цес­сор 900 МГц и 256 МБ памя­ти от кон­фи­гу­ра­ции не зависят.


Как снизить нагрузку

  • Явно про­пи­сать xmux для xhttp (про­бле­ма 7).
  • Прок­си­ро­вать толь­ко нуж­ные доме­ны и под­се­ти. Осталь­ной тра­фик пус­кать напрямую.
  • Огра­ни­чить прок­си­ру­е­мые пор­ты. Для веб-тра­фи­ка обыч­но доста­точ­но 80,443: xkeen -ap 80,443, про­вер­ка теку­ще­го режи­ма xkeen -cp.
  • Вклю­чить кон­троль фай­ло­вых дескрип­то­ров: xkeen -fd, состо­я­ние смот­реть коман­дой xkeen -cfd.
  • Не дер­жать лиш­ние паке­ты и служ­бы на Entware.
  • Сле­дить за памя­тью (free) и сред­ней нагруз­кой (cat /proc/loadavg) во вре­мя реаль­ной рабо­ты, а не в простое.
  • Отклю­чить тун­не­ли и служ­бы, кото­рые боль­ше не нуж­ны после установки.
  • Если упи­ра­е­тесь в чис­ло сес­сий, про­ве­рить лимит таб­ли­цы соеди­не­ний в настрой­ках роу­те­ра (в моей кон­фи­гу­ра­ции ip conntrack max-entries сто­я­ло 16384). Что имен­но огра­ни­чи­ло чис­ло сес­сий в моём тесте, я не выяс­нял, это направ­ле­ние для про­вер­ки, а не уста­нов­лен­ная причина.

Порядок установки, который сработал

  1. Опре­де­лить архи­тек­ту­ру: show version.
  2. Вклю­чить ком­по­нент «Паке­ты OPKG», отфор­ма­ти­ро­вать нако­пи­тель в ext4.
  3. Убе­дить­ся, что роу­тер ста­биль­но кача­ет с bin.entware.net. Если нет, исполь­зо­вать тун­нель или дру­гой канал.
  4. Запу­стить уста­нов­ку одним из двух спо­со­бов (про­бле­ма 2) и дождать­ся шага [5/5].
  5. Зай­ти по SSH на порт 222, выпол­нить opkg update, сме­нить пароль.
  6. Уста­но­вить curl и tar, затем XKeen по инструк­ции проекта.
  7. Настро­ить VLESS-под­клю­че­ние. Для xhttp сра­зу про­пи­сать xmux.
  8. Огра­ни­чить прок­си­ру­е­мые пор­ты и вклю­чить кон­троль дескрипторов.
  9. Настро­ить пра­ви­ла раз­де­ле­ния тра­фи­ка, про­гнать тест под нагрузкой.
  10. Вер­нуть канал в обыч­ное состо­я­ние, отклю­чить вре­мен­ный туннель.

Вывод

Ста­рые Keenetic настро­ить мож­но, но огра­ни­че­ния плат­фор­мы про­яв­ля­ют­ся при пико­вой нагруз­ке. Труд­но­сти настрой­ки ока­за­лись в четы­рёх местах: архи­тек­ту­ра уста­нов­щи­ка, канал до репо­зи­то­рия, ресур­сы роу­те­ра и пара­метр XMUX в кли­ент­ском кон­фи­ге. В обыч­ных сце­на­ри­ях Hopper DSL с XKeen рабо­та­ет штат­но, а ско­рость близ­ка к ско­ро­сти кана­ла. Если роу­тер нужен для посто­ян­но­го прок­си­ро­ва­ния под боль­шим чис­лом соеди­не­ний, я реко­мен­дую брать новую модель, напри­мер Netcraze Titan SE. Акту­аль­ные харак­те­ри­сти­ки све­ряй­те в доку­мен­та­ции производителя.