运维过程中,最复杂的问题,莫过于网络的问题,而网络问题最烦的就是无法复现,这篇介绍一个强大的网络模拟工具Netem。
Netem是从linux 2.6以上内核版本开始提供的一个网络模拟功能模块,它主要用来在性能良好的网络环境中,模拟出复杂的网络传输性能,比如低带宽、传输延迟、丢包等各种常见的网络故障的情况。
而Netem是由命令行工具tc控制,tc我们应该比较熟悉,tc是iproute2工具包的一部分,它的全称是traffic control(流量控制),最常用的莫过于通过nc监听进行反弹shell。
tc主要用于linux内核的流量控制,主要是通过在是输出端口处建立一个队列来实现流量控制,接收包从输入接口进来后,经过流量限制,丢弃不符合规定的数据包,由输入多路分配器进行判断选择,如果接收包的目的是本主机,那么将该包送给上层处理,否则需要进行转发,将接收包交到转发块处理,转发块同时也接收本机上层(TCP、UDP等)产生的包。转发块通过查看路由表,决定所处理包的下一跳,然后对包进行排列以便将他们传送到输出接口,一般我们只能限制网卡发送的数据包,不太好限制网卡接收的数据包,所以我们可以通过改变发送次序来控制传输速率,linux流量控制主要是在输出接口排列时进行处理和实现的。
关于linux内部网络包转发,在公众号之前发过的文章《nfstable比iptables强在哪里》里面有较详细的介绍,这里就不罗嗦了,有兴趣的可以点进去看下。
回到正题,我们主要通过tc工具加Netem模块进行网络状况的模拟,看下netem模块的强大功能
网络状况不好的情况通常就是以下几个表现:延迟、丢包、乱序、重复、错误等,我们就通过netem来模拟以上这几种情况,建议不要生产环境测试,熟练掌握后再使用
在tc配置netem的操作中,主要有4个控制参数,分别是add(表示为指定网卡添加Netem配置),change(表示修改已经存在的Netem配置),replace(表示替换已经存在的Netem配置的值),del(表示删除网卡上的Netem配置),好了,接着开始测试几种情况。