IPv6 : Mesurer et afficher son utilisation

TL;DR: https://code.crapouillou.net/jocelyn/ipv6-proud-usage

J'utilise au quotidien la version 6 du protocole IP, IPv6 en parallèle de la version 4, puisque ça me simplifie la vie, c'est important et mon FAI me le permet1.

Mais taraudé je suis :

  • Quelle est ma part de discussion réelle avec les internets utilisant la version 6 du protocole ?
  • Comment évolue-t-elle avec le temps ?

Bref, j'aimerais connaître et suivre la part d'IPv6 dans les communications routées entre les babasses de mon réseau local et le reste des internets.

Implémentation

Je traîne cette idée depuis un moment sans m'y mettre ; ça promettait d'être compliqué, de nécessiter une écoute du trafic ; Erreur :

« Y'a rien à faire, c'est déjà prêt ! »

Le pare-feu netfilter (qui est dans linux) peut tenir un compte des paquets qu'il traite, classé par chaîne et par cible. D'ailleurs, il le fait déjà, sans rien qu'on lui demande. Cerise sur le gâteau, on accède séparément aux compteurs IPv4 et IPv6 respectivement via les commandes iptables et ip6tables.

Démo2 :

root@openwrt-test# ip6tables -L -v -n

Chain INPUT (policy ACCEPT 2068K packets, 2027M bytes)
   pkts bytes target     prot opt in     out     source     destination


Chain FORWARD (policy ACCEPT 3650K packets, 2252M bytes)
   pkts bytes target     prot opt in     out     source     destination
   0     0 ACCEPT     all  --  any    any     anywhere      anywhere
   ctstate RELATED,ESTABLISHED
       0     0 DROP     udp  --  any    any     anywhere      anywhere

Chain OUTPUT (policy ACCEPT 1331K packets, 576M bytes)
   pkts bytes target     prot opt in     out     source     destination

On a donc les compteurs de paquets pour chaque règle et pour la règle par défaut (policy). La commande iptables donnerait la même chose pour l'IPv4.

Pour faire simple (que ça ne vous dispense pas de réviser !), la chaîne INPUT correspond à ce qui rentre sur la machine, la chaîne OUTPUT ce qui en sort, et la chaîne FORWARD ce qui est routé par la machine entre deux machines tierces.

Ici je me place du point de vue de mon routeur3, donc c'est la chaîne FORWARD qui m'intéresse :

ip6tables -L FORWARD -x -n -v

Comme je suis vraiment très sympa, voici dans son écrin monospacé les parties du manuel iptables/ip6tables concernées.

   -L, --list [chain]
          List  all  rules  in  the  selected  chain.   If  no  chain is
          selected, all chains are listed. Like  every  other  ip6tables
          command,  it  applies  to  the  specified table (filter is the
          default).

   -v, --verbose
          Verbose output.  This option makes the list command  show  the
          interface  name, the rule options (if any), and the TOS masks.
          The packet and byte counters are also listed, with the  suffix
          'K',  'M'  or 'G' for 1000, 1,000,000 and 1,000,000,000 multi‐
          pliers respectively (but see the -x flag to change this).  For
          appending,  insertion,  deletion  and replacement, this causes
          detailed information on the rule or rules to  be  printed.  -v
          may be specified multiple times to possibly emit more detailed
          debug statements.

   -n, --numeric
          Numeric output.  IP addresses and port numbers will be printed
          in  numeric  format.  By default, the program will try to dis‐
          play them as host names, network names, or services  (whenever
          applicable).

   -x, --exact
          Expand  numbers.   Display  the  exact value of the packet and
          byte counters, instead of only the rounded number in K's (mul‐
          tiples  of 1000) M's (multiples of 1000K) or G's (multiples of
          1000M).  This option is only relevant for the -L command.

Notez au passage, que pour mesurer, plutôt qu'un trafic routé, un trafic d'une machine terminale (ex: laptop, serveur, téléphone...) directement sur celle-ci, il suffit de regarder les chaînes INPUT et OUTPUT à la place.

Calculer son score IPv6…

À partir de là, ce qui est intéressant est de calculer:

ipv6_ratio = traffic_ipv6/traffic_total

Fastoche !4

EXTRACT_TRAF=\
  grep ACCEPT                           |\ # On ne compte que le traffic autorisé
  sed 's/ *[0-9]\+ \+\([0-9]\+\).*/\1/' |\ # compteurs "policy"
  sed 's/.* \([0-9]\+\) bytes.*/\1/'    |\ # compteurs "rules"
  awk '{s+=$1}END{printf "%u", s}'        # On somme le tout.

IP4_TRAF=iptables  -n -x -v -L FORWARD  | $EXTRACT_TRAF`
IP6_TRAF=`iptables -n -x -v -L FORWARD  | $EXTRACT_TRAF`

IP6_SCORE_PERCENT= $( $IP6_TRAF*100 / ($IP4_TRAF + $IP6_TRAF) )

… Pour ensuite le stocker chaque jour et voir se que ça bouge avec le temps.

… Pour se la péter, évidemment…

« Il est triste comme un log au fond d'un /var »

Ça serait intéressant de le mettre sur une page web, au vu et su de tous, peut-être que ça en intriguerait certains, peut-être l'occasion d'expliquer ce qu'est IPv6 et pourquoi c'est important (j'insiste…).

En résumé, il faudrait un machin qui

  • Relève et agrège les compteurs tous les jours ;
  • Calcule le score ipv6 ;
  • Génère un petit goodie d'HTML à intégrer dans une page web genre :

 

Wahou, mais il existe donc ? Eh oui, c'est moi qui l'ai fait !

Si vous aussi vous voulez frimer, vous pouvez l'installer/le bidouiller chez vous. Ça tourne y compris sur du OpenWRT, les "badges" peuvent-être inclus statiquement ou en javascript, et multilingues. Puisqu'une commande vaut mieux qu'un long discours :

git clone https://code.crapouillou.net/jocelyn/ipv6-proud-usage.git
cd ipv6-proud-usage && less README.md

Happy hacking 😉 !

EDIT : le nom de fichier du script de cron l'empêchait de s'exécuter, j'ai corrigé ça dans le dépôt, ainsi que quelques typos remontées par Simon, merci !

Voir aussi


  1. En vrai non, mais je triche

  2. Les règles présentées ici sont volontairement simplifiées et d'aucune utilité en l'état. 

  3. Une machine Debian/Linux sur un dreamplug, mais cela marche aussi bien (testé) avec OpenWRT. 

  4. Non en vrai ça m'a pris super longtemps, le shell c'est comme un langage de programmation, mais qui ne sait s'occuper ni des chaînes de caractères, ni des nombres, ni des fonctions, ni des tableaux (heuresement, il reste les fichiers et les programmes tiers...). GrogneGrogneGrogne !