linux 系统下模拟网络丢失和ping延迟,可以怎么来模拟

在 Linux 系统中,模拟网络延迟、丢包最主流、最稳定的方案是内核自带的 tc+netem,其次是 iptables(仅丢包),还有进阶的混沌工程工具,以下是详细可直接落地的操作方法,所有操作均需 root 权限(sudo)执行。


一、核心方案:tc + netem(系统自带,全功能)

netem(Network Emulator)是 Linux 内核 2.6 及以上版本内置的网络模拟模块,配合tc(Traffic Control,流量控制)工具,可同时模拟延迟、丢包、抖动、乱序、重复包等各类网络异常,是生产测试、混沌演练的首选方案,无需额外安装软件。

前置准备

  1. 确认网卡名称(替换下文所有eth0为你的实际网卡名)
bash 复制代码
ip addr  # 查看网卡,常见名称:eth0、ens33、enp0s3、bond0等
  1. 远程操作防断连提醒:远程 SSH 操作时,建议先设置定时恢复规则,避免高延迟 / 高丢包导致断连无法恢复:

    bash 复制代码
    # 5分钟后自动清空网卡规则,防止锁死
    echo "tc qdisc del dev eth0 root" | at now + 5 minutes

1. 模拟网络延迟(ping 延迟)

基础固定延迟

给网卡出口流量添加固定延迟,比如固定 100ms 延迟:

bash 复制代码
tc qdisc add dev eth0 root netem delay 100ms
带抖动的随机延迟

模拟真实网络的延迟波动,比如基准 100ms,上下浮动 ±20ms:

bash 复制代码
tc qdisc add dev eth0 root netem delay 100ms 20ms
带相关性的延迟抖动

模拟网络波动的连贯性(前一个包的抖动会影响后一个包),比如 100ms±20ms,相关性 30%:

bash 复制代码
tc qdisc add dev eth0 root netem delay 100ms 20ms 30%
正态分布延迟

默认是均匀分布,可改为更贴合真实公网的正态分布:

bash 复制代码
tc qdisc add dev eth0 root netem delay 100ms 20ms distribution normal

2. 模拟网络丢包

基础固定丢包率

设置随机丢包率,比如 5% 丢包:

bash 复制代码
tc qdisc add dev eth0 root netem loss 5%
带相关性的突发丢包

模拟真实网络的突发丢包(前一个包丢了,后一个包丢包概率更高),比如 5% 丢包,相关性 25%:

bash 复制代码
tc qdisc add dev eth0 root netem loss 5% 25%
更真实的突发丢包模型

使用 Gilbert-Elliot 模型模拟网络拥塞导致的连续丢包,比如 10% 丢包率:

bash 复制代码
tc qdisc add dev eth0 root netem loss gemodel 10%

3. 组合模拟(延迟 + 丢包同时生效)

最常用的场景,同时设置延迟和丢包,比如 100ms 延迟 ±20ms 抖动 + 5% 丢包:

bash 复制代码
tc qdisc add dev eth0 root netem delay 100ms 20ms loss 5%

4. 规则管理(查看 / 修改 / 清除)

查看已配置的规则
bash 复制代码
tc qdisc show dev eth0
修改已有规则(无需删除重配)

比如把现有规则改为 200ms 延迟、3% 丢包:

bash 复制代码
tc qdisc change dev eth0 root netem delay 200ms loss 3%
清除所有规则(恢复正常网络,必看!)

测试完成后必须执行,否则规则会一直生效:

bash 复制代码
# 清空该网卡所有netem规则
tc qdisc del dev eth0 root netem
# 彻底清空该网卡所有根队列规则(兜底恢复)
tc qdisc del dev eth0 root

5. 模拟入方向( ingress )的延迟 / 丢包

netem默认仅对 ** 出口流量(egress)** 生效,若需模拟入口流量(比如客户端访问本机的延迟 / 丢包),需通过ifb模块重定向入口流量:

bash 复制代码
# 1. 加载ifb模块
modprobe ifb
# 2. 启用ifb虚拟网卡
ip link set dev ifb0 up
# 3. 把eth0的入口流量重定向到ifb0
tc qdisc add dev eth0 ingress
tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ifb0
# 4. 给ifb0配置延迟/丢包规则(和出口配置完全一致)
tc qdisc add dev ifb0 root netem delay 100ms loss 5%

# 入方向规则清除
tc qdisc del dev eth0 ingress
tc qdisc del dev ifb0 root
ip link set dev ifb0 down

