Jump to content
Калькуляторы

шейпер не работает как ожидается tc, htb, ifb

Добрый день!

Настраиваю свой первый шейпер на линуксе. До этого использовал dummynet под freebsd.

Итак, дано:

Шлюз

eth2 - интернет, канал 1мбит. Nat

eth1 - локалка (192.168.5.1)

tap0 - openvpn, работает через интернет, т.е. через eth2 (172.16.0.5)

 

Есть несколько компов, которые выходят в инет через этот шлюз. Есть голосовой шлюз, выходящий в инет через данный шлюз, его адрес 192.168.5.100.

Необходимо дать шлюзу гарантировано 256кбит, т.е. нужно настроить шейпер.

 

Я начал с простого - решил попробовать ограничить исходящую скорость на tap0:

TC="/sbin/tc"

$TC qdisc del dev tap0 root handle 1:

#my root
$TC qdisc add dev tap0 root handle 1: htb default 25
#root cfg
$TC class add dev tap0 parent 1: classid 1:1 htb rate 900kbit ceil 901kbit

#others
$TC class add dev tap0 parent 1:1 classid 1:25 htb rate 32kbit
#voip
$TC class add dev tap0 parent 1:1 classid 1:11 htb rate 256kbit ceil 512kbit


$TC qdisc add dev tap0 parent 1:11 handle 10:0 sfq perturb 10
$TC qdisc add dev tap0 parent 1:25 handle 50:0 sfq perturb 10


$TC filter add dev tap0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.5.100 flowid 1:11

Всё получилось, ограничение заработало.

 

Далее решил попробовать засунуть всё это дело в ifb - неудачо.

Я пробовал множество вариантов, здесь все приводить, наверно, нет смысла. Поэтому выложу наиболее понятный для меня.

$TC qdisc del dev ifb0 root handle 1:
$TC qdisc del dev tap0 root handle 2:

#my root
$TC qdisc add dev ifb0 root handle 1: htb default 25
#root cfg
$TC class add dev ifb0 parent 1: classid 1:1 htb rate 900kbit ceil 901kbit

#others
$TC class add dev ifb0 parent 1:1 classid 1:25 htb rate 32kbit
#voip
$TC class add dev ifb0 parent 1:1 classid 1:11 htb rate 256kbit ceil 512kbit


$TC qdisc add dev ifb0 parent 1:11 handle 10:0 sfq perturb 10
$TC qdisc add dev ifb0 parent 1:25 handle 50:0 sfq perturb 10


$TC filter add dev ifb0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.5.100 flowid 1:11

$TC qdisc add dev tap0 root handle 2: prio
$TC filter add dev tap0 parent 2: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0


$TC filter add dev ifb0 protocol ip parent 1:0 prio 2 handle 111 fw classid 1:
iptables -t mangle -A POSTROUTING -o tap0 -j MARK --set-mark 111

 

Подскажите чего делаю не так?

Edited by opt1k

Share this post


Link to post
Share on other sites

пришлось дома собрать тестовый стенд дабы разобраться.

Данную проблему решил. Но попытался на боевой машине "закрепить" полученный опыт и

/lib/iptables/libipt_mark.so: cannot open shared object file: No such file or directory

failed to find target MARK

Сейчас обновляю ОС, надеюсь поможет...

Share this post


Link to post
Share on other sites

обновление не помогло, вот скрипт который запускаю:

TC="/sbin/tc"
$TC qdisc del dev ifb0 root handle 1:
$TC qdisc del dev eth0 ingress
#my root
$TC qdisc add dev ifb0 root handle 1: htb default 25
#root cfg
$TC class add dev ifb0 parent 1: classid 1:1 htb rate 9000kbit ceil 9010kbit

#others
$TC class add dev ifb0 parent 1:1 classid 1:25 htb rate 320kbit
#voip
$TC class add dev ifb0 parent 1:1 classid 1:11 htb rate 560kbit ceil 1120kbit
$TC qdisc add dev ifb0 parent 1:11 handle 10:0 sfq perturb 10
$TC qdisc add dev ifb0 parent 1:25 handle 50:0 sfq perturb 10
$TC filter add dev ifb0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.100.102 flowid 1:11
ifconfig ifb0 up
$TC qdisc add dev eth0 ingress
$TC filter add dev eth0 parent ffff: protocol ip prio 10 u32 match u32 0 0 flowid 1:  action ipt -j MARK --set-mark 1 action mirred egress redirect dev ifb0

 

