跳到主要内容
版本:Next

模拟网络故障

本文主要介绍如何使用 Chaosd 模拟网络故障场景。该功能通过使用 iptables、ipsets、tc 等工具修改网络路由、流量控制来模拟网络故障。

备注

请确保 Linux 内核中有 NET_SCH_NETEM 模块。对于 CentOS,可以通过 kernel-modules-extra 包安装该模块,大部分其他发行版默认已安装相应模块。

在创建网络故障实验前,可以运行以下命令查看 Chaosd 支持的网络故障类型:

chaosd attack network --help

目前 Chaosd 支持模拟以下实验场景:网络包错误(corrupt)、网络延迟(delay)、网络包重复(duplicate)、网络包丢失(loss)、网络分区(partition)、DNS 故障(dns)、网络带宽限制(bandwidth)以及端口占用(port)。

要使用服务模式创建实验,你需要以服务模式运行 Chaosd,然后向 Chaosd 服务的路径 /api/attack/network 发送 POST HTTP 请求:

chaosd server --port 31767
curl -X POST 172.16.112.130:31767/api/attack/network -H "Content-Type:application/json" -d '{fault-configuration}'

在上述命令中,你需要按照故障类型在 fault-configuration 中进行配置。有关对应的配置参数和示例,请参考下文中各个类型故障的相关参数说明。

备注

在运行实验时,请注意保存实验的 UID 信息。当要结束 UID 对应的实验时,需要向 Chaosd 服务的路径 /api/attack/{uid} 发送 DELETE HTTP 请求。

模拟网络包错误场景​

模拟网络包错误相关参数说明​

相关配置说明如下所示:

配置项配置缩写服务模式字段说明类型值
action—action实验的行为string 类型设置为 "corrupt"
correlationccorrelation表示包错误发生的概率与前一次是否发生的相关性string 类型取值范围为 0 到 100,表示百分比(10 表示 10%),默认值为 0
deviceddevice影响的网卡设备名称string 类型例如 "eth0",必须要设置
egress-porteegress-port仅影响到指定目的端口的出口流量,仅当 protocol 为 tcp 或 udp 时配置string 类型使用 "," 分隔指定的端口或者端口范围,如 "80,8001:8010"
hostnameHhostname只影响到指定的主机名string 类型如 "chaos-mesh.org"
ipiip-address只影响到指定的 IP 地址string 类型如 "123.123.123.123"
protocolpip-protocol只影响指定的 IP 协议string 类型支持协议类型包括:tcp、udp、icmp、all(表示影响所有网络协议)
source-portssource-port仅影响到来自指定源端口的出口流量,仅当 protocol 为 tcp 或 udp 时配置string 类型使用 "," 分隔指定的端口或者端口范围,如 "80,8001:8010"
percent—percent网络包错误的比例string 类型取值范围为 0 到 100,表示百分比(10 表示 10%),默认值为 1

使用命令行模式模拟网络包错误场景​

通过运行网络包错误命令,可以查看模拟网络包错误场景支持的配置。

具体命令如下所示:

chaosd attack network corrupt --help

运行以下命令,模拟网络包错误:

chaosd attack network corrupt -d eth0 -i 172.16.4.4 --percent 50

运行成功时,会输出以下结果:

Attack network successfully, uid: 4eab1e62-8d60-45cb-ac85-3c17b8ac4825

使用服务模式模拟网络包错误场景​

curl -X POST 172.16.112.130:31767/api/attack/network -H "Content-Type:application/json" -d '{"action":"corrupt","device":"eth0","ip-address":"172.16.4.4","percent":"50"}'

模拟网络延迟场景​

模拟网络延迟相关参数说明​

相关配置说明如下所示:

配置项配置缩写服务模式字段说明类型值
action—action实验的行为string 类型设置为 "delay"
correlationccorrelation表示延迟时间的时间长度与前一次延迟时长的相关性string 类型取值范围为 0 到 100,表示百分比(10 表示 10%),默认值为 0
deviceddevice影响的网卡设备名称string 类型例如 "eth0",必须要设置
egress-porteegress-port仅影响到指定目的端口的出口流量,仅当 protocol 为 tcp 或 udp 时配置string 类型使用 "," 分隔指定的端口或者端口范围,如 "80,8001:8010"
hostnameHhostname只影响到指定的主机名string 类型如 "chaos-mesh.org"
ipiip-address只影响到指定的 IP 地址string 类型如 "123.123.123.123"
jitterjjitter延迟时间的变化范围string 类型可使用的时间单位包括:ns、us (µs)、ms、s、m、h,如 "1ms"
latencyllatency表示延迟的时间长度string 类型可使用的时间单位包括:ns、us (µs)、ms、s、m、h,如 "1ms"
protocolpip-protocol只影响指定的 IP 协议string 类型支持协议类型包括:tcp、udp、icmp、all(表示影响所有网络协议)
source-portssource-port仅影响到来自指定源端口的出口流量,仅当 protocol 为 tcp 或 udp 时配置string 类型使用 "," 分隔指定的端口或者端口范围,如 "80,8001:8010"

使用命令行模式模拟网络延迟场景​

