LINUX.ORG.RU
ФорумAdmin

hashing filters


0

0

Помогите пожалуйста, не попадает трафик в 401 класс.

Где я ошибаюсь?

#!/bin/bash

tc qdisc del dev eth0 root handle 1: htb default 400
tc qdisc add dev eth0 root handle 1: htb default 400

tc class add dev eth0 parent 1: classid 1:1 htb rate 1gbit
tc class add dev eth0 parent 1:1 classid 1:400 htb rate 1gbit prio 1

tc filter add dev eth0 parent 1: prio 10 handle 100: protocol ip u32 divisor 256
tc filter add dev eth0 protocol ip parent 1:0 prio 10 u32 ht 800:: match ip src 172.7.0.0/16 hashkey mask 0x0000ffff at 16 link 100:

tc filter add dev eth0 parent 1: prio 10 handle 1: protocol ip u32 divisor 256
tc filter add dev eth0 parent 1:1 protocol ip prio 10 u32 ht 100:1: match ip src 172.7.7.0/24 hashkey mask 0x000000ff at 16 link 1:

tc class add dev eth0 parent 1:1 classid 1:401 htb rate 100kbit prio 10
tc filter add dev eth0 parent 1:0 protocol ip prio 10 u32 ht 1:1: match ip src 172.7.7.117 classid 1:401

И еще не пойму. Вот у меня есть таблица на 256 ячеек (1:). Т.е в каждой ячейке должен быть фильтр для ip-адреса из подсети (172.7.7.0/24), а вот для таблицы 100:, 256, я не пойму тут для моей подсети сколько нужно ячеек, 2?

Я чет запутался.

palladium ()

> tc filter add dev eth0 parent 1:1

вот не уверен я, что фильтры можно цеплять не к устройству.. ну не уверен.

azure ★★ ()
Ответ на: комментарий от azure

Подправил, не идет все равно.

#!/bin/bash

tc qdisc del dev eth0 root handle 1: htb default 400
tc qdisc add dev eth0 root handle 1: htb default 400

tc class add dev eth0 parent 1: classid 1:1 htb rate 1gbit
tc class add dev eth0 parent 1:1 classid 1:400 htb rate 1gbit prio 1

tc filter add dev eth0 parent 1: prio 10 handle 100: protocol ip u32 divisor 4
tc filter add dev eth0 protocol ip parent 1:0 prio 10 u32 ht 800:: match ip src 172.7.0.0/16 hashkey mask 0x0000ffff at 16 link 100:

tc filter add dev eth0 parent 1: prio 10 handle 1: protocol ip u32 divisor 4
tc filter add dev eth0 parent 1:0 protocol ip prio 10 u32 ht 100:1: match ip src 172.7.7.0/24 hashkey mask 0x000000ff at 16 link 1:

tc class add dev eth0 parent 1:1 classid 1:401 htb rate 100kbit prio 10
tc filter add dev eth0 parent 1:0 protocol ip prio 10 u32 ht 1:1: match ip src 172.7.7.117 classid 1:401

palladium ()

в первой таблице разложите пакеты по 3 октету (hashkey mask 0x0000ff00)

ventilator ★★★ ()
function hashfilters {
DEV=$1                
DIRECTION=$2          
HT=$3       ## HEX!!! 
STARTCLASSPREFIX=$4 ## HEX!!!
STARTHTPREFIX=$5             
if [ "$DIRECTION" = "src" ]  
then                         
OFFSET=12                    
else                         
OFFSET=16                    
fi                           
echo "$DIRECTION - $OFFSET"  
tc filter add dev ${DEV} parent 1: prio 5 handle $(($STARTHTPREFIX)): protocol ip u32 divisor 256
tc filter add dev ${DEV} protocol ip parent 1: prio 5 u32 ht $HT:: match ip ${DIRECTION} 0.0.0.0/0 hashkey mask 0x0000ff00 at ${OFFSET} link $(($STARTHTPREFIX)):                                                                                                                                                         

                tc filter add dev ${DEV} parent 1: prio 5 handle $(($STARTHTPREFIX+1)): protocol ip u32 divisor 256
                tc filter add dev ${DEV} protocol ip parent 1: prio 5 u32 ht $(($STARTHTPREFIX)):64:  match ip ${DIRECTION} 0.0.0.0/0 hashkey mask 0xff at ${OFFSET} link $(($STARTHTPREFIX+1)):                                                                                                                                                                                                                                                                                       

for class in `seq 1 255`
do                      
tc filter add dev ${DEV} protocol ip parent 1: prio 5 u32 ht $(($STARTHTPREFIX+1)):`printf %x $class`:  match ip ${DIRECTION} 0.0.0.0/0 classid 1:${STARTCLASSPREFIX}`printf %x $class`                                                                                                                                                                                                                                                                                                
done                                                                                                                                                                                                                                                                                                                      

# entries for 172.16.101.0/24

               tc filter add dev ${DEV} parent 1: prio 5 handle $(($STARTHTPREFIX+2)): protocol ip u32 divisor 256
                tc filter add dev ${DEV} protocol ip parent 1: prio 5 u32 ht $(($STARTHTPREFIX)):65:  match ip ${DIRECTION} 0.0.0.0/0 hashkey mask 0xff at ${OFFSET} link $(($STARTHTPREFIX+2)): 
откушено
}
ventilator ★★★ ()
Ответ на: комментарий от ventilator

