Настройка ограничения скорости (шейпинг) для трафика WiFi-сети (DialUp)
Шейпинг осуществляется с помощью 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
Формат добавления атрибутов следующий:
agent.radius.atrubute.X. - общий вид.
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, вызываемый после установки пользователем соединения.