TC使用
- 安装tc和netem:
Symbol: PACKAGE_kmod-netem [=y]
| Type : tristate
| Prompt: kmod-netem
| Location:
| -> Kernel modules
| -> Network Support
Symbol: BUSYBOX_CONFIG_TC [=y]
| Type : boolean
| Prompt: tc (8.3 kb)
| Location:
| -> Base system
| -> busybox
| -> Networking Utilities
- 使用
# eth0 网卡的传输设置为延迟 100 毫秒发送
tc qdisc add dev eth0 root netem delay 100ms
# 设置eth0的丢包率是10%
tc qdisc add dev eth0 root netem loss 10%
-
效果显示
学习
Class 类
class 用来表示控制策略.很显然,很多时候,我们很可能要对不同的IP实行不同的流量控制策略,这时候我们就得用不同的class来表示不同的控制策略了.
tc 的应用流程
如果将HTB的分层结构看作树,那么每个节点就被称为一个 class,每个class可以设置一个 qdisc,默认的是 tc-pfifo. 另外HTB还可以设置一些过滤器,通过这些过滤器可以将到来的包分发到指定的 class 上。这里过滤器通常挂载在 root 节点(eth0接口),但匹配只能匹配叶子节点。
数据包->iptables(在通过iptables时,iptables根据不同的ip来设置不同的mark)->tc(class)->tc(queue)
==应用==
假设 eth0 位是服务器的外网网络接口, eth0 的华为云的ip是192.168.0.198
#--------------------------------------------- 带宽是5兆
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-6.03 sec 3.89 MBytes 5.41 Mbits/sec 101 sender
[ 5] 0.00-6.03 sec 0.00 Bytes 0.00 bits/sec receiver
#0. 开始之前,先要清除 eth0所有队列规则
tc qdisc del dev eth0 root 2> /dev/null > /dev/null
#1. 定义最顶层(根)队列规则,并指定 default 类别编号
tc qdisc add dev eth0 root handle 1: htb default 2
-> tc qdisc show
qdisc htb 1: dev eth0 root refcnt 2 r2q 10 default 2 direct_packets_stat 18 direct_qlen 1000
#2. 定义第一层的 1:1 类别 (速度),定义类别,设定分类
本来是要多定义第二层叶类别,但目前来看,这个应用中就可以了.
tc class add dev eth0 parent 1:1 classid 1:2 htb rate 98mbit ceil 100mbit prio 2
tc class add dev eth0 parent 1:1 classid 1:3 htb rate 1mbit ceil 2mbit prio 2
#注:以上就是我们控制输出服务器的速度,一个为98M,一个为 2M.
rate: 是一个类保证得到的带宽值.如果有不只一个类,请保证所有子类总和是小于或等于父类.
prio:用来指示借用带宽时的竞争力,prio越小,优先级越高,竞争力越强.
ceil: ceil是一个类最大能得到的带宽值.
#3. 同时为了不使一个会话永占带宽,添加随即公平队列sfq. 这个还不明白
tc qdisc add dev eth0 parent 1:2 handle 2: sfq perturb 10
tc qdisc add dev eth0 parent 1:3 handle 3: sfq perturb 10
4. 设定过滤器,就是不同的用户或者ip走哪个类
-> 可以使用过滤器可以使用本身的 u32
-> 也可以使用 iptables 来打上标记
指定在root 类 1:0 中,对 192..168.0.198 的过滤,使用 1:3 的规则,来给他 1-2M 的速度,写法就如下
#---------------> 使用过滤器
tc filter add dev eth0 protocol ip parent 1:0 u32 match ip src 192.168.0.198 flowid 1:3
# 这个是参考文献中的,我没有使用
tc filter add dev eth0 protocol ip parent 1:0 u32 match ip src 192.168.0.2 flowid 1:2
# 如果是所有 ip 写法就如:
tc filter add dev eth0 protocol ip parent 1: prio 50 u32 match ip dst 0.0.0.0/0 flowid 1:10
#--------------->使用 iptables 来配合过滤器
#还可以使用这个方法,但需要借助下面的 iptables 的命令来做标记了
tc filter add dev eth0 parent 1: protocol ip prio 1 handle 2 fw flowid 1:2
tc filter add dev eth0 parent 1: protocol ip prio 1 handle 2 fw flowid 1:3
# 然后iptables 只要打上记号就行了,这种时候大多用在做网关的时候,很合适使用这种方法.
iptables -t mangle -A POSTROUTING -d 192.168.0.2 -j MARK --set-mark 10
iptables -t mangle -A POSTROUTING -d 192.168.0.3 -j MARK --set-mark 20
#---------------------------------------------带宽是变成了1M
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-9.46 sec 1.14 MBytes 1.01 Mbits/sec 25 sender
[ 5] 0.00-9.46 sec 0.00 Bytes 0.00 bits/sec receiver
- reference:
1.https://www.cnblogs.com/CooperXia-847550730/p/11942812.html
2.https://www.jianshu.com/p/f8c3acea434a
3.https://blog.csdn.net/hardlearn/article/details/78034951
4.http://hellodk.cn/post/33
5.https://www.dazhuanlan.com/
6.https://blog.csdn.net/wuwentao2000/article/details/7104460
7.https://willshorez.wordpress.com/2012/05/27/openwrt-%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6traffic-shaping/
8.https://blog.csdn.net/daniel117/article/details/17350243?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task