做传销网站的,wordpress python插件,成都设计院,wordpress 机器学习tc模拟延时丢包等网络故障依赖的内核驱动
/lib/modules/5.15.0-52-generic/kernel/net/sched/sch_netem.ko有些系统并不是默认就安装上该驱动的#xff0c;如果没有安装该驱动#xff0c;构造网络故障时会报错。
root:curtis# tc qdisc change dev enp4s0 root netem delay…tc模拟延时丢包等网络故障依赖的内核驱动
/lib/modules/5.15.0-52-generic/kernel/net/sched/sch_netem.ko有些系统并不是默认就安装上该驱动的如果没有安装该驱动构造网络故障时会报错。
root:curtis# tc qdisc change dev enp4s0 root netem delay 10ms reorder 25% 50%
Error: Qdisc not found. To create specify NLM_F_CREATE flag.安装驱动
insmod /lib/modules/5.15.0-52-generic/kernel/net/sched/sch_netem.ko可是为什么安装好内核驱动之后还是会报错
curtis:linux$ sudo tc qdisc change dev enp4s0 root netem delay 10ms reorder 25% 50%
Error: Qdisc not found. To create specify NLM_F_CREATE flag.内核驱动源码路径
./net/sched/sch_netem.c尝试自己编译下这个内核驱动 - - 自己编译了之后发现是同样的情况
root:sch_netem# tc qdisc show
qdisc noqueue 0: dev lo root refcnt 2
qdisc fq_codel 0: dev enp4s0 root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5.0ms interval 100.0ms memory_limit 32Mb ecn
qdisc noqueue 0: dev wlp5s0 root refcnt 2
qdisc noqueue 0: dev docker0 root refcnt 2
qdisc noqueue 0: dev vethf5e645e root refcnt 2尝试用其他命令尝试注入网络时延故障 - - 发现做网络延时是没有问题的这就有理由怀疑是命令格式问题
root:sch_netem# tc qdisc add dev enp4s0 root netem delay 15ms
root:sch_netem# tc qdisc show
qdisc noqueue 0: dev lo root refcnt 2
qdisc netem 8002: dev enp4s0 root refcnt 2 limit 1000 delay 15.0ms
qdisc noqueue 0: dev wlp5s0 root refcnt 2
qdisc noqueue 0: dev docker0 root refcnt 2
qdisc noqueue 0: dev vethf5e645e root refcnt 2最后还是自己去翻了以下man手册最终找到了答案change是用来修改某个网卡网络规则的无脑拷贝他人命令的结果add是给某个网口添加规则没有添加相关规则肯定就不能修改。 tc-netem man 手册
root:sch_netem# tc qdisc add dev enp4s0 root netem delay 10ms reorder 25% 50%
root:sch_netem# tc qdisc
qdisc noqueue 0: dev lo root refcnt 2
qdisc netem 8004: dev enp4s0 root refcnt 2 limit 1000 delay 10.0ms reorder 25% 50% gap 1
qdisc noqueue 0: dev wlp5s0 root refcnt 2
qdisc noqueue 0: dev docker0 root refcnt 2
qdisc noqueue 0: dev vethf5e645e root refcnt 2
root:sch_netem#
root:sch_netem# tc qdisc change dev enp4s0 root netem delay 10ms reorder 50% 50%
root:sch_netem# tc qdisc
qdisc noqueue 0: dev lo root refcnt 2
qdisc netem 8004: dev enp4s0 root refcnt 2 limit 1000 delay 10.0ms reorder 50% 50% gap 1
qdisc noqueue 0: dev wlp5s0 root refcnt 2
qdisc noqueue 0: dev docker0 root refcnt 2
qdisc noqueue 0: dev vethf5e645e root refcnt 2使用wireshark抓包ping是icmp类型的报文。
tc 使用示例
查看所有已经设定的规则
rootrlk:/home# tc qdisc show
qdisc noqueue 0: dev lo root refcnt 2
qdisc netem 8001: dev ens33 root refcnt 2 limit 1000 delay 100.0ms
qdisc noqueue 0: dev docker0 root refcnt 2延时 # tc qdisc add dev eth0 root netem delay 100msAdd fixed amount of delay to all packets going out on deviceeth0(为设备eth0上传出的所有数据包添加固定的延迟量). Each packet will have added delay of 100ms ± 10ms. - - tc延时也非准确# tc qdisc change dev eth0 root netem delay 100ms 10ms100ms±10ms延时时间随机变化。# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%This causes the added delay of 100ms ± 10ms and the nextpacket delay value will be biased by 25% on the most recentdelay. This isnt a true statistical correlation, but anapproximation.uniform variation with correlation value -- 具有相关值的均匀变化。使振幅根据uniform variation with correlation value发生变化。这会导致增加 100ms ± 10ms 的延迟并且下一个数据包延迟值将比最近的延迟偏差25%。这不是真正的统计相关性而是近似值。从测试的情况来看10ms为offsetping实际延迟时间为90~110之间。如果将比例设置为100%则ping实际延迟时间为108这个百分比比较晦涩# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normalThis delays packets according to a normal distribution (Bellcurve) over a range of 100ms ± 20ms.验证方法ping目标主机。
PS C:\Users\94805 ping -t 192.168.0.130正在 Ping 192.168.0.130 具有 32 字节的数据:
来自 192.168.0.130 的回复: 字节32 时间100ms TTL64
来自 192.168.0.130 的回复: 字节32 时间101ms TTL64
来自 192.168.0.130 的回复: 字节32 时间100ms TTL64
来自 192.168.0.130 的回复: 字节32 时间101ms TTL64192.168.0.130 的 Ping 统计信息:数据包: 已发送 9已接收 9丢失 0 (0% 丢失)
往返行程的估计时间(以毫秒为单位):最短 100ms最长 202ms平均 112ms丢包
# tc qdisc change dev eth0 root netem loss 0.1%This causes 1/10th of a percent (i.e 1 out of 1000) packetsto be randomly dropped.An optional correlation may also be added. This causes therandom number generator to be less random and can be used toemulate packet burst losses.重复包
# tc qdisc change dev eth0 root netem duplicate 1%This causes one percent of the packets sent on eth0 to beduplicated.# tc qdisc change dev eth0 root netem loss 0.3% 25%This will cause 0.3% of packets to be lost, and eachsuccessive probability depends is biased by 25% of theprevious one.There are two different ways to specify reordering. The gapmethod uses a fixed sequence and reorders every Nth packet.# tc qdisc change dev eth0 root netem gap 5 delay 10msThis causes every 5th (10th, 15th, …) packet to go to be sentimmediately and every other packet to be delayed by 10ms.This is predictable and useful for base protocol testing likereassembly.The reorder form uses a percentage of the packets to getmisordered.# tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%In this example, 25% of packets (with a correlation of 50%) willget sent immediately, others will be delayed by 10ms.Packets will also get reordered if jitter is large enough.# tc qdisc change dev eth0 root netem delay 100ms 75msIf the first packet gets a random delay of 100ms (100ms base- 0ms jitter) and the second packet is sent 1ms later andgets a delay of 50ms (100ms base - 50ms jitter); the secondpacket will be sent first. This is because the queuediscipline tfifo inside netem, keeps packets in order by timeto send.If you dont want this behavior then replace the internal queuediscipline tfifo with a simple FIFO queue discipline.# tc qdisc add dev eth0 root handle 1: netem delay 10ms 100ms# tc qdisc add dev eth0 parent 1:1 pfifo limit 1000Example of using rate control and cells size.# tc qdisc add dev eth0 root netem rate 5kbit 20 100 5Delay all outgoing packets on device eth0 with a rate of5kbit, a per packet overhead of 20 byte, a cellsize of 100byte and a per celloverhead of 5 bytes.
高级用法
It is possible to selectively有选择的 apply impairment损伤 using traffic
classification.
# tc qdisc add dev eth0 root handle 1: prio
# tc qdisc add dev eth0 parent 1:3 handle 30: tbf rate 20kbit buffer 1600 limit 3000
# tc qdisc add dev eth0 parent 30:1 handle 31: netem delay 200ms 10ms distribution normal
# tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 match ip dst 65.172.181.4/32 flowid 1:3This eample uses a priority优先级 queueing discipline规则; a TBF isadded to do rate control; and a simple netem delay. A filterclassifies all packets going to 65.172.181.4 as beingpriority 3.从上述命令来看可以根据实际使用需求设定包过滤器。
tc qdisc add dev $(net) root handle 1:0 prio bands 4
tc qdisc add dev $(net) parent 1:4 handle 40: netem delay $dvalue
tc filter add dev $(net) protocol ip parent 1:0 prio 4 u32 match ip dst $(ip) match ip dport $(port) 0xffff flowid 1:4根root qdisc的handle为默认为1:0因为root qdisc为 classless pfifo_fast qdisc。 pfifo_fast 有三个所谓的 “band”可理解为三个队列编号分别为 0、1、2默认是三个在指定bands个数最少为3 否则报错如下所示
root:~# tc qdisc add dev ens19 root handle 1: prio bands 1
RTNETLINK answers: Invalid argument
root:~# tc qdisc add dev ens19 root handle 1: prio bands 2
RTNETLINK answers: Invalid argument疑问可以根据需求自定义添加pfifo_fast qdisc的band? - - 从实现结果来看确实可以按需配置。
每个 band 上分别执行 FIFO 规则。 如果 band 0 有数据就不会处理 band 1同理band 1 有数据时不会去处理 band 2。 内核会检查数据包的 TOS 字段将“最小延迟”的包放到 band 0。
tc qdisc add dev $(net) root handle 1:0 prio bands 4
handle 队列规则句柄可以理解为网络流量流经的路径上的一个标识默认1:0为根节点也可以自定义 比如说为10:0。root handle 1:0 表示创建一个根队列并将其标识为1:0。prio 表示使用优先级调度算法如果不指定具体的值如tc qdisc del dev ens19 root handle 1:0 prio则默认prio的值为1如果不指定该参数如tc qdisc del dev ens19 root handle 1:0不指定prio将会报错Error: Specified qdisc kind is unknown.。bands 4 表示创建4个子队列如果不指定该值root handle默认为3个bands。
树形结构 1: root qdisc/ | \/ | \/ | \1:1 1:2 1:3 classes| | |10: 20: 30: qdiscs qdiscssfq tbf sfq
band 0 1 2tc qdisc add dev $(net) parent 1:4 handle 40: netem delay $dvalue
handle 40 指定qdisc子class句柄为40:0这个值也是可以根据需求去指定的。netem 参数可以理解为指定包的排队规则还有其他排队规则如pfifo_fast TBF SFQ FQNetem是Linux 2.6及以上内核版本提供的一个网络模拟功能模块这就是为什么需要单独加载sch_netem内核模块的原因该功能模块可以用来在性能良好的局域网中模拟出复杂的互联网传输性能注入低带宽传输延迟丢包等故障。
tc filter add dev $(net) protocol ip parent 1:0 prio 4 u32 match ip dst $(ip) match ip dport $(port) 0xffff flowid 1:4
protocol ip 匹配 ip protocol也可以使用 /etc/protocols 里面的协议号。u32 一种匹配规则特点是能匹配包的任何部分。match ip dst $(ip) match ip dport $(port) 0xffff 目的dst_ip/port的所有ip协议的所有包。u32 match ip sport 80 0xffffIP头中的源端口号是一个16位的字段范围从0到65535。使用0xffff作为掩码意味着我们希望匹配所有的源端口号因为0xffff的二进制表示为16个1它与任何16位的源端口号进行逻辑与操作时都会匹配所以上述命令已经制定了dst_ip/dport是不是不需要指定0xffff实际使用如果要匹配端口不接0xffff会报错Illegal match也就是必须输入的参数。flowid 1:4 将特定的流量流向标识为1:4的子队列以便对该流量应用特定的规则和限制。
查看某个interface的filter 规则。
tc filter show dev ens18查看某个interface的class。
tc class show dev ens18仅仅匹配sport是生效的ssh到目标主机有明显的延迟。
tc filter add dev ens18 protocol ip parent 1:0 prio 4 u32 match ip sport 22 0xffff flowid 1:4为什么match规则为source ip存在问题将src替换为dst是生效的
tc filter add dev ens18 protocol ip parent 1:0 prio 4 u32 match ip src 192.168.0.207 flowid 1:4指定本地网卡只匹配src ip地址是不生效指定本地网卡只匹配src port是生效匹配src ip src port不生效只匹配dst ip地址生效只匹配dst port生效匹配dst ip dst port生效
原因分析 子网掩码255.255.255.0 - - 24 子网掩码255.255.240.0 - - 20 在指定本地网卡为src ip时需要指定子网掩码指定子网掩码之后延迟效果是存在的默认的子网掩码为255.255.255.0可以通过ifconfig或者ip addr show来查看网卡配置的子网掩码。
特别注意 设定规则之后如果对应网卡被移除对应的规则也将会丢失。