本文目录导读:

我可以为您提供多种模拟网络故障的脚本方案,涵盖不同场景和操作系统。
Linux系统下的模拟方案
使用tc命令模拟网络延迟和丢包
#!/bin/bash
# network_fault_simulator.sh
# 使用方法: ./network_fault_simulator.sh <接口名> <操作>
# 操作: start | stop | status
INTERFACE="${1:-eth0}"
ACTION="${2:-start}"
show_help() {
echo "用法: $0 [接口名] [start|stop|status]"
echo "示例:"
echo " $0 eth0 start # 开始模拟网络故障"
echo " $0 eth0 stop # 停止模拟"
echo " $0 eth0 status # 查看当前状态"
echo ""
echo "说明:"
echo " 默认模拟300ms延迟 + 10%丢包率"
echo " 可自定义参数: $0 eth0 start 500 20 (500ms延迟 20%丢包)"
}
start_sim() {
DELAY="${3:-300}"
LOSS="${4:-10}"
echo "开始模拟网络故障..."
echo "接口: $INTERFACE"
echo "延迟: ${DELAY}ms"
echo "丢包率: ${LOSS}%"
# 清空已有规则
tc qdisc del dev $INTERFACE root 2>/dev/null
# 添加延迟和丢包
tc qdisc add dev $INTERFACE root netem delay ${DELAY}ms loss ${LOSS}%
echo "模拟已启动"
}
stop_sim() {
echo "停止模拟..."
tc qdisc del dev $INTERFACE root 2>/dev/null
echo "模拟已停止"
}
check_status() {
echo "当前网络配置:"
tc qdisc show dev $INTERFACE
}
case $ACTION in
start)
start_sim
;;
stop)
stop_sim
;;
status)
check_status
;;
*)
show_help
;;
esac
模拟网络不可达(断网)
#!/bin/bash
# network_down_simulator.sh
# 模拟网络断开(针对入站或出站流量)
MITM_INTERFACE="eth0"
TARGET_INTERFACE="eth0"
ACTION="${1:-down}"
network_down() {
echo "模拟网络断开..."
# 阻止所有入站流量
iptables -I INPUT 1 -i $TARGET_INTERFACE -j DROP
# 阻止所有出站流量
iptables -I OUTPUT 1 -o $TARGET_INTERFACE -j DROP
echo "网络已断开"
}
network_up() {
echo "恢复网络连接..."
# 清除规则
iptables -D INPUT -i $TARGET_INTERFACE -j DROP 2>/dev/null
iptables -D OUTPUT -o $TARGET_INTERFACE -j DROP 2>/dev/null
echo "网络已恢复"
}
case $ACTION in
down)
network_down
;;
up)
network_up
;;
*)
echo "用法: $0 [down|up]"
;;
esac
高级故障模拟(随机故障)
#!/bin/bash
# random_network_faults.sh
# 模拟随机网络故障,包括延迟、丢包、带宽限制等
INTERFACE="eth0"
FAULT_DURATION=30 # 每次故障持续30秒
FAULT_INTERVAL=60 # 每60秒执行一次
declare -A FAULT_TYPES=(
["delay"]="模拟高延迟 (500ms)"
["loss"]="模拟高丢包 (30%)"
["bandwidth"]="限制带宽 (10kbps)"
["down"]="模拟断网"
["flapping"]="模拟网络抖动"
)
random_fault() {
local faults=("${!FAULT_TYPES[@]}")
local foguer=$(($RANDOM % ${#faults[@]}))
local fault_type="${faults[$foguer]}"
echo "[$(date '+%H:%M:%S')] 开始模拟: ${FAULT_TYPES[$fault_type]}"
case $fault_type in
"delay")
tc qdisc change dev $INTERFACE root netem delay 500ms 100ms distribution normal
;;
"loss")
tc qdisc change dev $INTERFACE root netem loss 30% 10%
;;
"bandwidth")
tc qdisc change dev $INTERFACE root tbf rate 10kbit burst 32kbit latency 400ms
;;
"down")
ip link set $INTERFACE down
;;
"flapping")
for i in {1..10}; do
ip link set $INTERFACE up
sleep 1
ip link set $INTERFACE down
sleep 1
done
;;
esac
sleep $FAULT_DURATION
# 恢复默认
tc qdisc del dev $INTERFACE root 2>/dev/null
ip link set $INTERFACE up
echo "[$(date '+%H:%M:%S')] 故障恢复"
}
echo "开始随机网络故障模拟..."
echo "每 ${FAULT_INTERVAL}秒执行一次,每次持续 ${FAULT_DURATION}秒"
echo "按 Ctrl+C 停止"
while true; do
sleep $FAULT_INTERVAL
random_fault
done
Windows系统下的模拟方案
PowerShell脚本
# network_fault_simulator.ps1
param(
[string]$InterfaceName = "以太网",
[string]$Action = "delay",
[int]$Duration = 30,
[int]$DelayMs = 300,
[int]$LossRate = 10
)
function Start-Simulation {
Write-Host "开始模拟网络故障..." -ForegroundColor Yellow
switch ($Action) {
"delay" {
Write-Host "模拟延迟: ${DelayMs}ms" -ForegroundColor Cyan
# 使用Clumsy或其类似工具进行模拟
Start-Process "clumsy.exe" -ArgumentList "--filter","tcp and port 8080","--delay","$DelayMs"
}
"loss" {
Write-Host "模拟丢包: ${LossRate}%" -ForegroundColor Cyan
Start-Process "clumsy.exe" -ArgumentList "--filter","tcp and port 8080","--drop","$LossRate"
}
"down" {
Write-Host "模拟断网..." -ForegroundColor Red
Disable-NetAdapter -Name $InterfaceName -Confirm:$false
}
}
Start-Sleep -Seconds $Duration
if ($Action -eq "down") {
Enable-NetAdapter -Name $InterfaceName -Confirm:$false
Write-Host "网络已恢复" -ForegroundColor Green
} else {
Stop-Process -Name "clumsy" -Force -ErrorAction SilentlyContinue
Write-Host "模拟结束" -ForegroundColor Green
}
}
Start-Simulation
使用netsh模拟(仅丢包)
@echo off
REM network_fault_simulator.bat
REM 使用Windows防火墙进行简单的网络故障模拟
echo 网络故障模拟 - Windows版本
echo ================================
echo 1. 模拟高延迟(建议使用第三方工具)
echo 2. 模拟丢包
echo 3. 模拟网络禁用
echo 4. 恢复所有设置
echo ================================
set /p choice="请选择操作 (1-4): "
if "%choice%"=="1" (
echo 抱歉,Windows原生不支持延迟模拟,请使用Clumsy等工具
pause
exit
)
if "%choice%"=="2" (
echo 模拟20%丢包...
netsh advfirewall firewall add rule name="DropTest" dir=out action=block protocol=TCP remoteport=8080
echo 规则已添加
echo 运行测试后请执行本脚本并选择4恢复
pause
exit
)
if "%choice%"=="3" (
echo 禁用网络适配器...
wmic path win32_networkadapter where "NetConnectionID='以太网'" call disable
echo 等待30秒后自动恢复...
timeout /t 30
wmic path win32_networkadapter where "NetConnectionID='以太网'" call enable
echo 已恢复
pause
exit
)
if "%choice%"=="4" (
echo 恢复所有设置...
netsh advfirewall firewall delete rule name="DropTest"
echo 已恢复
pause
exit
)
容器/Docker环境下的模拟
# docker-compose.fault-simulator.yml
version: '3.8'
services:
fault-simulator:
image: gaiaadm/pumba:latest
container_name: pumba-fault-simulator
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: >
--random
--interval 60s
netem
--duration 30s
--tc-image gaiadocker/iproute2:latest
delay --time 500 --jitter 100
网络代理工具模拟
使用Mitmproxy或Charles等工具进行更精细的控制:
# mitmproxy_fault_sim.py
from mitmproxy import http
import random
import time
class FaultSimulator:
def __init__(self, delay=0.5, loss_rate=0.1):
self.delay = delay
self.loss_rate = loss_rate
def request(self, flow: http.HTTPFlow) -> None:
# 模拟延迟
if self.delay > 0:
time.sleep(self.delay)
flow.request.headers["X-Simulated-Delay"] = str(self.delay)
# 模拟丢包
if random.random() < self.loss_rate:
flow.response = http.Response.make(
503,
b"Service Unavailable (Simulated)",
{"Content-Type": "text/plain"}
)
flow.request.headers["X-Simulated-Loss"] = "true"
def response(self, flow: http.HTTPFlow) -> None:
# 可以在此处模拟响应篡改
pass
addons = [FaultSimulator()]
使用建议
测试场景示例
- 高并发测试: 结合延迟和丢包测试系统容错
- 故障恢复测试: 模拟断网后验证自动恢复机制
- 超时测试: 设置高延迟测试客户端超时处理
- 带宽限制测试: 模拟低带宽环境
注意事项
- 在测试环境运行,避免影响生产环境
- 添加日志记录所有的故障模拟操作
- 设置自动恢复机制,防止忘记恢复
- 监控系统指标,评估故障影响
选择适合您场景的方案,如果需要特定场景的模拟(如特定协议、特定端口),请告诉我,我可以提供更针对性的方案。