- 01 简介
- 02 前提条件
- 2.1 权限
- 2.2 iproute2安装
- 03 操作详解
- 3.1 查看当前网络规则
- 3.2 清除所有网络规则
- 3.3 添加网络异常规则
- 3.3.1 模拟固定延迟和随机抖动
- 3.3.2 模拟丢包
- 3.3.3 模拟包损坏
- 3.3.4 模拟包重复
- 3.3.5 复合异常
- 04 高级用法
- 4.1 精确延迟分布
- 4.2 多队列规则
- 4.3 组合其他 qdisc
01 简介
netem(Network Emulation)是 Linux 内核提供的网络仿真工具,用于在指定网络接口上模拟各种网络异常行为,例如:
- 延迟(Delay):模拟网络传输延迟。
- 丢包(Loss):模拟数据包丢失。
- 包损坏(Corrupt):模拟数据包在传输中被破坏。
- 包重复(Duplicate):模拟数据包重复发送。
- 包乱序(Reorder):模拟数据包到达顺序打乱。
这些功能通过 tc 命令配置,作用于特定网络接口(如 eth0)。以下是具体操作步骤和示例。
以下是常用命令:
- 查看当前网络接口的队列规则
tc qdisc show dev eth0
- 清除 eth0 上的所有网络规则
sudo tc qdisc del dev eth0 root
- 添加固定延迟和随机抖动(100ms 固定延迟,±50ms 抖动)
sudo tc qdisc add dev eth0 root netem delay 100ms 50ms
- 添加丢包率(5% 丢包概率)
sudo tc qdisc add dev eth0 root netem loss 5%
- 添加包损坏(10% 数据包损坏概率)
sudo tc qdisc add dev eth0 root netem corrupt 10%
- 添加包重复(10% 数据包重复概率)
sudo tc qdisc add dev eth0 root netem duplicate 10%
- 组合多种网络异常(500ms 延迟,5% 丢包,5% 损坏,5% 重复,5% 乱序)
sudo tc qdisc add dev eth0 root netem delay 500ms loss 5% corrupt 5% duplicate 5% reorder 5%
02 前提条件
2.1 权限
所有 tc 命令需以 root 权限执行(使用 sudo)。
2.2 iproute2安装
使用前,请确保系统中已安装 iproute2 包(包含 tc 命令)。
在 Ubuntu/Debian 系统中,可通过以下命令安装:
sudo apt update
sudo apt install iproute2
在 CentOS/RedHat 系统中,可以通过以下命令安装:
# 较老的CentOS
sudo yum install iproute
# 8.0以上版本的CentOS
sudo dnf install iproute
03 操作详解
3.1 查看当前网络规则
查看网络接口 eth0 上的队列规则(qdisc):
tc qdisc show dev eth0
输出为:
qdisc netem 8001: root refcnt 2 limit 1000 delay 100.0ms 50.0ms
- qdisc netem:表示当前使用 netem 队列规则。
- delay 100.0ms 50.0ms:表示固定延迟 100ms,随机抖动 ±50ms。
如果没有输出,表示该接口上没有配置任何队列规则。
3.2 清除所有网络规则
sudo tc qdisc del dev eth0 root
3.3 添加网络异常规则
以下是使用 tc 和 netem 配置各种网络异常的示例。所有命令都以 eth0 为目标接口,作用于根队列(root)。
3.3.1 模拟固定延迟和随机抖动
为 eth0 添加 100ms 的固定延迟,并允许 ±50ms 的随机抖动:
sudo tc qdisc add dev eth0 root netem delay 100ms 50ms
- delay 100ms:固定延迟 100 毫秒。
- 50ms:随机抖动范围 ±50ms(即实际延迟在 50ms 到 150ms 之间)。
验证:使用 ping 或 traceroute 测试网络延迟:
ping 8.8.8.8
3.3.2 模拟丢包
为 eth0 设置 5% 的丢包率,并允许 25% 的相关性(影响丢包的随机性):
sudo tc qdisc add dev eth0 root netem loss 5% 25%
- loss 5%:数据包有 5% 的概率丢失。
- 25%:丢包的相关性,较高的值会使丢包事件更倾向于连续发生。
验证:使用 ping 或 traceroute 测试网络延迟:
ping 8.8.8.8
3.3.3 模拟包损坏
为 eth0 设置 10% 的数据包损坏概率:
sudo tc qdisc add dev eth0 root netem corrupt 10%
- corrupt 10%:数据包有 10% 的概率被随机修改(模拟传输错误)。
验证:运行需要校验的协议(如 TCP)测试,观察是否出现重传。
3.3.4 模拟包重复
为 eth0 设置 10% 的数据包重复概率:
sudo tc qdisc add dev eth0 root netem duplicate 10%
- duplicate 10%:数据包有 10% 的概率被复制并重复发送。
验证:使用抓包工具(如 tcpdump)观察是否有重复的数据包:
sudo tcpdump -i eth0
3.3.5 复合异常
可以组合多种异常规则。例如,为 eth0 设置 500ms 延迟、5% 丢包、5% 包损坏、5% 包重复和 5% 包乱序:
sudo tc qdisc add dev eth0 root netem delay 500ms loss 5% corrupt 5% duplicate 5% reorder 5%
- delay 500ms:固定延迟 500 毫秒。
- loss 5%:5% 丢包率。
- corrupt 5%:5% 包损坏概率。
- duplicate 5%:5% 包重复概率。
- reorder 5%:5% 的数据包可能乱序(需配合延迟使用)。
04 高级用法
4.1 精确延迟分布
可以通过 distribution 参数指定延迟的分布类型,例如正态分布:
sudo tc qdisc add dev eth0 root netem delay 100ms 20ms distribution normal
4.2 多队列规则
可以为不同类型的流量设置不同的规则,使用 tc 的 filter 功能。例如,针对特定 IP 的流量:
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.1.100 flowid 1:1
4.3 组合其他 qdisc
netem 可以与其他队列规则(如 htb 或 fq_codel)结合使用,以实现更复杂的流量控制。