Pages:
Actions
  • #1 par vivien le 14 Jun 2011
  • Tutoriel pour générer des pertes de paquets / latence / gigue sur un équipement avec NetEm.

    Matériel nécessaire : 2 cartes réseau Ethernet.

    Il faut installer Linux Ubuntu (ou Linux Debian), car on va mettre en place un pont afin que les 2 interface Ethernet de ton PC deviennent les 2 ports d'un Switch.

    On va commencer par rajouter les paquets nécessaire. Dans la logithèque Ubuntu, il faut installer les logiciels suivants :
    - bridge-utils (permet faire le switch virtuel)
    - wireshark (pour faire une capture)
    Configuration de Wireshark : Pour faire une capture avec wireshark sans le démarrer en root, copiez / collez ces 4 lignes dans un terminal :
    sudo addgroup -quiet -system wireshark
    sudo chown root:wireshark /usr/bin/dumpcap
    sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap
    sudo usermod -a -G wireshark VOTRE_LOGIN
    (Note : pensez a changer VOTRE_LOGIN par votre login ubuntu)

    Note : Il n'y a rien à installer pour NetEm, il est directement intégré au noyau Linux d'Ubuntu.

    Configuration réseau :
    Dans un terminal, taper la commande sudo nano -w /etc/network/interfaces
    Cela permet d'éditer le fichier de configuration réseau en tant que super-utilisateur.
    Le fichier est vide, car la configuration est laissée a un outil graphique plus simple. Pour faire un pont, on est obligé de passer par cet configuration en fichier texte.


    # The loopback network interface
    auto lo
    iface lo inet loopback

    #-------------- ETH 0
    auto eth0
    iface eth0 inet manual

    #-------------- ETH 1
    auto eth1
    iface eth1 inet manual

    #-------------- BRIDGE 0

    auto br0
    iface br0 inet manual
    # Si vous avez besoin d'internet sur le PC bridge : commentez la précédente ligne et enlevez le commentaire des 5 lignes suivantes :
    #iface br0 inet static
       #address 192.168.1.90
       #netmask 255.255.255.0
       #gateway 192.168.1.254
       #dns-nameservers 192.168.1.254 8.8.8.8
       bridge_ports eth0 eth1
       bridge_stp off
       bridge_fd 0
       bridge_maxwait 0

    J'ai commenté L'IP / masque / passerelle car je n'ai pas besoin d'accès Internet. Pour que le PC ait aussi accés à Internet, il suffit de remplire les données et d'enlever les commentaires.

    Branchements :
    Si on souhaite introduire des pertes de paquets sur un décodeur TV, il faut connecter la box sur un port Ethernet et le décodeur TV sur le second port Ethernet du PC. Redémarrer ensuite le PC. Normalement le décodeur TV devrait fonctionne normalement (par défaut il n'y a ni pertes, ni ping supplèmentaire).

    Commande Netm pour générer les pertes sur les paquets émis par l'interface Eth0 :
    - Premier lancement avec 1% de paquet perdu :  sudo tc qdisc add dev eth0 root netem loss 1%
    - Modification des pertes à 0,3% : sudo tc qdisc change dev eth0 root netem loss 0.3%
    - Arrêt des pertes de paquets : sudo tc qdisc change dev eth0 root netem loss 0%

    Commande Netm pour générer les pertes sur les paquets émis par l'interface Eth1 :
    - Premier lancement avec 1% de paquet perdu :  sudo tc qdisc add dev eth1 root netem loss 1%
    - Modification des pertes à 0,3% : sudo tc qdisc change dev eth1 root netem loss 0.3%
    - Arrêt des pertes de paquets : sudo tc qdisc change dev eth1 root netem loss 0%

    Commande NetEm pour rajouter du délai sur les paquets émis par l'interface Eth0 :
    - Premier lancement avec 100ms de latence : sudo tc qdisc add dev eth0 root netem delay 100ms
    - Modification de la latence à 10ms : sudo tc qdisc change dev eth0 root netem delay 10ms
    - Suppression de la latence supplèmentaire : sudo tc qdisc change dev eth0 root netem delay 0ms

    Pour aller plus loin avec NetEm : http://www.linuxfoundation.org/collaborate/workgroups/networking/netem

    Capture Wireshark :
    Il est possible de faire des captures su l'interface br0 mais aussi eth0 et eth1. Pour voir les pertes de paquets générées sur l'interface Eth0, il est nécessaire de faire la capture sur Eth0, les pertes n'étant pas présentes en entrée sur Eth1 ni sur br0.

    Pour ceux qui se demandent à quoi correspondent le nom des interface sous Linux, voici un récapitulatif :
    - eth0 : première interface Ethernet (ancienne appellation)
    - eth1 : seconde interface Ethernet (ancienne appellation)
    - em1 : première interface Ethernet intégrée (nouvelle appellation)
    - em2 : seconde interface Ethernet intégrée (nouvelle appellation)
    - p1p1 : première interface Ethernet de la 1ère carte Ethernet additionnelle (nouvelle appellation)
    - p1p2 : seconde interface Ethernet de la 1ère carte Ethernet additionnelle (nouvelle appellation)
    - p2p1 : première interface Ethernet de la 2ème carte Ethernet additionnelle (nouvelle appellation)
    - wlan0 : première carte Wi-Fi
    - br0 : le bridge que l'on va rajouter ci-dessous
    - br1 : Second bridge dans le cas où on réalise plusieurs bridge
    - lo : LoopBack qui est une interface virtuelle présent sous linux pour que 127.0.0.1 soit ton PC


    Note : Pour faire un bridge avec une carte WiFi (pour un PC portable), vous avez un tutoriel là : https://wiki.debian.org/fr/BridgeNetworkConnections


    Cet article et les photos qui l'illustrent est publié sous la licence Creative Commons CC BY-SA 4.0, afin de permettre sa diffusion par les autres médias (il faut citer l'auteur, Vivien GUEANT, mettre un lien vers cet article et réutiliser la même licence).
    Tutoriel pour comprendre comment reprendre un contenu CC BY-SA 4.0.
  • #2 par vivien le 14 Jun 2011
  • Autre méthode : Il est également possible de définir des alias pour mettre en place le pont

    Commandes :
    - pogo        : monter le pont
    - postop      : démonter le pont         
    - pert        : perturber le flux - arg          
             1) s (si première perturbation)    
             2) port (sortie du pont)      
             3) % perte            

    Définition des Alias :


    $ alias
    alias dir='dir --color=auto'
    alias helpme='cat /var/local/doc_alias.txt'
    alias l='ls -CF'
    alias la='ls -A'
    alias ll='ls -l'
    alias ls='ls --color=auto'
    alias pert='sudo /var/local/create_perturbation.sh'
    alias pogo='sudo ifconfig eth2 0.0.0.0 up &&
         sudo ifconfig eth0 0.0.0.0 up &&
         sudo brctl addbr br0 &&
         sudo brctl addif br0 eth0 &&
         sudo brctl addif br0 eth2 &&
         sudo ifconfig br0 up'
    alias postop='sudo ifconfig br0 down &&
           sudo brctl delif br0 eth0 &&
           sudo brctl delif br0 eth2 &&
           sudo brctl delbr br0
           #sudo ifconfig -dynamic eth0 &&
           sudo ifconfig eth0 up &&
           #sudo ifconfig -dynamic addr eth0 &&
           sudo ifconfig eth2 up'



    Fichier /var/local/create_perturbation.sh :

    #!/bin/sh

    echo "   ----------------------------------   "
    echo "   | first use arguments : s eth X% |   "
    echo "   | after : eth X%       |   "
    echo "   ----------------------------------   "

    if [$# = 3]
    then
       sudo tc qdisc add dev "$2" root netem loss "$3"%
    else
       sudo tc qdisc change dev "$1" root netem loss "$2"%
    fi


    Configurer un serveur pour qu'il soit à 100ms de + que normalement même aprés un reboot :
    (c'est la configuration pour le serveur http://100ms.lafibre.info/ )

    sudo nano -w /etc/rc.local

    rajouter la ligne
    /sbin/tc qdisc add dev eth0 root netem delay 100ms
    avant la ligne "exit 0"

  • #3 par vivien le 14 Jun 2011
  • Configuration réseau d'un PC possédant 2 cartes PCI avec 4 ports ethernet soit un total de 9 ports Ethernet.

    Eth0 - carte réseau intégré au PC : Pour l’accès  à Internet sur le PC
    Eth1 et Eth5 (premier port de chaque carte PCI) : Premier swith (br0) pour perturber un premier équipement
    Eth2 et Eth6 (second port de chaque carte PCI) : Second swith (br1) pour perturber un premier équipement
    Eth3 et Eth7 : Troisième switch (br2)
    Eth4 et Eth8 : Quatrième switch(br3)


    auto lo
    iface lo inet loopback

    #-------------- ETH 0
    #auto eth0
    #iface eth0 inet dhcp

    auto eth0
    iface eth0 inet static
    address 192.168.1.101
    netmask 255.255.255.0
    gateway 192.168.1.254


    #-------------- BRIDGE 0

    auto eth1
    iface eth1 inet manual

    auto eth5
    iface eth5 inet manual

    auto br0
    iface br0 inet manual
    bridge_ports eth1 eth5
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0


    #-------------- BRIDGE 1

    auto eth2
    iface eth2 inet manual

    auto eth6
    iface eth6 inet manual

    auto br1
    iface br1 inet manual
    bridge_ports eth2 eth6
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0


    #-------------- BRIDGE 2

    auto eth3
    iface eth3 inet manual

    auto eth7
    iface eth7 inet manual

    auto br2
    iface br2 inet manual
    bridge_ports eth3 eth7
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0


    #-------------- BRIDGE 3

    auto eth4
    iface eth4 inet manual

    auto eth8
    iface eth8 inet manual

    auto br3
    iface br3 inet manual
    bridge_ports eth4 eth8
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0
  • #4 par Grincheux le 12 Aug 2011
  • Je vais approfondir NetEm, c'est hard et Linux j'aime pas. Je viens d'installer Ubuntu 11 la semaine dernière, je vais tester.

    Un MTU de 1500 ne me semble pas optimum. Le mien en général est de 1442.
  • #5 par vivien le 12 Aug 2011
  • Sur ton ubuntu lance simplement la commande sudo tc qdisc add dev eth0 root netem delay 100ms dans un terminal et tu vas voir que ta latence à pris 100ms de plus.

    Le tuto avec les 2 cartes Ethernet c'est si tu souhaite rajouter de la latence (ou des pertes de paquets) à un 2ème PC.

    J'ai compris que tu n'aimais pas trop la ligne de commande : ne t’inquiète pas il est possible de s'en passer pour un usage classique de Linux, maintenant cela permet des fonctions avancées (qui généralement n'existent pas avec Windows).
  • #6 par Grincheux le 12 Aug 2011
  • Je ferai des essais ce week-end.
  • #7 par corrector le 14 Aug 2011
  • Je vais approfondir NetEm, c'est hard et Linux j'aime pas.
    En quoi si ce n'est pas indiscret?
  • #8 par Grincheux le 14 Aug 2011
  • Je n'aime pas Linux et mes connaissances en réseau / téléphonie sont très loin des votres.
  • #9 par bdecagny le 06 Sep 2011
  • FYI

    pour ce qui est de la perte de paquet, Netem est effectivement fonctionnel mais peut poser des problèmes si on souhaite avoir un effet un peu plus complexe et maitrisé.
    En effet, l'option de correlation est relativement obscure et peu fonctionnelle (même buggée si on écoute certaines personnes sur le net)
    Une solution possible est une évolution de Netem qu'un petit groupe a développé nommée NetemCLG.
    Cette version est fonctionnelle et permet de générer des bursts de pertes de façon très précise.
    Seul inconvéniant : il faut appliquer les patchs aux sources de tc et iproute2 et recompiler un kernel.
    OK et testé sur kernel 2.6.32.46

    http://netgroup.uniroma2.it/twiki/bin/view.cgi/Main/NetemCLG

    Enjoy !!
  • #10 par vivien le 16 Dec 2013
  • Perdre des paquets sur l'IP $1 pendant une durée $2 :

    Voici un petit script pour supprimer l'intégralité des paquets d'une IP $1 pendant une durée $2
    #!/bin/dash
    /sbin/iptables -A FORWARD -d $1 -j DROP
    /bin/sleep $2
    /sbin/iptables -F


    Voici un petit script pour supprimer l'intégralité des paquets UDP pendant une durée $1
    #!/bin/dash
    /sbin/iptables -A FORWARD -p udp -j DROP
    /bin/sleep $1
    /sbin/iptables -F


    Voici un petit script pour supprimer l'intégralité des paquets pendant une durée $1
    #!/bin/dash
    /sbin/iptables -A FORWARD -j DROP
    /bin/sleep $1
    /sbin/iptables -F
  • #11 par corrector le 16 Dec 2013
  • Attention, ça supprime aussi les autres règles!
  • #12 par vivien le 14 Mar 2017
  • J'ai un petit souci : la commande iptables -A FORWARD -j DROP ne permet plus de droper les paquets qui passent sur mon pont.

    J'ai un PC portable (Ubuntu 16.04.2) avec deux cartes réseaux : enp4s0 et enp9s0
    J'ai mis un pont entre ces deux ports : bridge_ports enp4s0 enp9s0

    Le flux passe bien dans les deux sens, mais impossible de lui appliquer des règles iptables comme iptables -A FORWARD -j DROP qui devrait bloquer le flux.

    # interfaces(5) file used by ifup(8) and ifdown(8)
    auto lo
    iface lo inet loopback

    #-------------- Carte Interne
    auto enp9s0
    iface enp9s0 inet manual

    #-------------- Carte Externe
    auto enp4s0
    iface enp4s0 inet manual

    #-------------- BRIDGE 0
    auto br0
    iface br0 inet static
       address 192.168.1.90
       netmask 255.255.255.0
       gateway 192.168.1.254
       dns-nameservers 192.168.1.254 8.8.8.8
       bridge_ports enp4s0 enp9s0
       bridge_stp off
       bridge_fd 0
       bridge_maxwait 0
Pages:
Actions