Шейпинг осуществляется с помощью iproute2. Его реализация происходит через внешние скрипты и настраиваемые атрибуты Radius-сервера, получаемые в accept-пакете. Вы можете реализовать свой вариант или изменить наш под ваши нужды. Общий принцип такой :
1. Скрипт init.sh( вызывается при старте системы) - в нем можно проводить инициализацию правил шейпинга;
2.login.sh - сюда добавляются правила шейпинга для нового клиента, появившегося в сети. В это скрипт в качестве параметра передаётся ip пользователя и атрибуты RADIUS, полученные в accept-пакете (настройка атрибутов описана ниже);
3.logout.sh - здесь удаляются правила шейпинга при выходе клиента из сети. В этот скрипт в качестве параметра передаётся ip пользователя.
Мы вам предлагаем свой вариант реализации этих скриптов. Для корректной работы этого варианта в системе должен быть установлен perl. Для его конфигурации надо добавить в файл conf.sh следующие строчки:
USE_MANAD=1 MANAD_INTERFACE=eth0 MANAD_PORT=4567
Здесь USE_MANAD=1 обозначает, что будет использоваться шейпинг, MANAD_INTERFACE - это интерфейс, на котором будет контролироваться трафик клиента и MANAD_PORT - порт, на котором будет слушать перловый скрипт wifi_manad.pl, управляющий шейпингом . Этот скрипт слушает на определённому порту команды на удаление и добавление нового клиента . При добавлении клиента, например, с ip 192.168.184.33, скоростью входящего трафика (downstream ) - 256 кбит/сек, скоростью исходящего трафика (upstream) -128 кбит/сек, он добавляет для него следующие правила :
/sbin/tc class add dev eth0 parent 1:0 classid 1:3 htb rate 256kbit burst 4k prio 1 /sbin/tc qdisc add dev eth0 parent 1:3 handle 3: sfq perturb 10 quantum 1500 /sbin/tc class add dev eth0 parent 1:0 classid 1:4 htb rate 128kbit burst 4k prio 1 /sbin/tc qdisc add dev eth0 parent 1:4 handle 4: sfq perturb 10 quantum 1500 /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 3 u32 match ip dst 192.168.184.33 flowid 1:3 /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 4 u32 match ip src 192.168.184.33 flowid 1:4
А при удалении клиента 192.168.184.33 скрипт выполняет следующие команды:
/sbin/tc filter del dev eth0 parent 1:0 protocol ip prio 3 /sbin/tc filter del dev eth0 parent 1:0 protocol ip prio 4 /sbin/tc class del dev eth0 parent 1:0 classid 1:3 htb rate 256kbit burst 4k prio 1 /sbin/tc class del dev eth0 parent 1:0 classid 1:4 htb rate 128kbit burst 4k prio 1
Для правильной работы данного скрипта нужно настроить RADIUS-атрибуты, которые мы хотим получить из accept-пакета от RADIUS-сервера . В данном случае нас интересует два атрибута: ограничение входящей скорости (downstream) и значение исходящей скорости (upstream). Для этих атрибутов в файл в dialup_wifi_agent нужно добавить следующие настройки:
wifi.agent.radius.atrubute.1.vendor.code=1111 wifi.agent.radius.atrubute.1.attr.code=1 wifi.agent.radius.atrubute.1.type=integer wifi.agent.radius.atrubute.2.vendor.code=1111 wifi.agent.radius.atrubute.2.attr.code=2 wifi.agent.radius.atrubute.2.type=integer
Формат добавления атрибутов следующий:
. - общий вид.
X - это код атрибута. Нумерация должна идти по порядку - 1, 2 и т.д . vendor.code - код производителя , attr.code - код атрибута, type - тип атрибута. Атрибуты настраиваются в файле dictionary.xml Radius-сервера и WiFi-портала (там тоже есть такой файл), и для данного примера можно добавить, например, такие атрибуты:
<vendor code="1111" name="linuxWiFi"> <attribute add="no" name="WiFi-Downstream-Speed-Limit" type="integer" code="1"/> <attribute add="no" name="WiFi-Upstream-Speed-Limit" type="integer" code="2"/> </vendor>
В конфигурация модуля DialUp нужно добавить группы атрибутов :
attrset.4.title=Канал WiFi 256/128 attrset.4.attributes=WiFi-Downstream-Speed-Limit=256;WiFi-Upstream-Speed-Limit=128
Сами группы атрибутов можно задать:
1. для каждого логина DialUp;
2. для услуги в тарифе.;
3. для REALMа (можно использовать, например, realm.default для всех пользователей).
Значения атрибутов, описанных в файле dialup_wifi_agent.properties в точно в таком же порядке (после ip-адреса), подаются в качестве параметров в скрипт login.sh, вызываемый после установки пользователем соединения.