怎么用脚本模拟网络故障

wen 实用脚本 2

本文目录导读:

怎么用脚本模拟网络故障

  1. Linux系统下的模拟方案
  2. Windows系统下的模拟方案
  3. 容器/Docker环境下的模拟
  4. 网络代理工具模拟
  5. 使用建议

我可以为您提供多种模拟网络故障的脚本方案,涵盖不同场景和操作系统。

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()]

使用建议

测试场景示例

  1. 高并发测试: 结合延迟和丢包测试系统容错
  2. 故障恢复测试: 模拟断网后验证自动恢复机制
  3. 超时测试: 设置高延迟测试客户端超时处理
  4. 带宽限制测试: 模拟低带宽环境

注意事项

  • 在测试环境运行,避免影响生产环境
  • 添加日志记录所有的故障模拟操作
  • 设置自动恢复机制,防止忘记恢复
  • 监控系统指标,评估故障影响

选择适合您场景的方案,如果需要特定场景的模拟(如特定协议、特定端口),请告诉我,我可以提供更针对性的方案。

抱歉,评论功能暂时关闭!