А у меня src и OFFSET=16. Спасибо попробую. А как вы в хекс переводите или ht 1:1: ,1:2:, 1:3: ... 1:256: можно писать?

tc filter add dev eth0 parent 1:0 protocol ip prio 10 u32 ht 1:1: match ip src 172.7.7.117 classid 1:401

palladium ()
Ответ на: комментарий от ventilator

обратите внимание что 64hex=100dec

PS: до коммента # entries for 172.16.101.0/24 идет речь о сети 172.16.100.0/24

ventilator ★★★ ()
Ответ на: комментарий от palladium

А у меня src и OFFSET=16. Спасибо попробую. А как вы в хекс переводите или ht 1:1: ,1:2:, 1:3: ... 1:256: можно писать?

Писать так можно, но эффект будет не тот что ожидается. вам нужно указать бакет в hex :

for class in `seq 1 255` 
do                       
tc filter add dev ${DEV} protocol ip parent 1: prio 5 u32 ht $(($STARTHTPREFIX+1)):`printf %x $class`:  match ip ${DIRECTION} 0.0.0.0/0 classid 1:${STARTCLASSPREFIX}`printf %x $class`                                                                                                                                                                                                                                                                                                 
done

`printf %x $class` - вот так и перевожу.

ventilator ★★★ ()
Ответ на: комментарий от ventilator

Трафик пошел в класс когда я сделал то что вы сказали и divisor 2 сделал вместо 4.

#!/bin/bash

tc qdisc del dev eth0 root handle 1: htb default 400
tc qdisc add dev eth0 root handle 1: htb default 400

tc class add dev eth0 parent 1: classid 1:1 htb rate 1gbit
tc class add dev eth0 parent 1:1 classid 1:400 htb rate 1gbit prio 1

tc filter add dev eth0 parent 1: prio 10 handle 100: protocol ip u32 divisor 2
tc filter add dev eth0 protocol ip parent 1:0 prio 10 u32 ht 800:: match ip src 172.7.0.0/16 hashkey mask 0x0000ff00 at 12 link 100:

tc filter add dev eth0 parent 1: prio 10 handle 1: protocol ip u32 divisor 2
tc filter add dev eth0 parent 1:0 protocol ip prio 10 u32 ht 100:1: match ip src 172.7.7.0/24 hashkey mask 0x000000ff at 12 link 1:

tc class add dev eth0 parent 1:1 classid 1:401 htb rate 100kbit prio 10
tc filter add dev eth0 parent 1:0 protocol ip prio 10 u32 ht 1:1: match ip src 172.7.7.117 classid 1:401

palladium ()
Ответ на: комментарий от palladium

только учтите что в вашем примере вы сразу из таблицы 800 гоните в бакеты таблицы 100. В моем случае еще нужно загнать пакеты в таблицу $HT из той же 800

ventilator ★★★ ()
Ответ на: комментарий от ventilator

А это обязательно как в вашем случае или можно как у меня сразу из 800? А почему у меня с 4 не работало а с 2 заработало?

palladium ()
Ответ на: комментарий от palladium

не обязательно. Дивисор - это количество бакетов, если вы хотите только 2 бакета в каждой таблице то я так понял там не больше 4 ип получиться, какой тогда смысл в хеш фильтрах? Или у вас задача не класс пер ип?

ventilator ★★★ ()
Ответ на: комментарий от ventilator

Смотрите, если я создал таблицу на 256 записей для 0/24, как в моем примере, я так понимаю что в нее можно добавить 256 фильтров. Это понятно. сколько ip столько и фильтров.

