iptables -m statistic --mode random 可实现轻量精准的随机丢包,需 root 权限并确认 xt_statistic 模块已加载;INPUT 方向影响客户端到本机流量,OUTPUT 影响本机到下游服务流量;务必提前备份规则、设置自动清理与外部验证机制。

直接用 iptables -m statistic --mode random 就能实现按指定概率随机丢包,这是 Linux 下轻量、精准、无需额外工具的弱网模拟方式,适合服务端压测或爬虫干扰场景。
确认内核支持 statistic 模块
该功能依赖内核模块 xt_statistic,不支持则命令会报错:
- 运行
lsmod | grep statistic,有输出表示已加载 - 若无输出,执行
modprobe xt_statistic尝试动态加载 - 部分精简系统(如某些容器镜像或定制内核)可能未编译该模块,此时需改用
tc netem
基础丢包命令写法(方向与范围要分清)
所有规则需 root 权限,默认作用于 filter 表。注意 INPUT/OUTPUT 方向决定影响哪段链路:
- 模拟“客户端→本机”丢包(如用户访问你的 Web 服务):
iptables -A INPUT -m statistic --mode random --probability 0.2 -j DROP
→ 对发往本机的所有匹配包,以 20% 概率静默丢弃 - 模拟“本机→下游服务”丢包(如你的服务调用第三方 API):
iptables -A OUTPUT -p http -m statistic --mode random --probability 0.1 -j DROP - 仅针对某端口(更贴近真实压测):
iptables -A INPUT -p tcp --dport 8080 -m statistic --mode random --probability 0.3 -j DROP
→ 只扰动 8080 接口流量,不影响 SSH(22)、健康检查等关键端口
避免失联与安全退出机制
这类规则极易导致自己断连(尤其误配 OUTPUT 后无法 SSH),必须提前设防:
- 添加前先备份当前规则:
iptables-save > /root/iptables-before-loss.rules - 加自动清理定时任务(推荐):
(sleep 300; iptables -D INPUT -m statistic --mode random --probability 0.2 -j DROP 2>/dev/null) &
→ 5 分钟后自动移除该规则,留出操作窗口 - 验证是否生效:
iptables -L INPUT -v -n | grep DROP,观察 packets 计数是否随测试增长 - 快速清空丢包规则(可批量执行):
iptables -D INPUT -m statistic --mode random --probability 0.2 -j DROP 2>/dev/null
配合可观测性验证效果
丢包本身不反馈,必须结合外部观测才能确认是否起效:
- 用
hping3或curl -v持续发请求,统计失败率是否接近设定概率 - 服务端查看连接重传次数(
netstat -s | grep -i "retransmitted") - 应用层记录超时日志比例,对比丢包前后变化
- 若同时用了
tc netem,注意两者叠加效应——tc在 qdisc 层,iptables在 netfilter 层,丢包计数互不包含










