был озадачен шейпингом на пингвине. результаты трудов.
шейпим выход:
[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
на метро интерфейсах обязательно учитывать mtu, и править его на ifb0 в соответствии.
задавать классы для родительского интерфейса ненадо. это сильно мешает работе сети в обратном от регулируемого, направлении.