请谨慎使用,不要在生产环境中使用该工具!!!
该工具是我在全新的虚拟机上自动的网络模拟工具,用于模拟不同网络环境下的网络延迟、带宽、丢包率等情况。该工具基于 tc
和 iptables
实现,可以在 Linux 系统上使用。
该工具未经过充分测试,无法确定所有功能均有效。
该工具可能会清除现有的网络配置,因此请谨慎使用。
运行以下命令为脚本赋予可执行权限:
sudo chmod +x configure.sh check.sh delete.sh
使用 configure.sh
脚本配置网络规则。例如:
bash configure.sh -i ens33 -s 192.168.18.202 -d 192.168.18.204 -U 1000ms -D 1000ms -B 128kbit -b 512kbit -J 100ms -L 50%
-i
:指定网卡名称(必填)。如ens33
,表示配置应用于此网卡。-s
:指定源地址(必填)。如192.168.18.202
,表示流量从此地址发出。-d
:指定目标地址(必填)。如192.168.18.204
,表示流量发往此地址。-U
:设置上行延迟(可选)。如500ms
,表示上行流量的延迟为 500ms。-D
:设置下行延迟(可选)。如600ms
,表示下行流量的延迟为 600ms。-B
:设置上行带宽(可选)。如128kbit
,表示上行带宽限制为 128 kbit。-b
:设置下行带宽(可选)。如512kbit
,表示下行带宽限制为 512 kbit。-J
:设置延迟抖动(可选)。如50ms
,表示延迟的抖动范围为 ±50ms。-L
:设置丢包率(可选)。如5%
,表示 5% 的流量会被丢弃。
bash configure.sh -i ens33 -s 192.168.18.202 -d 192.168.18.204 -U 1000ms -D 1000ms -B 128kbit -b 512kbit -J 100ms -L 50%
上面命令的含义是:
-
上行规则(从本地主机到目标服务器
192.168.18.204
):- 延迟:1000ms
- 抖动:±100ms
- 带宽限制:128kbit
- 丢包率:50%
-
下行规则(从目标服务器
192.168.18.204
到本地主机192.168.18.202
):- 延迟:1000ms
- 抖动:±100ms
- 带宽限制:512kbit
- 丢包率:50%
使用 check.sh
脚本查看当前网络配置:
bash check.sh -i ens33
-i
:指定网卡名称(必填)。如ens33
,表示检查该网卡上的配置。
执行后会显示:
- 上行规则:当前网卡(如
ens33
)的tc qdisc
和tc class
配置。 - 下行规则:虚拟接口
ifb0
上的tc qdisc
和tc class
配置。 - iptables 规则:
mangle
表 8566 中的流量标记规则。
使用 delete.sh
脚本清理所有网络限制:
bash delete.sh -i ens33
-i
:指定网卡名称(必填)。如ens33
,表示清理此网卡上的所有网络限制。
- 清除网卡
ens33
上的上行规则。 - 清除虚拟接口
ifb0
上的下行规则。 - 删除
iptables
中的流量标记规则。 - 关闭虚拟接口
ifb0
。
bash configure.sh -i ens33 -s 192.168.18.202 -d 192.168.18.204 -U 1000ms -D 1000ms -B 128kbit -b 512kbit -J 100ms -L 50%
bash check.sh -i ens33
bash delete.sh -i ens33
- 目前上行和下行的带宽、延迟、丢包率等参数是一致的,可以考虑分别配置,以更加贴近真实网络环境
- 无法模拟动态变化的网络环境(如突发拥塞、瞬时抖动等),将来可以考虑使用 tc 的高级功能模拟“带宽突发”和“网络抖动”模式等
- [ ]
如果需要更复杂的动态网络条件,可以考虑搭配专用的网络测试工具,如 Chaos Mesh 或 WANem。
-
使用 iperf3:
server 端:
iperf3 -s
client 端:
udp:
# 上行带宽 iperf3 -c 192.168.18.230 -u -b 1M # 下行带宽(也可以测试上行带宽时从 server 端看到) iperf3 -c 192.168.18.230 -u -R -b 1M
tcp:
iperf3 -c 192.168.18.230 iperf3 -c 192.168.18.230 -R
注意:
iperf3 客户端输出可能具有误导性,由于 iperf3 客户端统计的数据包括了尝试发送的流量(而非实际发送的流量),client 端可能会显示超过带宽限制的速率。这是 iperf3 的正常行为。可以重点关注 iperf3 server 的接收统计数据,因为它反映了实际带宽限制的效果。
-
使用 nc:
server 端:
nc -l -p 12345 > /dev/null
client 端:
dd if=/dev/zero bs=1M count=2 | nc 192.168.18.230 12345
-
使用 iptables 命令观察配置是否正确:
sudo iptables -t mangle -L -v -n