tc ввод и вывод

был озадачен шейпингом на пингвине. результаты трудов.

шейпим выход:


[root@server]# cat ./shape.sh
#!/bin/bash

TC=/sbin/tc
IF=eth4.1764 # Interface
#IF=bond2 # Interface
UPLD=1680Mbit # UPLOAD Limit
IP=0.0.0.0/32 # Host IP

start() {

$TC qdisc add dev $IF root handle 1: htb default 30
$TC class add dev $IF parent 1: classid 1:1 htb rate 10gbit
$TC class add dev $IF parent 1:1 classid 1:10 htb rate $UPLD
$TC filter add dev $IF protocol ip parent 1:0 prio 1 u32 match ip src $IP flowid 1:10

}

stop() {

# Stop the bandwidth shaping.
$TC qdisc del dev $IF root

}

restart() {

# Self-explanatory.
stop
sleep 1
start

}

show() {

# Display status of traffic control status.
$TC -s -d qdisc show dev $IF
$TC -s -d class show dev $IF
$TC -s -d filter show dev $IF

}

case "$1" in

start)

echo -n "Starting bandwidth shaping: "
start
echo "done"
;;

stop)

echo -n "Stopping bandwidth shaping: "
stop
echo "done"
;;

restart)

echo -n "Restarting bandwidth shaping: "
restart
echo "done"
;;

show)

echo "Bandwidth shaping status for $IF:"
show
echo ""
;;

*)

pwd=$(pwd)
echo "Usage: tc.bash {start|stop|restart|show}"
;;

esac

exit 0

шейпим вход. тут немного сложнее, и надо поднимать промежуточное псевдоустройство ifb. головная статья по ifb. в общем случае в ведре оно уже есть, и нужно просто запилить модуль, как-то так:

modprobe ifb numifbs=1

и поднять интерфейс:

ip link set dev ifb0 up

после того, как встало, используем вот это:


[root@server]# cat ./inshape.sh
#!/bin/bash

TC=/sbin/tc
IF=bond2 # Interface
DNLD=150Mbit # DOWNLOAD Limit. set here half of required bandwith. 100Mbit=20Mbps.
IP=0.0.0.0/32 # Storage IP

start() {

ip link set dev ifb0 up
$TC qdisc add dev $IF handle ffff: ingress
$TC filter add dev $IF parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
$TC qdisc add dev $IF root handle 1: htb default 10
$TC class add dev $IF parent 1: classid 1:1 htb rate $DNLD
$TC class add dev $IF parent 1:1 classid 1:10 htb rate $DNLD
$TC qdisc add dev ifb0 root handle 1: htb default 10
$TC class add dev ifb0 parent 1: classid 1:1 htb rate $DNLD
$TC class add dev ifb0 parent 1:1 classid 1:10 htb rate $DNLD
$TC filter add dev ifb0 parent 1:0 protocol ip prio 0 u32 match ip src $IP flowid 1:10
}

stop() {

# Stop the bandwidth shaping.
$TC qdisc del dev $IF root
$TC qdisc del dev $IF ingress
$TC qdisc del dev ifb0 root

}

restart() {

# Self-explanatory.
stop
sleep 1
start

}

show() {

# Display status of traffic control.
$TC -s -d qdisc show dev $IF
$TC -s -d class show dev $IF
$TC -s -d filter show dev $IF
$TC -s -d qdisc show dev ifb0
$TC -s -d class show dev ifb0
$TC -s -d filter show dev ifb0

}

case "$1" in

start)

echo -n "Starting inbound bandwidth shaping: "
start
echo "done"
;;

stop)

echo -n "Stopping inbound bandwidth shaping: "
stop
echo "done"
;;

restart)

echo -n "Restarting inbound bandwidth shaping: "
restart
echo "done"
;;

show)

echo "Bandwidth shaping status for ifb0 and $IF:"
show
echo ""
;;

*)

pwd=$(pwd)
echo "Usage: tc.bash {start|stop|restart|show}"
;;

esac

exit 0

Запись опубликована в рубрике overminds с метками , . Добавьте в закладки постоянную ссылку.

2 комментария на «tc ввод и вывод»

  1. fam говорит:

    на метро интерфейсах обязательно учитывать mtu, и править его на ifb0 в соответствии.

  2. fam говорит:

    задавать классы для родительского интерфейса ненадо. это сильно мешает работе сети в обратном от регулируемого, направлении.

Добавить комментарий