通过运行网络包延迟命令,查看模拟网络延迟场景支持的配置。

具体命令如下所示:

chaosd attack network delay --help

运行以下命令,模拟网络包延迟:

chaosd attack network delay -d eth0 -i 172.16.4.4 -l 10ms

运行成功时,会输出以下结果:

Attack network successfully, uid: 4b23a0b5-e193-4b27-90a7-3e04235f32ab

使用服务模式模拟网络延迟场景​

curl -X POST 172.16.112.130:31767/api/attack/network -H "Content-Type:application/json" -d '{"action":"delay","device":"eth0","ip-address":"172.16.4.4","latency":"10ms"}'

模拟网络包重复场景​

模拟网络包重复相关参数说明​

相关配置说明如下所示:

配置项配置缩写服务模式字段说明类型值
action—action实验的行为string 类型设置为 "duplicate"
correlationccorrelation表示包重复发生的概率与前一次是否发生的相关性string 类型取值范围为 0 到 100,表示百分比(10 表示 10%),默认值为 0
deviceddevice影响的网卡设备名称string 类型例如 "eth0",必须要设置
egress-porteegress-port仅影响到指定目的端口的出口流量,仅当 protocol 为 tcp 或 udp 时配置string 类型使用 "," 分隔指定的端口或者端口范围,如 "80,8001:8010"
hostnameHhostname只影响到指定的主机名string 类型如 "chaos-mesh.org"
ipiip-address只影响到指定的 IP 地址string 类型如 "123.123.123.123"
percent—percent网络包重复的比例string 类型取值范围为 0 到 100,表示百分比(10 表示 10%),默认值为 1
protocolpip-protocol只影响指定的 IP 协议string 类型支持协议类型包括:tcp、udp、icmp、all(表示影响所有网络协议)
source-portssource-port仅影响到来自指定源端口的出口流量,仅当 protocol 为 tcp 或 udp 时配置string 类型使用 "," 分隔指定的端口或者端口范围,如 "80,8001:8010"

使用命令行模式模拟网络包重复场景​

可以运行网络包重复命令,查看模拟网络包重复场景支持的配置。

具体命令如下所示:

chaosd attack network duplicate --help

运行以下命令,模拟网络包重复:

chaosd attack network duplicate -d eth0 -i 172.16.4.4 --percent 50

运行成功时,会输出以下结果:

Attack network successfully, uid: 7bcb74ee-9101-4ae4-82f0-e44c8a7f113c

使用服务模式模拟网络包重复场景​

curl -X POST 172.16.112.130:31767/api/attack/network -H "Content-Type:application/json" -d '{"action":"duplicate","ip-address":"172.16.4.4","device":"eth0","percent":"50"}'

模拟网络包丢失场景​

模拟网络包丢失相关参数说明​

相关配置说明如下所示:

配置项配置缩写服务模式字段说明类型值
action—action实验的行为string 类型设置为 "loss"
correlationccorrelation表示丢包发生的概率与前一次是否发生的相关性string 类型取值范围为 0 到 100,表示百分比(10 表示 10%),默认值为 0
deviceddevice影响的网卡设备名称string 类型例如 "eth0",必须要设置
egress-porteegress-port仅影响到指定目的端口的出口流量,仅当 protocol 为 tcp 或 udp 时配置string 类型使用 "," 分隔指定的端口或者端口范围,如 "80,8001:8010"
hostnameHhostname只影响到指定的主机名string 类型如 "chaos-mesh.org"
ipiip-address只影响到指定的 IP 地址string 类型如 "123.123.123.123"
percent—percent网络丢包的比例string 类型取值范围为 0 到 100,表示百分比(10 表示 10%),默认值为 1
protocolpip-protocol只影响指定的 IP 协议string 类型支持协议类型包括:tcp、udp、icmp、all(表示影响所有网络协议)
source-portssource-port仅影响到来自指定源端口的出口流量,仅当 protocol 为 tcp 或 udp 时配置string 类型使用 "," 分隔指定的端口或者端口范围,如 "80,8001:8010"

使用命令行模式模拟网络包丢失场景​

可以运行网络包丢失命令,查看模拟网络包丢失场景支持的配置。

具体命令如下所示:

chaosd attack network loss --help

运行以下命令,模拟网络包丢失:

chaosd attack network loss -d eth0 -i 172.16.4.4 --percent 50

运行成功时,会输出以下结果:

Attack network successfully, uid: 1e818adf-3942-4de4-949b-c8499f120265

使用服务模式模拟网络包丢失场景​

curl -X POST 172.16.112.130:31767/api/attack/network -H "Content-Type:application/json" -d '{"action":"loss","ip-address":"172.16.4.4","device":"eth0","percent":"50"}'

模拟网络分区场景​

模拟网络分区相关参数说明​

相关配置说明如下所示:

