Поступил вопрос в личку, как я организовал шейпер. Отвечу публично, может еще кому пригодится.
Система FreeBSD, первым делом собираем ядро с поддержкой ALTQ, как это сделать:
добавляем в конфиг
options ALTQ
options ALTQ_CBQ # Class Bases Queuing (CBQ)
options ALTQ_RED # Random Early Detection (RED)
options ALTQ_RIO # RED In/Out
options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC)
options ALTQ_PRIQ # Priority Queuing (PRIQ)
options ALTQ_NOPCC # Required for SMP build
http://www.freebsd.org/doc/ru_RU.KOI8-R ... ls-pf.html
Дальше конфигурим PF (/etc/pf.conf)
У меня получилось вот так:
int_if="em0"
ext_if="em1"
vpn_net="10.10.1.0/24"
icmp_types="echoreq"
tarifs="{ tarif-256 tarif-512 tarif-1024 tarif-1536 tarif-2048 tarif-3072 tarif-4096 tarif-5120 tarif-unlim }"
set limit { states 20000, frags 20000, src-nodes 5000 }
set block-policy return
scrub in all
altq on $int_if cbq bandwidth 100Mb queue $tarifs
altq on $ext_if cbq bandwidth 100Mb queue $tarifs
queue tarif-unlim bandwidth 50Mb cbq(default)
queue tarif-256 bandwidth 256Kb cbq
queue tarif-512 bandwidth 512Kb cbq
queue tarif-1024 bandwidth 1024Kb cbq
queue tarif-1536 bandwidth 1536Kb cbq
queue tarif-2048 bandwidth 2048Kb cbq
queue tarif-3072 bandwidth 3072Kb cbq
queue tarif-4096 bandwidth 4096Kb cbq
queue tarif-5120 bandwidth 5120Kb cbq
set skip on lo0
nat pass from $vpn_net to any -> $ext_if
block in
pass out keep state
antispoof quick for { lo $int_if }
pass in quick on $int_if
pass in inet proto icmp from $vpn_net to any icmp-type $icmp_types
anchor "nat/*" from $vpn_net to any
int_if="em0" - локальный интерфейс, который смотрит в локальную сеть
ext_if="em1" - внешний интерфейс, смотрит в интернет
vpn_net="10.10.1.0/24" - диапазон адресов выдаваемых mpd (виртуальные адреса)
загружаем конфиг
Ну считаем, что у вас мпд уже сконфигурен как надо, допустим он при старте запускает скрипт /tmp/up.sh, который содержит следующее:
Код: Выделить всё
#!/bin/sh
echo "pass in from $4 to any queue tarif-256" | pfctl -a "nat/$5" -f -
После подключения для пользователя в якорь nat добавится правило, разрешающее выход в интернет и при этом, весь трафик будет пропущен через очередь tarif-256, тут можно вписать любую нужную очередь из описанных в pf.conf, т.е. tarif-512, tarif-1024 и т.д.
Пример скрипта, который после отключения пользователя удалит правила и все записи из таблицы состояний об этом пользователе(этот скрипт тоже должен быть прописан в конфиге mpd):
Код: Выделить всё
#!/bin/sh
pfctl -a "nat/$5" -F rules
pfctl -k $4
Вроде все, еще пару комманд для диагностики:
Код: Выделить всё
Просмотр списка вложенных якорей
pfctl -a 'nat' -sA
Просмотр списка правил в якоре
pfctl -a 'nat/username' -s rules