Разделить канал между компьютерами уже получилось. Теперь хочу сделать ограничение по скорости на битторрент-трафик и весь остальной трафик внутри канала, выделенного отдельному компьютеру.
Например, айпи получает rate=1000кбит. Внутри этих 1000кбит я выделяю для торрентов rate=300,ceil=1000 кбит, а остальной трафик получает rate=700,ceil=1000 кбит.
В S12iptables торрент-трафик помечается отметкой 22:
- код выделить все
if [ "$L7_SUPPORT" = "on" ]; then
...
$INCOMING -i ppp+ -p tcp -m layer7 --l7proto bittorrent -j MARK --set-mark 22
$INCOMING -i ppp+ -p udp -m layer7 --l7proto bittorrent -j MARK --set-mark 22
В оригинальном файле настройки шейпера пакеты с этой меток ловятся так:
- код выделить все
tc filter add dev br0 parent 1:0 prio 1 protocol ip handle 22 fw flowid 1:22
Фильтрую трафик по айпи таким образом:
- код выделить все
tc filter add dev br0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.168.1.0/24 flowid 1:20
Теперь проблема/задача: как совместить фильтрацию по айпи с метками?
Пробовал делать так:
- код выделить все
# torrent
tc filter add dev br0 parent 1:0 prio 3 protocol ip handle 22 fw u32 match ip dst 192.168.1.0/24 flowid 1:202
# other
tc filter add dev br0 parent 1:0 prio 1 protocol ip u32 match ip dst 192.168.1.0/24 flowid 1:201
Но ожидаемый эффект не наблюдается. Каким способом можно сделать такую фильтрацию?
Скрипт целиком: http://pastebin.com/Be0A8FZJ
Обновление
Нашел подходящий вариант для ограничения скорости закачек с сохранением скорости для серфинга: http://pupa.da.ru/tc/ (в самом низу).
Но у меня не заработал. А так идея хороша: давать первые n-кб (1000Кб) на максимальной скорости (160кбит), а потом ограничивать скорость до средней (80кбит).
Вот выдержка кода:
- код выделить все
#User 1
tc class add dev eth0 parent 2:6 classid 2:100 htb rate 160Kbit quantum 3000 # << max speed for user
tc class add dev eth0 parent 2:100 classid 2:100d htb rate 80Kbit cburst 1000kb quantum 3000 #<< average speed and averaging amount of data
tc qdisc add dev eth0 parent 2:100d sfq
tc filter add dev eth0 parent 2:6 protocol ip pref 4 u32 match ip dst 192.168.1.4 classid 2:100d
Обновление
Только к вечеру осознал, что мой скрипт неправильный:
1. Выделяется один класс на подсеть, в то время как думалось, что это выделит по классу каждому айпи в подсети.
2. Для эффективного ограничения торрентов нужно выставлять их классу приоритет и(или) занижать ceil.
Тем не менее вышеописанный вопрос остался (как фильтровать по метке И айпи).
И еще появились новые: 1. можно ли цеплять фильтры не к корневому классу? Там http://lartc.org/howto/lartc.qdisc.filters.html сказано, что
with HTB, you should attach all filters to the root!
. Во всех скриптах, что видел здесь в ветке и в самом модеме как раз и используется htb очередь. Если можно было бы цеплять фильтры к любому классу, то и фильтрацию по метке и айпи очень просто разделить..
2. Есть ли возможность шейпить трафик, заранее не зная всех айпи адресов (выдаются DHCP)?
3. Также в недоумении насчет этих строк (из оригинального скрипта):
- код выделить все
tc class add dev br0 parent 1:1 classid 1:3 htb rate 80 \
ceil 90mbit prio 0 quantum 1500 burst 100k
tc class add dev br0 parent 1:2 classid 1:20 htb rate ${BANDWIDTHDOWN_LIMIT}kbit \
ceil ${BANDWIDTHDOWN}kbit prio 1 quantum 1500 # в объявлении класса указывается тип и параметры очереди??
tc class add dev br0 parent 1:2 classid 1:21 htb rate ${BANDWIDTHDOWN_LIMIT}kbit \
ceil ${BANDWIDTHDOWN}kbit prio 2 quantum 1500
tc class add dev br0 parent 1:2 classid 1:22 htb rate ${BANDWIDTHDOWN_LIMIT}kbit \
ceil ${BANDWIDTHDOWN}kbit prio 3 quantum 1500
tc qdisc add dev br0 parent 1:3 handle 3: esfq perturb 10 hash dst quantum 1500
# а здесь добавляется (или заменяется вышеуказанная??) очередь другого типа
tc qdisc add dev br0 parent 1:20 handle 20: esfq perturb 10 hash dst quantum 1500
tc qdisc add dev br0 parent 1:21 handle 21: esfq perturb 10 hash dst quantum 1500
tc qdisc add dev br0 parent 1:22 handle 22: esfq perturb 10 hash dst quantum 1500
По этому вопросу выше уже отвечали, в ссылке можно найти:
tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10 - attach another qdisc handle to class 1:10 using SFQ - this implements the SFQ round robin qdisc inside the HTB that kicks in only when the queue is saturated to ensure that no one "conversation" hogs the pipe.
Значит ли это, что можно цеплять несколько очередей на класс?