Ever had a customer environment where either a deployment is done over WAN links or the customers wants to change there WAN links, and they (or you in planning or testing phase) are interesting to see what happens in advance? Or you just want to know how latency or ping drops in a WAN link influences user experience in VDI or application deployments (well if the users aren’t complaining first ;-)…)?
Introduce some real world networking examples to your lab set-up?
You will have some opportunities in the virtual infrastructure, vSphere for example let’s you throttle a vSwitch/portgroup to a certain peak bandwidth (traffic shaping). But bandwidth is just a part of the deal, what about what is latency doing to your desktop or application experience, what will ping drops do to the communication?
For these sort of testing/benchmarking I often use a Dummynet setup to influence the traffic between infrastructure components. So how does this work? Time to find out in this blog post.
What is Dummynet?
Start at the start you dummy…..Dummynet is a traffic shaper, bandwidth manager and delay emulator and is included in FreeBSD. There are several ways to use this, deploying a VM with a FreeBSD image or with some of the live ISO’s out there (Frenzy for example http://frenzy.org.ua/en/index.shtml ). Dummynet was initially implemented as a testing tool for TCP congestion control by Luigi Rizzo <email@example.com>. See Luigi’s site http://info.iet.unipi.it/~luigi/ip_dummynet/. Dummynet using ipfw to influence traffic flowing through the created network tunnel,
How to use Dummynet in your virtual infrastructure?
Build a Dummynet VM with two networks connected. Connect a client VM and a server VM on one of the networks (client in network X and server in network Y). Let the dummynet route and pipe the network traffic between those VM and shape the network accordantly to your testing needs.
A model to help clarify.
When installing FreeBSD be sure to include src for the ability to include Dummynet firewall in the kernel. You can either use a kernel load or recompile a kernel with the dummynet option included.
I’m putting a client VM on the same network as one of the dummynet interfaces. The second dummynet interface is connected to an other VM network where the server VM is connected. The VM’s are given IP addresses in their respective IP subnets and the dummynet VM is given IP in these as well (on the em0 for the client VM subnet en on the em1 for the server VM subnet). I configure the client and server VM’s to use the Dummynet VM as their IP gateway (just a route add for there subnet pointing to the dummynet interface).
On the dummynet VM you can use the following commands or included them in the rc.conf and /etc/sysctl.conf files.
ifconfig em0 192.168.243.241 netmask 255.255.255.0
ifconfig em1 10.0.1.1 netmask 255.255.255.0
sysctl net.inet.ip.forwarding=1 (Tell FreeBSD to forward packets between the two IP addresses)
Check if your can reach the both VM’s by pinging there IP adresses from the dummynet host.
Yes? Okay move on. Check if you can reach from one to the other VM via the ip forwarding option. The freebsd-server is on the 10.0.1.0 subnet. So first add the route like said before.
This works. Now introduce some dummynet.
Add a firewall rule to allow all traffic from and to the first vm to the second.
ipfw add 1000 allow all from any to any
Add a Dummynet pipe to check if ipfw works:
ipfw add 100 pipe 1 ip from any to any
And put some delay on that:
ipfw pipe 1 config delay 10ms
And check with ping:
You will see the delay multiplied by how many times to traffic passes the pipe. From 2.5 / 3ms in previous shot to 39/38 ms in current shot.
When this works you can add some other test for example:
Add a rule to delay selected packets by 50 ms, randomly drop 30% (0 is for no loss and 1 is for 100% packet loss) of the packets and limit the bandwidth to 1Mbps (bandwidth can be checked by a copy or such.)
ipfw pipe 1 config delay 50ms plr .03 bw 1024Kbits/s
Sequence 3 is dropped from the packets.
To see what is configured on the pipe use:
ipfw pipe 1 show and destroy with ipfw pipe 1 delete.
This concludes this blog post.
– Happy Dummynet network testing!