Have you ever found yourself needing to simulate network latency or packet loss? I recently wanted to test a replication scenario but needed to have at least 15ms or so of latency between the source and destination.
Years ago I used a WANem virtual appliance as a router to do something similar. This project can be found online (https://wanem.sourceforge.net), however it appears that development has stopped, with the latest releases being nearly 10 years old. WANem provides a PHP web interface allowing the user to configure latency and packet loss, among other things. When you apply settings, the web interface issues commands to Linux Traffic Control (tc
) Network Emulator (netem
) to enforce those settings.
Instead of using the WANem appliance, which ships as a very old and unpatched Knoppix Linux distribution, I decided to take the command it ran and try it on an Ubuntu template available in my lab.
I created an Ubuntu VM with 2 network interfaces. One interface connected to my routable lab network using a static IP (ens192: 192.168.40.11
) and the other connected to non-routable VLAN 19 that was available and was assigned another static IP (ens224: 192.168.19.1
) — which would become the default gateway for this new network.
I then added the following two lines to the /etc/rc.local
file on this system:
echo "1" > /proc/sys/net/ipv4/ip_forward
tc qdisc add dev ens192 root handle 1: netem delay 19ms loss 2%
The first line makes the system act as a router, the second adds 19ms of latency and 2% packet loss to traffic which passes the network interface. More configuration options for this second command can be found here: https://man7.org/linux/man-pages/man8/tc-netem.8.html, including how to send corrupt/duplicate/reordered packets — really make your WAN experience terrible. Since it is in /etc/rc.local
these commands will run automatically when the system starts.
I also wanted this system to act as a DHCP server for the clients at the remote site. I did this by installing a DHCP server (apt install isc-dhcp-server
), making environment specific changes to /etc/dhcp/dhcpd.conf
such as DNS servers and lease-time, and also adding my new subnet with:
subnet 192.168.19.0 netmask 255.255.255.0 {
range 192.168.19.50 192.168.19.99;
option subnet-mask 255.255.255.0;
option routers 192.168.19.1;
}
To activate these DHCP changes, I ran /etc/init.d/isc-dhcp-server restart
.
Finally I added a static route to the primary router in my lab, such that any requests for 192.168.19.0/24
go to the gateway at 192.168.40.11
. Now any request in or out of my WAN site has latency injected at some occasional lost packets:

I’m now able to deploy virtual machines at a “remote location” about 19-20ms away, but actually run on the same vSphere cluster.