最近在测试的时候发现一个比较难复现的Bug,这个Bug只有在弱网(网速不稳定或者上传速度很慢的时候)的情况下才会有可能触发,所以为了模拟弱网环境让 DeepSeek 给我写了一个弱网脚本
#!/bin/bash
# 弱网模拟脚本 weak_network.sh
# 功能:通过 dnctl + pfctl 动态限制本机出口流量(支持恢复)
# 参数:start 启动弱网 | stop 恢复网络
# 自定义参数(根据需求修改下方数值)
BANDWIDTH="51Kbit/s" # 带宽限制(示例:模拟慢速网络)
DELAY="500ms" # 延迟(示例:500 毫秒)
PACKET_LOSS="0.1" # 丢包率(示例:10% 丢包)
# 检查权限
if [ "$(id -u)" -ne 0 ]; then
echo "请使用 sudo 执行脚本(需 root 权限)"
exit 1
fi
case "$1" in
start)
# 创建网络限速管道
dnctl pipe 1 config bw $BANDWIDTH delay $DELAY plr $PACKET_LOSS > /dev/null 2>&1
# 配置防火墙规则(限制所有出口流量)
(cat /etc/pf.conf && echo "dummynet out all pipe 1") | pfctl -f - > /dev/null 2>&1
# 启用防火墙
pfctl -e > /dev/null 2>&1
echo "✅ 弱网已启用:带宽 $BANDWIDTH | 延迟 $DELAY | 丢包率 ${PACKET_LOSS}0%"
;;
stop)
# 清除限速规则
dnctl -q flush
pfctl -F all -f /etc/pf.conf > /dev/null 2>&1
# 关闭防火墙(可选,不影响系统自带规则)
pfctl -d > /dev/null 2>&1Q
echo "✅ 网络已恢复"
;;
*)
echo "用法: sudo $0 [start|stop]"
echo "示例:"
echo " sudo $0 start # 启用弱网(带宽/延迟/丢包)"
echo " sudo $0 stop # 恢复网络"
exit 1
;;
esac
基本思路就是创建一个管道并限制了带宽、延迟和丢包率,然后配置防火墙规则让所有流量走这个管道。