Lets think that you have a LAN with a DHCP server and a number of clients (i.e. a computer lab). For whatever reasons you want to test your LAN bandwidth between your server and clients simultaneously. This can be done with iperf which is a standard tool in a typical Linux distribution. In this example we’re using Debian/Ubuntu.
Preparation in the Client Side
Install iperf:
# apt-get install iperf
At this point you might want to decide a port number for iperf clients (which really are servers but running in the clients). In this example we use 6001. To make sure only your DHCP host may execute the tests you may want to allow traffic to port 6001 (both UDP and TCP) only from your host.
Add following line to your /etc/rc.local just above “exit 0”:
start-stop-daemon --start -x /usr/bin/iperf -n iperf -b -- -s --udp -p 6001
This starts the iperf on boot in your client. It sits waiting the server to connect.
Running the Test from the Server Side
In my server I use dnsmasq as a DHCP server. It reports all DHCP activity in /var/log/syslog. In order to get all IP addresses given to the clients after the last logrotate enter following command:
#!/bin/sh IP_ALL=`grep DHCPACK /var/log/syslog | grep -o -P "\d+\.\d+\.\d+\.\d+"` # Go through IP_ALL and ping all IPs. Collect online IPs to IP_UP. for this_ip in $IP_ALL do # Check with PING echo -n "pinging: $this_ip " this_count=0 this_count=$(ping -c 1 $this_ip | grep 'received' | awk -F',' '{ print $2}' | awk '{ print $1}') if [ $this_count -eq 1 ]; then # this_ip is up IP_UP="$IP_UP $this_ip" echo "up" else echo "down" fi done # Go through IP_UP and run iperf to them for this_ip in $IP_UP do echo -n "starting iperf: $this_ip " iperf -c $this_ip -p 6001 -t 10 --udp -b 100k -d -y csv >/tmp/bwtest.csv 2>&1 & echo "done" done # Wait for iperf processes to end PROC_COUNT=1 until [ $PROC_COUNT -eq 0 ] do sleep 1 PROC_COUNT=`ps | grep -c "iperf"` echo -n "Processes running: $PROC_COUNT\r" done echo ""