之前我写过两篇日志,一篇是linux TC流量控制,一篇是tc流量控制(一)。而今天的这篇是前两篇的续篇,本来这篇日志应该是老早之前就应该写的,由于最近一直忙于公司整个网络环境架构的调整。直到今天公司技术办公环境要调整才会想到这个续篇还没写。这次的操作主要是针对目前在用的真实环境做的一个策略。

 1#!/bin/bash
 2tc qd del dev eth0 root 2>/dev/null
 3tc qd del dev eth1 root 2>/dev/null
 4tc qdisc add dev eth1 root handle 2:0 htb default 50
 5tc class add dev eth1 parent 2:0 classid 2:1 htb rate 100Mbit burst 15k
 6#tc class add dev eth1 parent 2:0 classid 2:1 htb rate 8Mbit burst 15k
 7tc class add dev eth1 parent 2:1 classid 2:10 htb rate 512Kbit ceil 1200kbit burst 15k
 8tc class add dev eth1 parent 2:1 classid 2:20 htb rate 1Mbit ceil 2Mbit burst 15k
 9tc class add dev eth1 parent 2:1 classid 2:30 htb rate 4Mbit ceil 5Mbit burst 15k
10tc class add dev eth1 parent 2:1 classid 2:40 htb rate 2Mbit ceil 3Mbit burst 15k
11tc class add dev eth1 parent 2:1 classid 2:50 htb rate 1Mbit ceil 1Mbit burst 15k
12tc class add dev eth1 parent 2:1 classid 2:60 htb rate 50Mbit  burst 15k
13tc qdisc add dev eth1 parent 2:10 handle 10: sfq perturb 5
14tc qdisc add dev eth1 parent 2:20 handle 20: sfq perturb 5
15tc qdisc add dev eth1 parent 2:30 handle 30: sfq perturb 5
16tc qdisc add dev eth1 parent 2:40 handle 40: sfq perturb 5
17tc qdisc add dev eth1 parent 2:50 handle 50: sfq perturb 5
18#for lan set
19#tc filter add dev eth1 parent 2:0 protocol ip prio 1 route
20#tc filter add dev eth1 parent 2:0 protocol ip prio 1 route to 2 flowid 2:1
21#tc filter add dev eth1 parent 2:0 protocol ip prio 1 route to 3 flowid 2:1
22#tc filter add dev eth1 parent 2:0 protocol ip prio 1 route to 4 flowid:2:1
23#ip route add 192.168.10.0/24 dev eth1 via 192.168.10.254 realm 2
24#ip route add 192.168.20.0/24 dev eth1 via 192.168.20.254 realm 3
25tc filter add dev eth1 protocol ip parent 2:0 prio 1 u32 match ip src 192.168.0.0/24 flowid 2:60
26tc filter add dev eth1 protocol ip parent 2:0 prio 1 u32 match ip src 192.168.10.0/24 flowid 2:60
27tc filter add dev eth1 protocol ip parent 2:0 prio 1 u32 match ip src 192.168.20.0/24 flowid 2:60
28tc filter add dev eth1 protocol ip parent 2:0 prio 1 u32 match ip src 192.168.30.0/24 flowid 2:60
29tc filter add dev eth1 protocol ip parent 2:0 prio 1 u32 match ip src 192.168.1.0/24 flowid 2:60
30#for wan set
31tc filter add dev eth1 protocol ip parent 2:0 prio 2 u32 match ip dst 192.168.30.0/24 flowid 2:10
32tc filter add dev eth1 protocol ip parent 2:0 prio 3 u32 match ip dst 192.168.20.0/24 flowid 2:20
33tc filter add dev eth1 protocol ip parent 2:0 prio 4 u32 match ip dst 192.168.1.0/24 flowid 2:30
34tc filter add dev eth1 protocol ip parent 2:0 prio 5 u32 match ip dst 192.168.10.0/24 flowid 2:40
35tc filter add dev eth1 protocol ip parent 2:0 prio 6 u32 match ip dst 192.168.0.0/24 flowid 2:50

上面的网络配置我是几经测试后来才敲定的。我上例所设置的办公网络的总的连结带宽是8M,我上面的设置之所以是100Mbit,这个完全是为了不同内网网段之前的数据交互设置的。我上面一共设置了五个组——管理组、研发组、优化组、售后组、临时组。其中管理组人员只有一个,之前是设了单人1M——2M的带宽。后来研发组人员老说带宽不够用,BOSS让把他自己的调小了。我这里设的512——1200kbit之间。其他几个组就不一一细说,大致是一样的,根据具体人数和对带宽的需求不同进行调整就是了。

说说上面几个比较重要的地方:

  • prio设值优先级,这个参数比较重要,值越小优先级越高。
  • u32为匹配过滤器,我这里是通过匹配目标地址和源地址设置的。
  • src、dst为地址匹配。src的设置的优化级较高,且配给的过滤规则带宽值也较大,这个是为内网互访进行设置的。src匹配是我后来加上去的,原来的规则的设置的效果是如果同网段内互访,速度非常快,不受规则的限制。比如192.168.20.20和192.168.20.30之间共享或传文件可以达到10M/s,而192.168.20.20和192.168.10.30之间传文件,速度只有100Kb左右。通过上的src指向以后,这个瓶颈就得到了解决。dst的规则是设置访问互联网时对应的限制策略。
  • sfq是各网段之间内部进行的一种公平算法,后面跟的perturb是平均多长时间进行一次计算。单位是秒。

注:本来上面的内网传输瓶颈问题,我是想通过ip route进行标记再配合tc进行处理的。发现配置比较麻烦,而且和u32过滤之间似乎有冲突。

最后共享两个和tc相关的文档供参考。

Linux 的高级路由和流量控制 HOWTO中文版
linux IP命令深层讲解

目前tc所支持的算法,除了常用的cbq和htb之外,又新增了HFSC算法,据说比htb更优。有兴趣的也可以试下。HFSC算法的提供的官方文档为:http://linux-ip.net/articles/hfsc.en