二、轻量方案:iptables 模拟丢包(仅丢包,无延迟)

iptables是系统自带的防火墙工具,通过statistic模块可实现随机丢包,优点是配置极简,适合仅需丢包测试的场景,无法模拟延迟

常用配置命令

1. 随机丢包(入方向)

对本机收到的所有包,随机丢弃 5%:

bash 复制代码
iptables -A INPUT -m statistic --mode random --probability 0.05 -j DROP
2. 随机丢包(出方向)

对本机发出的所有包,随机丢弃 5%:

bash 复制代码
iptables -A OUTPUT -m statistic --mode random --probability 0.05 -j DROP
3. 针对特定 IP 的丢包

仅对目标 IP 192.168.1.100 的出流量丢包 5%:

bash 复制代码
iptables -A OUTPUT -d 192.168.1.100 -m statistic --mode random --probability 0.05 -j DROP

规则管理

查看已配置的丢包规则
bash 复制代码
iptables -L -n -v
清除规则
bash 复制代码
# 方法1:删除指定规则(替换为你添加的对应命令,把-A改为-D)
iptables -D INPUT -m statistic --mode random --probability 0.05 -j DROP

# 方法2:清空对应链(谨慎使用,会清空该链所有防火墙规则)
iptables -F INPUT
iptables -F OUTPUT

三、进阶工具(简化操作 / 自动化测试)

1. ChaosBlade(阿里开源混沌工程工具)

封装了底层命令,语法极简,适合自动化测试、批量演练,支持延迟、丢包、断网等全场景:

bash 复制代码
# 安装(一键脚本)
curl -L https://chaosblade.oss-cn-hangzhou.aliyuncs.com/agent/github/latest/chaosblade-latest-linux-amd64.tar.gz | tar -xz && cd chaosblade-*-linux-amd64

# 模拟100ms延迟
./blade create network delay --time 100 --interface eth0

# 模拟5%丢包
./blade create network loss --percent 5 --interface eth0

# 销毁规则(恢复网络)
./blade destroy <执行后返回的UID>

2. tcconfig(tc 命令简化工具)

基于 Python 封装的 tc 工具,无需记忆复杂的 tc 语法,一行命令完成配置:

bash 复制代码
# 安装
pip install tcconfig

# 配置100ms延迟+5%丢包
tcset eth0 --delay 100ms --loss 5%

# 查看规则
tcshow eth0

# 清除所有规则
tcdel eth0 --all

四、效果验证

配置完成后,通过以下命令验证延迟和丢包是否生效:

  1. ping 命令(最直接)
bash 复制代码
ping 目标IP/域名
# 查看输出中的 time=xxx ms(延迟) 和 packet loss(丢包率)
  1. mtr 命令(可视化链路丢包 + 延迟)

    mtr --report 目标IP/域名


关键注意事项

  1. 所有规则重启服务器后会失效,如需永久生效,需把规则写入开机启动脚本。
  2. 远程操作时,严禁设置 100% 丢包或超过 500ms 的高延迟,极易导致 SSH 断连。
  3. 若服务器有多个网卡,需针对对应网卡单独配置规则。
  4. 测试完成后务必清除规则,避免持续影响业务网络。
相关推荐
brahmsjiang2 小时前
理解Android AOT编译与内存映射:从Zygote启动到页表权限隔离
android·linux·zygote
亚空间仓鼠2 小时前
OpenEuler系统常用服务(十)
linux·运维·服务器·网络
艾莉丝努力练剑2 小时前
【Linux线程】Linux系统多线程(四):线程ID及进程地址空间布局,线程封装
java·linux·运维·服务器·c语言·c++·学习
同聘云2 小时前
阿里云国际站 服务器的“客户端” (Client) 和 “服务器” (Server)到底是什么?有什么区别?
服务器·网络·阿里云·云计算·云小强
dddddppppp1232 小时前
linux head.s 从第一条指令到start_kernel
linux·运维·服务器
ZGi.ai2 小时前
一个LLM网关需要处理哪些工程问题?多模型路由与成本归因实战
大数据·网络·人工智能
BioRunYiXue2 小时前
AlphaGenome:DeepMind 新作,基因组学迎来 Alpha 时刻
java·linux·运维·网络·数据库·人工智能·eclipse
十五年专注C++开发2 小时前
windows和linux使用system启动进程是一样的吗?
linux·c++·windows·system
fengci.2 小时前
php反序列化(复习)(第四章)
android·开发语言·学习·php·android studio