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. 测试完成后务必清除规则,避免持续影响业务网络。
相关推荐
何妨呀~1 分钟前
Firewalld防火墙端口配置
linux
切糕师学AI8 分钟前
Vim 深度解析:从经典 vi 到现代编辑器之巅
linux·vim·文本编辑器
计算机安禾32 分钟前
【Linux从入门到精通】第49篇:服务器故障排查终极指南——思路决定出路
linux·运维·服务器
古月-一个C++方向的小白34 分钟前
Linux——初识文件
linux·运维·服务器
北山有鸟1 小时前
编译香橙派内核
linux·运维·服务器
段一凡-华北理工大学1 小时前
【高炉炼铁领域炉温监测、预警、调控智能体设计与应用】~系列文章06:智能决策:从经验驱动到数据驱动
网络·人工智能·数据挖掘·高炉炼铁·工业智能体·高炉炉温
小此方1 小时前
Re:Linux系统篇(八)权限篇 ·三:深度解析从 umask 位运算到粘滞位的“权力锁”
linux·运维·服务器
晨曦夜月1 小时前
进程的五大状态及特殊进程解析
linux·服务器·算法
生而为虫1 小时前
Claude Code 最新版安装教程(Windows/Mac/Linux 全平台) 面向普通用户的 Claude Code 安装与模型接入指南
linux·windows·macos
Sarvartha2 小时前
三目运算符
linux·服务器·前端