openwrt上的弱网测试

TC使用

  1. 安装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
  1. 使用
# eth0 网卡的传输设置为延迟 100 毫秒发送
tc qdisc add dev eth0 root netem delay 100ms

# 设置eth0的丢包率是10%
tc qdisc add dev eth0 root netem loss 10%
  1. 效果显示


    30%的丢包

学习

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

  1. 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

你可能感兴趣的:(openwrt上的弱网测试)