配置项配置缩写服务模式字段说明类型值
action—action实验的行为string 类型设置为 "partition"
accept-tcp-flags—accept-tcp-flags表示接收包含指定标志的 tcp 数据包,其他的则丢弃。具体配置规则参考 iptables 的 tcp-flags。仅当 protocol 为 tcp 时可以配置string 类型例如:"SYN,ACK SYN,ACK"
deviceddevice影响的网卡设备名称string 类型例如 "eth0",必须要设置
direction—direction指定分区的方向,可选值为 "to"、"from" 或 "both"。"from" 表示来自 "ip" 或 "hostname" 指定地址并发往你的服务器的数据包;"to" 表示从你的服务器发出并发往 "ip" 或 "hostname" 指定地址的数据包string 类型可选值为 "to"、"from" 或 "both",默认值为 "both"
hostnameHhostname只影响到指定的主机名string 类型如 "chaos-mesh.org"
ipiip-address只影响到指定的 IP 地址string 类型如 "123.123.123.123"
protocolpip-protocol只影响指定的 IP 协议string 类型支持协议类型包括:tcp、udp、icmp、all(表示影响所有网络协议)

使用命令行模式模拟网络分区场景​

可以运行网络分区命令,查看模拟网络分区场景支持的配置。

具体命令如下所示:

chaosd attack network partition --help

运行以下命令,模拟网络分区:

chaosd attack network partition -i 172.16.4.4 -d eth0 --direction from

使用服务模式模拟网络分区场景​

curl -X POST 172.16.112.130:31767/api/attack/network -H "Content-Type:application/json" -d '{"action":"partition","ip-address":"172.16.4.4","device":"eth0","direction":"from"}'

模拟 DNS 故障场景​

模拟 DNS 故障相关参数说明​

相关配置说明如下所示:

配置项配置缩写服务模式字段说明类型值
action—action实验的行为string 类型设置为 "dns"
dns-domain-nameddns-domain-name表示影响的域名string 类型例如:"chaos-mesh.org"
dns-ipidns-ip表示将影响的域名映射到该地址string 类型例如 "123.123.123.123"
dns-server—dns-server指定 DNS 服务地址string 类型默认值为 "123.123.123.123"

使用命令行模式模拟 DNS 故障场景​

可以运行 DNS 故障命令,查看模拟 DNS 故障场景支持的配置。

具体命令如下所示:

chaosd attack network dns --help

通过映射指定的主机名和 IP 地址从而模拟 DNS 故障,运行命令如下所示:

chaosd attack network dns --dns-ip 123.123.123.123 --dns-domain-name chaos-mesh.org

配置错误的 DNS 服务地址从而模拟 DNS 故障,运行命令如下所示:

chaosd attack network dns --dns-server 123.123.123.123

使用服务模式模拟 DNS 故障场景​

curl -X POST 172.16.112.130:31767/api/attack/network -H "Content-Type:application/json" -d '{"action":"dns","dns-domain-name":"chaos-mesh.org","dns-ip":"123.123.123.123"}'

模拟网络带宽限制场景​

模拟网络带宽限制相关参数说明​

相关配置说明如下所示:

配置项配置缩写服务模式字段说明类型值
action—action实验的行为string 类型设置为 "bandwidth"
bufferbbuffer能够瞬间发送的最大字节数uint32 类型如:10000。必须要设置
deviceddevice影响的网卡设备名称string 类型如 "eth0",必须要设置
hostnameHhostname只影响到指定的主机名string 类型如 "chaos-mesh.org"。hostname 与 ip 不能同时为空。同时设置 hostname 与 ip 时,配置项对指定的主机名和 IP 地址均产生影响
ipiip-address仅影响到指定的 IP 地址string 类型如 "123.123.123.123"。hostname 与 ip 不能同时为空。同时设置 hostname 与 ip 时,配置项对指定的主机名和 IP 地址均产生影响
limitllimit在队列中等待的字节数uint32 类型如:10000。必须要设置
minburstmminburstpeakrate bucket 的大小uint32 类型如:10000
peakrate—peakratebucket 的最大消耗率uint64 类型如:10000
raterrate带宽限制的速率string 类型如 "1mbps"。必须要设置

使用命令行模式模拟网络带宽限制场景​

可以运行限制网络带宽命令,查看该场景支持的配置。

具体命令如下所示:

chaosd attack network bandwidth --help

运行以下命令,模拟限制网络带宽:

chaosd attack network bandwidth --buffer 10000 --device eth0 --limit 10000 --rate 10mbps

使用服务模式模拟网络带宽限制场景​

curl -X POST 172.16.112.130:31767/api/attack/network -H "Content-Type:application/json" -d '{"action":"bandwidth","buffer":10000,"limit":10000,"rate":"10mbps","device":"eth0"}'

模拟端口占用场景​

模拟端口占用相关参数说明​

相关配置说明如下所示:

配置项配置缩写服务模式字段说明类型值
action—action实验的行为string 类型设置为 "occupied"
portpport占用的端口号int 类型例如:8080。必须要设置

使用命令行模式模拟端口占用场景​

可以运行占用端口命令,查看该场景支持的配置。

具体命令如下所示:

chaosd attack network port --help

运行以下命令,模拟端口占用:

chaosd attack network port --port 8080

使用服务模式模拟端口占用场景​

curl -X POST 172.16.112.130:31767/api/attack/network -H "Content-Type:application/json" -d '{"action":"occupied","port":8080}'