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. 测试完成后务必清除规则,避免持续影响业务网络。
相关推荐
一叶龙洲10 小时前
wslg打开Ubuntu24.04默认打开图形界面
linux·服务器·数据库·ubuntu
星恒讯工业路由器12 小时前
5G FWA技术演进与趋势
网络·5g·信息与通信·4g·5g fwa·3gpp规范·fwa趋势
敖行客 Allthinker12 小时前
Parallels Ubuntu虚拟机项目如何让手机访问?完整解决方案
linux·运维·ubuntu
keyipatience13 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
j7~14 小时前
【Linux】二十二.《Linux 信号机制完全指南:表示、捕捉与处理》
linux·信号处理·volatile·可入重函数·保存信号
weixin_4080996714 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
观山岳五楼14 小时前
Ubuntu 24 怎么使用Ubuntu 20 的镜像源
linux·运维·ubuntu
星夜夏空9915 小时前
网络编程(1)
服务器·网络
上海云盾-小余15 小时前
中小站点防护避坑:低价高防服务存在的各类安全短板剖析
网络·爬虫·安全·ddos
m0_7156467615 小时前
20260720
linux·arm