tc filter add dev eth0 parent 1: prio 10 handle 1: protocol ip u32 divisor 256
tc filter add dev eth0 parent 1:1 protocol ip prio 10 u32 ht 100:1: match ip src 172.7.7.0/24 hashkey mask 0x000000ff at 16 link 1:

а когда для 0/16 подсети, ну к примеру в первой ячейке будет фильтр как в моем примере, ну еще пусть я добавлю 10 подсетей (вообще й меня 11), а остальные ячейки будут пустовать?

tc filter add dev eth0 parent 1: prio 10 handle 100: protocol ip u32 divisor 256
tc filter add dev eth0 protocol ip parent 1:0 prio 10 u32 ht 800:: match ip src 172.7.0.0/16 hashkey mask 0x0000ffff at 16 link 100:

И почему у меня не работало (в моем примере) когда было 256 ячеек, а когда поставил 2, то заработало?

palladium ()
Ответ на: комментарий от palladium

И еще один вопрос появился.

Опять из примера

tc filter add dev eth0 parent 1: prio 10 handle 1: protocol ip u32 divisor 256
tc filter add dev eth0 parent 1:1 protocol ip prio 10 u32 ht 100:1: match ip src 172.7.7.0/24 hashkey mask 0x000000ff at 16 link 1:

Это действительно что в этой таблице к примеру ip 172.7.7.117 он найдет за один проход, не будет 117 проверок? Я не могу понять как именно ядро по маске находит.

palladium ()
Ответ на: комментарий от ventilator

Думаю, этого будет достаточно. Сейчас стоит проблема «вписать» в эту схему таблицы хешей, потому как параметр ht 800:: явно цепляет фильтр в корневой класс, а мне нужен вход в таблицу с веток HTB.

$tc class add dev $dev parent 1:1 classid 1:4 htb rate 500mbit ceil 1gbit
$tc filter add dev $dev parent 1:0 protocol ip prio 100 u32 match ip tos 0x84 0xff flowid 1:4

$tc class add dev $dev parent 1:4 classid 1:1726 htb rate 65536
$tc filter add dev $dev parent 1:4 protocol ip prio 10000 u32 match ip dst 10.20.105.1 flowid 1:1726
$tc class add dev $dev parent 1:4 classid 1:1744 htb rate 4194304
$tc filter add dev $dev parent 1:4 protocol ip prio 10000 u32 match ip dst 10.20.105.161 flowid 1:1744

# tc -s -d filter show dev bond0 parent 1:4|egrep 'success [^0]+' |less

filter protocol ip pref 10000 u32 fh 80c::800 order 2048 key ht 80c bkt 0 flowid
1:1296 (rule hit 14311576 success 212)
match 0a142452/ffffffff at 16 (success 212 )
filter protocol ip pref 10000 u32 fh 80a::803 order 2051 key ht 80a bkt 0 flowid
1:1746 (rule hit 7183129 success 69760)
match 0a1469e8/ffffffff at 16 (success 69760 )
filter protocol ip pref 10000 u32 fh 80a::809 order 2057 key ht 80a bkt 0 flowid
1:1742 (rule hit 7113360 success 1151)
match 0a146952/ffffffff at 16 (success 1151 )
filter protocol ip pref 10000 u32 fh 80a::80f order 2063 key ht 80a bkt 0 flowid
1:1768 (rule hit 7112200 success 25632)
match 0a146a93/ffffffff at 16 (success 25632 )

esm ()
Ответ на: комментарий от esm

Сейчас стоит проблема «вписать» в эту схему таблицы хешей, потому как параметр ht 800:: явно цепляет фильтр в корневой класс, а мне нужен вход в таблицу с веток HTB.

Ну когда вы цепляете таким образом фильтр ведь все равно автоматом создается таблица.

ht 803:: match ip src 0.0.0.0/0 link 5: - можно вот так например завернуть из таблицы 803 в таблицу 5

tc filter add dev ${DEV} parent 1: prio 5 handle 70: protocol ip u32 divisor 256

tc filter add dev ${DEV} protocol ip parent 1: prio 5 u32 ht 5:: match ip dst 0.0.0.0/0 hashkey mask 0x0000ff00 at 16 link 70:
и уже из 5 таблицы разбрасывать по бакетам семидесятой.

Если я правильно понял «вход в таблицу с веток HTB»

ventilator ★★★ ()
Ответ на: комментарий от ventilator

Я остановился на варианте, когда просто не указывается параметр ht 800::, вроде работает. =)

esm ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.