27 ноября 2011 в 22:36

Ограничение скорости на DIR-320N/RU

Понадобилось устроить шейпер на какой-нибудь дешевой железке. Железкой планировался быть DIR-320 от известного китайского производителя. Но вместо хорошего и простого DIR-320 приехал ужасный и непонятный DIR-320NRU и начались проблемы.


Изначально идея была проста: ставим OpenWRT и рулим как хотим. Но поставить на NRU OpenWRT пока не представляется возможным (буду счастлив, если кто-нибудь поправит), формат загрузчика непонятный, признаков squashfs в прошивке я беглым взглядом не нашел. Да и времени искать, как-то не оказалось. Поковырявшись в родной прошивке, стало ясно, что для выполнения задачи все необходимые инструменты (читай: tc) в ней есть. Вообще в родной прошивке дофига чего есть, даже man-страницы имеют место наличествовать.

Методом научного тыка и какой-то матери, было установлено, что все изменяемые настройки хранятся в папке /etc/default, (коя является симлинком на /tmp/etc/default, впрочем суть). Все файлы лежащие в этой папке аккуратным образом запаковываются и записываться в nvram командой /usr/sbin/saveconfig, а загружаются (в т.ч. и при старте системы) соответственно /usr/sbin/loadconfig, cat присутствует, chmod тоже, проблем со скриптами нет. Зато есть проблемы с запуском скриптов при загрузке.

Поковырявшись еще немного, обнаружился файл /etc/default/config.json и демон /bin/resident, который этот конфиг парсит и выполняет всякое в конфиге этом прописанное. Написан он по всей видимости небрежно и даже не китайцами, а индусами, или что вероятнее индо-русами строки из файла сразу же пихает на выполнение. Тут-то и прешла инженерная мысль подменить какую-нить строку на скрипт. Первая попавшаяся опция была DMZ-хост — меняем содержимое config.json вида:

"dmz": {
"enable": true,
"ip": "192.168.0.2"
},


на

"dmz": {
"enable": true,
"ip": "`/etc/default/shaper.sh`"
},


resident это все проглатывает и вместо -DNAT --to 192.168.0.1, запускает наш скрипт. А если скрипт возвращает правильный ip-адрес, то еще и DMZ-хост прописывается правильно. Вуаля!

Ну и немного кода на последок:

/etc/default/shaper.sh

tc qdisc del dev br0 root
tc qdisc add dev br0 root handle 1: htb default 2
tc class add dev br0 parent 1: classid 1:1 htb rate 10mbps
tc class add dev br0 parent 1:1 classid 1:2 htb rate 50kbps
for ip in `cat /etc/default/ips`;do
tc class add dev br0 parent 1:1 classid 1:${ip} htb rate 50kbps
tc filter add dev br0 parent 1: protocol ip prio 1 u32 match ip dst 192.168.0.${ip}/32 flowid 1:${ip}
done
echo cat /etc/default/DMZ.txt
led wps progress


сам шейпер, DMZ хост берестся из файла DMZ.txt, /etc/default/ips — последние байты адресов (2 3 4 5..254)
последней строкой включаем на моргание внутреннюю неонку, чтобы раздражала и нервировала, а так же информировала, что все вышенаписанное загрузилось и работает.

Скрипт для подмены

echo Set DMZ Host to 9.9.9.9 via WebIF and run me again!
echo Use /etc/default/DMZ.txt to set DMZ Host IP
sed -i s/9.9.9.9/"\`\/etc\/default\/shaper.sh\`"/g /etc/default/config.json
saveconfig


sed для нас так же оставлен, что не может не радовать.

А больше ничего и не надо. Работает примерно так: настраиваем все как надо в web-интерфейса, прописываем DMZ-host в 9.9.9.9 (там же), соединяемся telnet и запускаем /etc/default/modify.sh
перезагружаем роутер путем выдергивания и вдергивания кабеля или командой reboot.
+51
11886
72
bevice 11,0

Комментарии (16)

+7
Obramko #
Я уж думал, тут будет еще одно «поставил DD-WRT — отпишись на Хабр». А тут действительно интересный подход.
Спасибо!

Кстати, а консоль на роутере откуда? Подцепились к плате?
+6
bevice #
telnet или подцепиться к плате. Я бы с удовольствием поставил OpenWRT и обошелся без интересного подхода, но прошивка не загрузилась, плата оказалась совершенно другой (первый раз увидел, чтобы d-link не распаял UART), загрузчик не CFE, а времени было до утра. Если бы не эта дырка в парсере завалилось бы все дело
0
Obramko #
Вот прямо так внаглую — и telnet есть? Интересно.

А UART там, скорее всего, такой же, как у DIR-300/NRU — 4 дырки на плате, без припаянной гребенки. При некоторой сноровке можно подцепиться.
0
bevice #
Да, UART там стандартный для d-link, подцепиться довольно легко, но как оказалось — не нужно было, телнет цепляется сразу к sh, который там, в отличии от модемов, полноценный (даже автодополнение работает по tab).
Впрочем, если еще раз попадет в руки подобная железка — буду опять цепляться — из-за нехватки времени нераскрытой темой остался загрузчик и прошивка, а поле для экспериментов там большое и режим загрузки прошивки в RAM вселял большие надежды.
0
1099511627776 #
Не U-boot случайно?
0
bevice #
u-boot, но (возможно) дописанный d-link'ом, хотя могу ошибаться.
Железку уже отдал, так что вывод не покажу. Но как попадется — поковыряю.
0
1099511627776 #
По возможности покажете вывод консольки? Уж очень интересно посмотреть
+1
pro100tak #
Молодцом, браво. Это называется — мы пойдём другим путём. Для таких статей ни плюсов ни кармы не жалко.
0
Serrega #
> перезагружаем роутер путем выдергивания и вдергивания
> кабеля или командой reboot


