Ограничение скорости трафика по ip/net адресам в ОС Linux.
linux slackware shaper bandwidth
🕛 13.10.2006, 10:30
From: raver <raver@sinichka.net.>Newsgroups: email
Date: Mon, 8 Oct 2006 14:31:37 +0000 (UTC)
Subject: Ограничение скорости трафика по ip/net адресам в ОС Linux.
Shaping - Ограничение скорости трафика по ip/net адресам в ОС Linux.
Вторая Редакция.
Вы когда-нибудь хотели ограничить скорость доступа в интернет
определенным компьютерам? Тогда идите и ищите на Opennet.ru. Кроме того
5-ти дневного геморроя со структурами htb, cbq, очередями, утилитой tc
-которые конечно же могут ограничивать скорость но больше рассчитаны на
QoS (Queued Load Balancing) я больше ничего не нашел, так как мне надо
было ограничивать трафик симметрично для клиента, а htb и cbq работают
несимметрично (ограничивают исходящий трафик). Моей целью было создание
предельно простого решения.
Есть такое замечательное бесплатное ПО - rshaper-2.01
Теперь есть версия под ядро 2.6!!!!
Стабильная версия для ядер версии 2.4 : http://ar.linux.it/software/#rshaper
ОС: Slackware Linux 10.2 (Ядра 2.4.31, 2.4.32, 2.4.33).
Тест: Одновременно 2000 Компьютеров Локальной Сети резались данным шейпером.
Результат: Отличный.
Не очень стабильная версия для ядер 2.6 : http://cvs.gnudd.com/index.cgi/rshaper/
ОС: Slackware Linux 11 (Ядро 2.6.18)
Тест: Одновременно 2000 Компьютеров Локальной Сети резались данным шейпером.
Результат: Отличный, за исключением подбора скорости (описано ниже).
Установка версии для ядер версии 2.4.x:
Скачиваем, Распаковываем, Компилируем и Устанавливаем. (Внимание если бы
пересоберете другое ядро в системе, то надо заново скомпилировать и установить
rshaper).
Обратите внимание на документацию прилагаемую вместе с ним; дело в том
что под определенные нужды нужно поменять в файле rshaper.c размер
очереди - параметр RSHAPER_LIMIT_KB по умолчанию он 64KB или 512KB. make make install
Все - rshaper установлен.
Модуль устанавливается в директорию /lib/modules/2.4.x/misc
Утилита управления после установки находится - /usr/local/sbin/rshaperctl
Добавьте в /etc/rc.d/rc.local строку: insmod /lib/modules/2.4.x/misc/rshaper.o
x - последняя цифра в версии ядра.
C помощью rshaperctl мы и можем шейпить отдельный ip или целую подсеть.
rshaperctl 192.168.1.1/32 16000 - скорость для 192.168.1.1 = 128 Kbit/s
или
rshaperctl 192.168.1.0/24 128000 - скорость для подсети 192.168.1.0/24 = 1024 Kbit/s
Все просто ;)
Установка версии для ядер версии 2.6.x
Скачиваем, Распаковываем, Компилируем и Устанавливаем. (Внимание если бы
пересоберете другое ядро в системе, то надо заново скомпилировать и установить
rshaper).
Тут начинаются проблемы: Установить на Slackware 11 c ядром 2.6.18 сходу не получилось,
пришлось воспользоваться молотком.
Полсе распаковки, надо поправить файлы GNUmakefile и Makefile, и rshaper.c
GNUMakefile должен быть такого вида:
KERNELDIR ?= /usr/src/linux LINUX ?= $(KERNELDIR)
VERSIONH := $(LINUX)/include/linux/version.h
IS26 := $(shell grep RELEASE.*2\.6 $(VERSIONH) | wc -l | tr -d ' \t') ifeq ($(IS26), 0)
all:
DRIVER=rshaper.ko
all: $(CLIENTS) $(DRIVER)
$(DRIVER): rshaper.c $(MAKE) -C $(LINUX) M=`pwd` modules
В Makefile надо заменить переменную $VERSION в путях на 2.6.18 к примеру :
Имеем это:
ifeq ($(IS26), 1) INSTALLMOD = /lib/modules/$(VERSION)/extra else # 2.4 INSTALLMOD = /lib/modules/$(VERSION)/misc endif
Получаем это:
ifeq ($(IS26), 1) INSTALLMOD = /lib/modules/2.6.18/extra else # 2.4 INSTALLMOD = /lib/modules/2.6.18/misc endif
В файле rshaper.c находим строчку:
bw = (info.bytes_per_second+HZ/2)/HZ;
Меняем на:
bw = (info.bytes_per_second+HZ/2)/HZ/10;
Далее идем в директорию /lib/modules/2.6.18 и создаем директорию misc
cd /lib/modules/2.6.18 mkdir /lib/modules/2.6.18/misc
Обратите внимание на документацию прилагаемую вместе с ним; дело в том
что под определенные нужды нужно поменять в файле rshaper.c размер
очереди - параметр RSHAPER_LIMIT_KB по умолчанию он 64KB или 512KB.
Ну и заключающая часть.
make -f GNUmakefile make install
Все - rshaper установлен.
Модуль устанавливается в директорию /lib/modules/2.6.x/misc
Утилита управления после установки находится - /usr/local/sbin/rshaperctl
Добавьте в /etc/rc.d/rc.local строку: insmod /lib/modules/2.6.x/misc/rshaper.ko
x - последняя цифра в версии ядра.
C помощью rshaperctl мы и можем шейпить отдельный ip или целую подсеть.
По идее получилось бы то что и под управлением ядра 2.4. Читаем дальше:
rshaperctl 192.168.1.1/32 32000 - скорость для 192.168.1.1 = 32000 bytes/s
или
rshaperctl 192.168.1.0/24 128000 - скорость для подсети 192.168.1.0/24 = 128000 bytes/s
В итоге скорость получается для допустим 192.168.1.1 далеко не 32 KB/s а аж 870KB/s
Теперь решение: идем в /usr/src/2.6.18
cd /usr/src/2.6.18
Начинаем пересборку ядра:
make menuconfig
Интересует параметр ядра - HZ
Он может быть равен в ядре 2.6.18 либо 100, либо 250, либо 1000.
Ставим параметр HZ в значение 100.
Примечание: в ядре должны быть включены jiifies(тики) а не Timestamp, т.к. rshaper
опирается именно на jiffies(тики).
Сохраняем конфиг, далее я думаю кто не знает, тот найдет информацию о том как
собрать и установить свеже-скомпилированное ядро.
Перезагружаем компьютер, смотрим командой lsmod подгрузился ли модуль rshaper
или нет. Если да то начинаем пользоваться командой rshaperctl. После всех манипуляций
вот что мы получим:
rshaperctl 192.168.1.1/32 32000 - скорость для 192.168.1.1 = 32000 bytes/s
Теперь скорость для у 192.168.1.1 должна быть равна 85КБ/c - это уже лучше =)
А теперь Зависимость:
rshaperctl 192.168.1.1/32 2900 = 64 Kbit/s rshaperctl 192.168.1.1/32 5800 = 128 Kbit/s rshaperctl 192.168.1.1/32 11600 = 256 Kbit/s rshaperctl 192.168.1.1/32 23200 = 512 Kbit/s rshaperctl 192.168.1.1/32 46400 = 1024 Kbit/s
Все не так уж и просто ;)
Зато работает ;)
P.S. Возможно это только у меня такие проблемы возникли:
Возможные причины:
1)Процессор Core 2 Duo/1.8GHz - возможно связано с ним и с jiffies
2)Возможно где-то порылась собака в /proc
3)Ядро 2.6.18 - ну тут у меня не было времени тестировать на других версиях
Если кто знает - просьба хотя бы в комментарий отписать в чем дело.