Login Logout

Howto iperf

iperf est un outil de diagnostic réseau permettant de mesurer le débit sur des réseaux IP.

Principe

iperf doit être installé sur les deux machines entre lesquelles le débit est mesuré : il sera lancé en mode serveur sur l’une, et en mode client sur l’autre.

Si l’on utilise le protocole TCP, le débit sera aussi élevé que la liaison de bout en bout le permet ; avec le protocole UDP, le client devra choisir quel débit émettre ou recevoir, et un rapport affichera le nombre de paquets perdus.

iperf a été ré-écrit en version 3 (commande iperf3), avec notamment le support d’IPv6. Suivant les cas d’usage, nous utilisons encore iperf en version 2 (commande iperf) notamment dans le cas de tests en mode UDP où iperf3 a pas mal de bugs.

Par défaut iperf3 en mode serveur ouvre la socket réseau TCP/5201, pour iperf c’est TCP/5001.

Installation

Sous Debian :

# apt install iperf iperf3

Sous OpenBSD :

# pkg_add iperf iperf3

Utilisation basique

Lancer en mode serveur :

$ iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------

Sur le client, on lance le test de débit pendant 10 secondes :

$ iperf3 -c 192.0.2.1 -t 10
Connecting to host 192.0.2.1, port 5201
[  4] local 192.0.2.2 port 56832 connected to 192.0.2.1 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  11.9 MBytes  99.8 Mbits/sec    0    129 KBytes       
[  4]   1.00-2.00   sec  11.3 MBytes  94.9 Mbits/sec    0    156 KBytes       
[  4]   2.00-3.00   sec  11.2 MBytes  93.8 Mbits/sec    0    156 KBytes       
[  4]   3.00-4.00   sec  11.1 MBytes  93.3 Mbits/sec    0    156 KBytes       
[  4]   4.00-5.00   sec  11.1 MBytes  92.8 Mbits/sec    0    163 KBytes       
[  4]   5.00-6.00   sec  11.1 MBytes  93.3 Mbits/sec    0    163 KBytes       
[  4]   6.00-7.00   sec  11.2 MBytes  93.8 Mbits/sec    0    163 KBytes       
[  4]   7.00-8.00   sec  11.2 MBytes  93.8 Mbits/sec    0    163 KBytes       
[  4]   8.00-9.00   sec  11.1 MBytes  92.8 Mbits/sec    0    163 KBytes       
[  4]   9.00-10.00  sec  11.2 MBytes  93.8 Mbits/sec    0    163 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   112 MBytes  94.2 Mbits/sec    0             sender
[  4]   0.00-10.00  sec   111 MBytes  93.4 Mbits/sec                  receiver

iperf Done.

Utilisation avancée

Firewall

Afin de pouvoir utiliser iperf, il faut s’assurer que les ports entre le client et le serveur sont bien ouverts. Par défaut il faut donc autoriser les flux TCP entre le port client (1024 et 65535) et le port serveur (5201).

UDP

Par défaut en mode UDP, une bande passante de 1Mb/s sera utilisée. Il faut préciser la bande passante souhaitée pour le test avec l’option -b, par exemple pour 10Mb/s : -b 10M.

iperf (version 2)

Il faut lancer explicitement le serveur en mode UDP :

$ iperf -s -u
------------------------------------------------------------
Server listening on UDP port 5001
Receiving 1470 byte datagrams
UDP buffer size:  208 KByte (default)
------------------------------------------------------------

On peut alors lancer le client en mode UDP :

$ iperf -c 192.0.2.1 -u -b 10M
------------------------------------------------------------
Client connecting to 192.0.2.1, UDP port 5001
Sending 1470 byte datagrams, IPG target: 1176.00 us (kalman adjust)
UDP buffer size:  208 KByte (default)
------------------------------------------------------------
[  3] local 192.0.2.2 port 50090 connected with 192.0.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  11.9 MBytes  10.0 Mbits/sec
[  3] Sent 8505 datagrams
[  3] Server Report:
[  3]  0.0-10.0 sec  11.9 MBytes  10.0 Mbits/sec   0.051 ms    0/ 8505 (0%)

iperf3

Avec iperf3, on ne lance pas le serveur en mode UDP, c’est le client qui va gérer la bascule sur le protocole UDP. Ce comportement s’explique notamment pour des raisons de sécurité, pour éviter de pouvoir envoyer trop facilement un flux UDP vers n’importe quelle IP.

On lance donc le serveur de façon standard :

$ iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------

Et on précise le mode UDP au niveau client :

$ iperf3 -c 192.0.2.1 -u -b 10M
Connecting to host 192.0.2.1, port 5201
[  4] local 192.0.2.2 port 34378 connected to 192.0.2.1 port 5201
[ ID] Interval           Transfer     Bandwidth       Total Datagrams
[  4]   0.00-1.00   sec  1.09 MBytes  9.17 Mbits/sec  140  
[  4]   1.00-2.00   sec  1.19 MBytes  9.96 Mbits/sec  152  
[...]
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-10.00  sec  11.8 MBytes  9.92 Mbits/sec  0.539 ms  0/1512 (0%)  
[  4] Sent 1512 datagrams

iperf Done.

Options

Options générales intéressantes :

  • -p N : utiliser un port spécifique
  • -i N : afficher un rapport intermédiaire toutes les N secondes
  • -J : sortie au format JSON (iperf3 uniquement)

Options intéressantes pour le serveur :

  • -D : lancer en mode daemon
  • -1 : traiter un seul client et quitter (iperf3 uniquement)

Options intéressantes pour le client :

  • -t N : transmission pendant N secondes (au lieu de 10 secondes par défaut)
  • -P N : lancer N clients en parallèle
  • -d : lancer une transmission bidirectionnelle simultanément (iperf v2 uniquement)
  • -r : lancer une transmission bidirectionnelle séparément (iperf v2 uniquement)
  • -R : lancer une transmission dans le sens inverse (le client reçoit, iperf3 uniquement)

Serveurs iperf publics

Maintenir un serveur iperf public est complexe, la plupart des serveurs de la liste https://iperf.fr/iperf-servers.php sont injoignables en général. Voici les serveurs les plus fiables de la liste :

$ iperf3 -c ping.online.net
$ iperf3 -c iperf.eenet.ee