Кстати сказать, у 320 NRU есть кнопка ребут, стильно замаскированная под кромку корпуса.
0
ValdikSS #
О, спасибо! А то купил 300NRU B5 и облом — сторонних прошивок нет. Хотел сделать пару портов свитчами, бридж поднять или поиграться с настройками свитча, если они есть. Понял, что логика свитча сделана не так, как в обычном dir-320, тут каждый вилан на каждый порт. Сначала через веб-интерфейс пытался загнать еще один интерфейс в WAN-vlan, но веб-интерфейс в этом случае не мог поднять соединение на wanе. Тогда написал простенький скрипт и запускаю его через telnet.
0
ValdikSS #
Кстати, в коробку была вложена инструкция как получить исходники прошивки, там надо писать куда-то. Надо бы попробовать.
0
Obramko #
Я получал таким образом исходники DIR-120. Да, можно, но бестолково. В юзерспейсе ничего особо не сделаешь (обычно просто блобы лежат), а цеплять их ядро к OpenWRT — гиблое дело.
0
DeeZ #
Ждал что будет подробно рассказано про шейпер tc, а вы просто нашли что трафик до DMZ шейпится, особо не понимая команд выполняемых в shaper.sh. :(

Уж лучше тогда взять этот
Тут в read.me инфы больше о tc чем в вашей статье, и настройки подробнее описаны и деление каналов есть.
0
DeeZ #
«read.me» — указано услово, все комменты в самом скрипте конечно же.
+1
bevice #
Если вы не заметили, данный пост не о tc, и уж тем более я не собирался писать еще один мануал о классах и очередях tc (поищите, в сети их достаточно).
Заголовок и текст всего лишь описывает недокументированную возможность роутера по запуску собственных скриптов, на реальной задаче.
Извините, что не оправдал ваших ожиданий.
0
solarfly #
www.dd-wrt.com/phpBB2/viewtopic.php?p=647440:

В рамках проекта ZRouter.org ведётся работа по созданию прошивок на базе FreeBSD для различных встраиваемых устройств, таких как беспроводные точки доступа и SOHO-маршрутизаторы. В настоящее время предоставлена возможность сборки рабочих прошивок для следующих устройств: D-Link DAP-1350, D-Link DIR-320/320-NRU/330/615-E4/620/632, D-Link DSA-3110-A1, D-Link DSR-1000N, NorthQ NQ-900, TPLink TL-WR941ND-v3_2 и Ubiquiti RSPRO. Прошивка может быть достаточно легко адаптирована для новых типов устройств, например, для создания прошивки для Asus WL-500g достаточно скопировать базирующуюся на том же SoC прошивку D-Link/DIR-320 и откорректировать настройки. Среди поддерживаемых типовых SoC: Broadcom BCM5354/BCM5836, Ralink RT3052F/RT3050F/RT5350F, Atheros AR7161/AR7242/AR7241/AR7240/AR9132, Intel ixp435 и Cavium CN5010. В ближайшее время для упрощения управления устройствами планируется подготовить web-интерфейс;
Обеспечена поддержка 802.11n для беспроводного оборудования на базе чипов Atheros AR5416, AR9160 и AR9280. Поддерживается работа в режиме станции и точки доступа (hostap), агрегация линков и программная повторная отправка кадров. Производительность драйвера отмечена как хорошая. Пока не реализовано: BAR TX, защита HT, энергосберегающие режимы MIMO, гибкие средства управления интенсивностью потока;
Во FreeBSD/arm продолжена реализация поддержки SoC-платформы Marvell Armada XP, основанной на ARMv6/v7-совместимых CPU Sheeva. Поддерживается загрузка с использованием U-Boot, последовательный порт, контроллер прерываний, таймеры, USB, Ethernet и PCI-Express. Реализована базовая поддержка SMP, которую ещё предстоит доработать. Пока нет поддержки L2-кэша и SATA;
Во FreeBSD/powerpc реализована поддержка SoC APM86290, основанного на процессорах семейства AppliedMicro PACKETpro. Чип включает в себя два ядра PPC465 на базе архитектуры Power, соответствующих спецификации Book-E. В рамках проекта предпринята попытка расширения поддержки Book-E во FreeBSD и создания драйверов для интегрированных в SoC APM86290 периферийных устройств. В настоящий момент уже поддерживается загрузка с использованием U-Boot, CPU PPC465, L1-кэш, консоль через последовательный порт, контроллер прерываний, EHCI USB, менеджер очередей, Ethernet-контроллер, GPIO, I2C. Предстоит реализовать поддержку L2-кэша и довести до конца драйвер для Ethernet;
habrahabr.ru/blogs/bsdelniki/129451/#habracut


Есть добровольцы, готорые попробовать это?

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.