2016年6月23日 星期四

利用Linux的Traffic Control做網路的Scheduling

查看 tc rule指令
tc qdisc show
tc class show dev eth0
tc filter show dev eth0

刪除原本的tc rule
tc disc del dev eth0 root

1. pfifo_fast

當interface啟動的時候,系統自動預設的

2. TBF

tc disc add dev eth0 root tbf rate 200kbit latency 50ms burst 1540

latency : 每個Packet待在Queue的最大時間 (queue delay).
burst : Queue的大小,以bytes為單位.

3. SFQ

tc disc add dev eth0 root sfq perturb 10

perturb : 多久重新產生隨機配置 (散列算法),通常以10秒為一個單位.

4. HTB

//handle是Tag,格式為major:major
//如果是一條queueing discipline,minor需要一直為0
tc qdisc add dev eth0 root handle 1:0 htb

//parent為新增一個class到handle上
//classid為在handle上的一個id,minor需要為非0值
//ceil為要限制的rate
tc qdisc add dev eth0 parent 1:1 classid 1:6 htb rate 256kbit ceil 512kbit

//新建一個classid為1:1,rate為100kbps
tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbps

//建立兩個classid為1:10和1:11
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 40kbps ceil 100kbps
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 60kbps ceil 100kbps

//建立哪些packet要進入哪個class
tc filter add dev eth0 protocol ip parent 1:0 prior 1 u32 match ip src 1.2.3.4 match ip sport 80 0xffff flowed 1:10
tc filter add dev eth0 protocol ip parent 1:0 prior 1 u32 match ip src 1.2.3.4 flow 1:11

//將class加入到queueing discipline
tc qdisc add dev eth0 parent 1:10 handle 20: fifo limit 5
tc qdisc add dev eth0 parent 1:11 handle 30: sfq perturb 10

針對output的部分

eth0網卡Download速度為200Kbps
class 10:10 prio 0 for 優先使用者或伺服器
class 10:20 prio 1 for 一般
class 10:30 prio 2 for 濫用
# 刪除現有的規則
tc qdisc del dev eth0 root
# root
tc qdisc add dev eth0 root handle 10: htb default 20
# root 10:1 class
tc class add dev eth0 parent 10: classid 10:1 htb rate 200kbps ceil 200kbps
# 10:10 class
tc class add dev eth0 parent 10:1 classid 10:10 htb rate 100kbps ceil 200kbps prio 0
tc qdisc add dev eth0 parent 10:10 handle 101: pfifo
# 將 MARK為 10的歸類於 class 10:10
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 10 fw classid 10:10
# 10:20 class
tc class add dev eth0 parent 10:1 classid 10:20 htb rate 70kbps ceil 150kbps prio 1
tc qdisc add dev eth0 parent 10:20 handle 102: pfifo
# 10:30 class
tc class add dev eth0 parent 10:1 classid 10:30 htb rate 30kbps ceil 100kbps prio 2
tc qdisc add dev eth0 parent 10:30 handle 103: pfifo
# 將 MARK為 30的歸類於 class 10:30
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 30 fw classid 10:30
iptables -t mangle -A POSTROUTING -d 192.168.0.135 -j MARK –set-mark 10             目的端IP為192.168.0.135優先權為0
iptables -t mangle -A POSTROUTING -d 192.168.0.32 -j MARK –set-mark 30               目的端IP為192.168.0.32優先權為2
來源:http://ssorc.tw/274



針對input的部分

首先需要加載內核模塊,啟用虛擬網卡設備ifb0
  1. [ root@test ~] # modprobe ifb
  2. [ root@test ~] # ip link set dev ifb0 up
然後對入站流量做設置,鏡像到ifb0上
  1. [ root@test ~] # tc qdisc add dev eth0 ingress
  2. [ root@test ~] # tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ifb0
然後我們就可以對ifb0接口的out方向流量做各種限制了
  1. [ root@test ~] # tc qdisc add dev ifb0 root handle 1: htb default 1
  2. [ root@test ~] # tc class add dev ifb0 parent 1: classid 1:1 htb rate 800kbit ceil 800kbit burst 80k
  3. [ root@test ~] # tc filter add dev ifb0 parent 1: prio 1 protocol ip u32 match ip dst 1.1.1.1/32 match ip dport 80 0xffff flowid 1:1
來源:http://chunchaichang.blogspot.tw/2016/07/tc-ingress.html