Dummynet
Я как раз тут недавно с этой штукой прикалывался и могу поделиться свежим опытом.
Чтобы сделать приоритезацию трафика надо будет построить шейпер. Делается это с помошью dummynet. Правда он не включен по-умолчанию. Для его работы надо будет собрать свое ядро с такими опциями:
Код: Выделить всё
options IPFIREWALL
options DUMMYNET
options HZ="1000"
После этого появляется новый функционал у ipfw - возможность строить pipe и queue.
Я сижу на DSL модеме с 2mbit/256kbit. Когда тестировал, то игрался я с этим так - построил один pipe с пропускной способностью 2mbit и две queue с "весами" 30 и 70 присоеденив их к этому pipe, а потом заварачивал трафик с двух разных ftp с которых я скачивал, для каждого в свой queue. Общая пропускная способность pipe - 2мбита или примерно 250 килобайт в секунду. Я замерял скорость скачки для каждого паралельного потока - она делилась в пропорции 30/70 - так как и должно было быть в соответсвии с указанными весами у тех queue которые я создал. Когда же оставался только один поток (если остановить вторую скачку) то он забивал весь канал - 2мбита! Как я понимаю это вам и надо?
Если по-простому, то настраевается это так:
Код: Выделить всё
# ipfw pipe 1 config bw 2Mbit/s
# ipfw pipe list
00001: 2.000 Mbit/s 0 ms 50 sl. 0 queues (1 buckets) droptail
# ipfw queue 1 config weight 30 pipe 1
# ipfw queue 2 config weight 70 pipe 1
# ipfw queue list
q00001: weight 30 pipe 1 50 sl. 0 queues (1 buckets) droptail
q00002: weight 70 pipe 1 50 sl. 0 queues (1 buckets) droptail
# ipfw pipe list
00001: 2.000 Mbit/s 0 ms 50 sl. 0 queues (1 buckets) droptail
q00001: weight 30 pipe 1 50 sl. 0 queues (1 buckets) droptail
q00002: weight 70 pipe 1 50 sl. 0 queues (1 buckets) droptail
А теперь задача "завернуть" тот трафик который надо шейпить, в его очередь:
Код: Выделить всё
# ipfw add 90 queue 1 ip from 212.70.161.26 to me
# ipfw add 95 queue 2 ip from 77.234.201.243 to me
# ipfw list
00090 queue 1 ip from 212.70.161.26 to me
00095 queue 2 ip from 77.234.201.243 to me
00100 check-state
00200 allow ip from any to any via lo0
00300 allow icmp from me to any out keep-state
00400 allow tcp from me to any out keep-state
00500 allow udp from me to any out keep-state
65535 deny ip from any to any
(я тут снизил скорость pipe до 200Kbit/s)
# ipfw pipe list
00001: 200.000 Kbit/s 0 ms 50 sl. 0 queues (1 buckets) droptail
q00001: weight 30 pipe 1 50 sl. 1 queues (1 buckets) droptail
mask: 0x00 0x00000000/0x0000 -> 0x00000000/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
0 tcp 212.70.161.26/21 78.84.205.90/62781 626 805157 22 33000 0
q00002: weight 70 pipe 1 50 sl. 1 queues (1 buckets) droptail
mask: 0x00 0x00000000/0x0000 -> 0x00000000/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
0 tcp 77.234.201.243/21 78.84.205.90/56649 152 130487 1 1500 0
Еще один момент - надо через sysctl выставить net.inet.ip.fw.one_pass: 0 - это необходимо чтобы пакеты завернутые в dummynet потом возвращались обатно в фаервол.
Собственно 70% информации вам рассказано - дальше вам же самому будет интереснее, если решите свою проблему сами

Как уж вы будете отлавливать трафик торрента и трафик пользователей и заварачивать каждый на свой queue - решать вам
*подсказка*
На счет идентификации трафика torrent клиента: он ведь у вас работает не от root ? ipfw умеет идентифицировать трафик не только по номерам портов и IP, но и по id пользователя - выкусить трафик торрент клиента можно будет таким способом
