This bash script artificially limits bandwidth, delay and loss rate on selected interfaces. It allows traffic shaping on both downlink and uplink. It can enforce shaping on multiple interfaces at a time.
For information and suggestions please write to: martino.trevisan@polito.it
This is a bash script to be used in a Linux environment.
It depends on the the package tc
. Under the hood it uses the kernel module ifb
.
Warning: if you are using nftables
, traffic shaping on the Docker interfaces might not work due to routing/NAT issues.
To start traffic shaping, you can run:
sudo ./network_emulator.sh <iface>:<downspeed>:<upspeed>:<rtt>:<loss>
where:
<iface>
is the target physical interface you want to alterate<downspeed>
is the downlink capacity. Unit must be present, e.g., 20mbit.<upspeed>
is the uplink capacity. Unit must be present, e.g., 10mbit.<rtt>
is the RTT. Unit must be present, e.g., 50ms. It is enforced on the uplink.<loss>
is the loss probability. Must be followed by %, e.g., 10%. Enforced on both up and down link.
You can write multiple <iface>:<downspeed>:<upspeed>:<rtt>:<loss>
to configure shaping on multiple interfaces. Under the hood it creates multiple virtual ifb
interfaces to shape both down and uplink traffic.
You can omit one or more of <downspeed>
, <upspeed>
, <rtt>
, <loss>
to avoid enforcing shaping for those parameters. E.g., you can write a command for enforcing only RTT with: <iface>:::<rtt>:
, like wlan0:::50ms:
.
To remove all traffic shaping rules, use:
sudo ./network_emulator.sh remove
1. Enforce 20mbit download, 5mbit upload, 20ms RTT and no packet loss on eth0
.
sudo ./network_emulator.sh eth0:20mbit:5mbit:20ms:0%
2. Enforce 100ms RTT on eth0
.
sudo ./network_emulator.sh eth0:::20ms:
Note that you can omit parameters that you don't want to shape.
3. Enforce 1% packet loss on docker0
, docker1
and docker2
(if you are using docker container engine)
sudo ./network_emulator.sh docker0::::1% docker1::::1% docker2::::1%