Настройка ограничения скорости (шейпинг) для трафика WiFi-сети
Шейпинг осуществляется с помощью iproute2. Его реализация происходит через внешний скрипты и настраиваемые RADIUS-атрибуты, получаемые в Accept-пакете от Access-сервера. Вы можете реализовать свой вариант или изменить наш под ваши нужды. Общий принцип такой :
1. Скрипт init.sh ( вызывается при старте системы) - в нем можно проводить инициализацию правил шейпинга;
2. login.sh - сюда добавляются правила шейпинга для нового клиента, появившегося в сети. В это скрипт в качестве параметра передаётся ip пользователя и атрибуты радиуса, полученные в accept-пакете(настройка атрибутов описана ниже).
3.logout.sh - здесь удаляются правила шейпинга при выходе клиента из сети. В этот скрипт в качестве параметра передаётся ip пользователя.
Мы вам предлагаем свой вариант реализации этих скриптов. Для корректной работы этого варианта в системе должен быть установлен perl. Для его конфигурации надо добавить в файл conf.sh следующие строчки:
USE_MANAD=0
#MANAD_INTERFACE_IN=eth0
#MANAD_INTERFACE_OUT=eth1
#MANAD_PORT=4567
Здесь USE_MANAD=1 обозначает, что будет использоваться шейпинг, MANAD_INTERFACE_IN - это интерфейс, на котором будет контролироваться входящий трафик клиента, MANAD_INTERFACE_OUT - это интерфейс, на котором будет контролироваться исходящий трафик клиента, MANAD_PORT - порт, на котором будет слушать perl-скрипт wifi_manad.pl, управляющий шейпингом. Этот скрипт слушает на определённому порту команды на удаление и добавление нового клиента . При добавлении клиента например с ip 192.168.184.33, скоростью входящего трафика (downstream ) - 128 кбит/сек, скоростью исходящего трафика (upstream) - 256 кбит/сек, он добавляет для него следующие правила(eth0 - интерфейс для входящего трафика, eth1 для исходящего) :
/sbin/tc
class
add dev eth0 parent
1
:
0
classid
1
:
3
htb rate 128kbit 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 eth1 parent
1
:
0
classid
1
:
3
htb rate 256kbit burst 4k prio
1
/sbin/tc qdisc add dev eth1 parent
1
:
3
handle
3
: 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 eth1 parent
1
:
0
protocol ip prio
3
u32 match ip src
192.168
.
184.33
flowid
1
:
3
А при удалении клиента 192.168.184.33 скрипт выполняет следующие команды:
/sbin/tc filter del dev eth0 parent
1
:
0
protocol ip prio
3
/sbin/tc filter del dev eth1 parent
1
:
0
protocol ip prio
3
/sbin/tc
class
del dev eth0 parent
1
:
0
classid
1
:
3
htb rate 128kbit burst 4k prio
1
/sbin/tc
class
del dev eth1 parent
1
:
0
classid
1
:
3
htb rate 256kbit burst 4k prio
1
Для правильной работы данного скрипта нужно настроить RADIUS-атрибуты, которые мы хотим получить из Accept-пакета от Access-сервера . В данном случае нас интересует два атрибута: ограничение входящей скорости (downstream) и значение исходящей скорости (upstream). Для этих атрибутов в файл в inet_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
Формат добавления атрибутов следующий:
agent.radius.atrubute.X. - общий вид
X - это код атрибута. Нумерация должна идти по порядку - 1, 2 и т.д . vendor.code - код производителя, attr.code - код атрибута, type - тип атрибута. RADIUS-атрибуты настраиваются в файле dictionary.xml Access-сервера и 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>
Для задания атрибутов возможны 2 варианта
1)Привязка атрибутов к realm'у. Например для realm'а default в конфигурации устройства можно указать:
radius.realm.default.attributes=WiFi-Downstream-Speed-Limit=
256
;WiFi-Upstream-Speed-Limit=
128
2) Привязка атрибутов к опциям модуля Inet в конфигурации устройства:
radius.inetOption.
1
.attributes=WiFi-Downstream-Speed-Limit=
128
;WiFi-Upstream-Speed-Limit=
128
radius.inetOption.
2
.attributes=WiFi-Downstream-Speed-Limit=
256
;WiFi-Upstream-Speed-Limit=
256
Сами опции можно задавать в тарифе и в сервисе.Вкладка "Атрибуты RADIUS"#contract_radius_attributes
Значения атрибутов, описанных в файле inet_wifi_agent.properties, в точно в таком же порядке (после ip-адреса) подаются в качестве параметров в скрипт login.sh, вызываемый после установки пользователем соединения.