Linux Traffic Shaper per IP – Iptables CLASSIFY
В Linux има различни начини според ситуацията разбира се за управление на трафика (Linux Traffic Shaper) по ип адрес. Един от вариантите който аз предпочитам е маркиране на пакети с iptables. Принципно има два вида маркиране с iptables. С IPMARK и CLASSIFY. IPMARK използва опашката filter в tc a CLASSIFY class, така filter отпада и именно поради тази причина предпочитам CLASSIFY.
add interface – Linux Traffic Shaper
tc qdisc add dev eth0 root handle 1: htb default 1 tc qdisc add dev eth1 root handle 1: htb default 1 |
host 1 – speed 1
iptables -t mangle -A POSTROUTING -d 192.168.0.2 -j CLASSIFY --set-class 1:100 iptables -t mangle -A POSTROUTING -s 192.168.0.2 -j CLASSIFY --set-class 1:101 tc class add dev eth0 parent 1: classid 1:100 htb rate 10Mbit tc qdisc add dev eth0 parent 1:100 handle 100: sfq perturb 10 tc class add dev eth1 parent 1: classid 1:101 htb rate 10Mbit tc qdisc add dev eth1 parent 1:101 handle 101: sfq perturb 10 |
host 2 – speed 2
iptables -t mangle -A POSTROUTING -d 192.168.0.3 -j CLASSIFY --set-class 1:102 iptables -t mangle -A POSTROUTING -s 192.168.0.3 -j CLASSIFY --set-class 1:103 tc class add dev eth0 parent 1: classid 1:102 htb rate 20Mbit tc qdisc add dev eth0 parent 1:102 handle 102: sfq perturb 10 tc class add dev eth1 parent 1: classid 1:103 htb rate 20Mbit tc qdisc add dev eth1 parent 1:103 handle 103: sfq perturb 10 |
Script – Linux Traffic Shaper
Ако се стигне до там, че трябва да управляваме няколкостотин адреса ще ни трябва скрипт. Решението на тази задача съм го изпълнил с два файла. Конфигурационен в който съхраняваме адресите и скоростите с които ще ги ограничаваме – /etc/ipclient
192.168.0.2 speed1
192.168.0.3 speed2
#192.168.0.4 speed1
192.168.0.5 speed1 |
И изпълним файл, самият скрипт – /etc/init.d/netscript
DB=/etc/ipclient DEV1=eth0 DEV2=eth1 SPEED1_IN=10Mbit SPEED1_OUT=10Mbit SPEED2_IN=20Mbit SPEED2_OUT=20Mbit echo "remove FIREWAL rules" iptables -F -t mangle echo "start GLOBAL TRAFFIC SHAPER rules" tc qdisc del dev $DEV1 root 2>/dev/null tc qdisc add dev $DEV1 root handle 1: htb r2q 625 default 65 tc class add dev $DEV1 parent 1: classid 1:1 htb rate 1000Mbit tc qdisc del dev $DEV2 root 2>/dev/null tc qdisc add dev $DEV2 root handle 1: htb r2q 625 default 65 tc class add dev $DEV2 parent 1: classid 1:1 htb rate 1000Mbit echo "start TRAFFIC SHAPER IP speed1" ADDR=$(grep -v \# $DB | grep speed1 | awk '{ print $1 }') for IP in $ADDR; do MARK=$(cat $DB | grep -w -n $IP | cut -d":" -f1) UP=$(($MARK + 1000)) DOWN=$(($MARK + 3000)) iptables -t mangle -A POSTROUTING -d $IP -j CLASSIFY --set-class 1:$UP tc class add dev $DEV1 parent 1:1 classid 1:$UP htb rate $SPEED1_IN tc qdisc add dev $DEV1 parent 1:$UP handle $UP: sfq iptables -t mangle -A POSTROUTING -s $IP -j CLASSIFY --set-class 1:$DOWN tc class add dev $DEV2 parent 1:1 classid 1:$DOWN htb rate $SPEED1_OUT tc qdisc add dev $DEV2 parent 1:$DOWN handle $DOWN: sfq done; echo "start TRAFFIC SHAPER IP speed2" ADDR=$(grep -v \# $DB | grep speed2 | awk '{ print $1 }') for IP in $ADDR; do MARK=$(cat $DB | grep -w -n $IP | cut -d":" -f1) UP=$(($MARK + 1000)) DOWN=$(($MARK + 3000)) iptables -t mangle -A POSTROUTING -d $IP -j CLASSIFY --set-class 1:$UP tc class add dev $DEV1 parent 1:1 classid 1:$UP htb rate $SPEED2_IN tc qdisc add dev $DEV1 parent 1:$UP handle $UP: sfq iptables -t mangle -A POSTROUTING -s $IP -j CLASSIFY --set-class 1:$DOWN tc class add dev $DEV2 parent 1:1 classid 1:$DOWN htb rate $SPEED2_OUT tc qdisc add dev $DEV2 parent 1:$DOWN handle $DOWN: sfq done; |
Linux Traffic Shaper per IP – Iptables CLASSIFY