В дебиане 6 работает, в убунту 10.04 нет, вываливает ошибку:

/lib/iptables/libipt_mark.so: cannot open shared object file: No such file or directory
failed to find target MARK

bad action parsing
parse_action: bad value (11:ipt)!
Illegal "action"

 

Гугл кроме как бага дебиана ничего внятного не даёт.

Что подскажите?

Share this post


Link to post
Share on other sites

может оно там не работает (POSTROUTING)могу и ошибаться...

можно копнуть в сторону CLASSIFY в качестве альтернативы MARK

Share this post


Link to post
Share on other sites

Это баг дебина, который переехал в убунту, а вот его фикс уже нет...

В любом случае, можно использовать CLASSIFY как это посоветовали выше.

Share this post


Link to post
Share on other sites

спасибо всем за ответы. Часа два потратил на поиск хороших примеров с CLASSIFY, но так ничего и не нашёл. Посмотрел в инете как народ делает более внимательно и решил вообще не метить трафик.

В итоге получилось такое:

ip link set dev ifb1 up
TC="/sbin/tc"
tc qdisc del dev ifb0 root handle 1:
tc qdisc del dev ifb1 root handle 2:
tc qdisc del dev eth1 ingress
tc qdisc del dev eth1 root handle 2:



#in root
$TC qdisc add dev ifb0 root handle 1: htb default 300
#out root
$TC qdisc add dev ifb1 root handle 2: htb default 300



#ingress
$TC class add dev ifb0 parent 1: classid 1:1 htb rate 900kbit ceil 901kbit
#egress
$TC class add dev ifb1 parent 2: classid 2:1 htb rate 900kbit ceil 901kbit




#others
$TC class add dev ifb0 parent 1:1 classid 1:300 htb rate 32kbit
$TC class add dev ifb1 parent 2:1 classid 2:300 htb rate 32kbit

$TC qdisc add dev ifb0 parent 1:300 sfq perturb 10
$TC qdisc add dev ifb1 parent 2:300 sfq perturb 10



#2
$TC class add dev ifb0 parent 1:1 classid 1:2 htb rate 64kbit ceil 512kbit
$TC class add dev ifb1 parent 2:1 classid 2:2 htb rate 64kbit ceil 512kbit

$TC qdisc add dev ifb0 parent 1:2 sfq perturb 10
$TC qdisc add dev ifb1 parent 2:2 sfq perturb 10

$TC filter add dev ifb0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.5.2 flowid 1:2
$TC filter add dev ifb1 protocol ip parent 2:0 prio 1 u32 match ip dst 192.168.5.2 flowid 2:2



.
.
.



#voip
$TC class add dev ifb0 parent 1:1 classid 1:100 htb rate 320kbit ceil 512kbit
$TC class add dev ifb1 parent 2:1 classid 2:100 htb rate 320kbit ceil 512kbit

$TC qdisc add dev ifb0 parent 1:100 sfq perturb 10
$TC qdisc add dev ifb1 parent 2:100 sfq perturb 10

$TC filter add dev ifb0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.5.100 flowid 1:100
$TC filter add dev ifb1 protocol ip parent 2:0 prio 1 u32 match ip dst 192.168.5.100 flowid 2:100



ifconfig ifb0 up
#ingress redirection
$TC qdisc add dev eth1 ingress
$TC filter add dev eth1 parent ffff: protocol ip prio 1 u32 match u32 0 0 flowid 1: action mirred egress redirect dev ifb0
#egress redirection
$TC qdisc add dev eth1 root handle 2: htb
$TC filter add dev eth1 parent 2: protocol ip prio 1 u32 match u32 0 0 flowid 2: action mirred egress redirect dev ifb1

На тестовой машинке работает нормально, через 3 часа народ в офисе появится и будут тестить. Для чистоты эксперимента о нововведениях я говорить сотрудникам пока не буду :).

 

ПС долго думал и пришёл к выводу что шейпить одновременно и исходящий и входящий трафик на одном ifb интерфейсе нельзя, прав ли я? (иначе скорость будет складываться из даунлоада и аплоада суммарно)

И ещё 1 вопросик есть, но его чуть позже задам, сейчас уже засыпаю сидя...

Edited by opt1k

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.