Mac 强制弱网环境脚本

198 阅读1分钟

最近在测试的时候发现一个比较难复现的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

基本思路就是创建一个管道并限制了带宽、延迟和丢包率,然后配置防火墙规则让所有流量走这个管道。