Pull to refresh

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

Reading time2 min
Views21K
Понадобилось устроить шейпер на какой-нибудь дешевой железке. Железкой планировался быть 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.
Tags:
Hubs:
+51
Comments16

Articles