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 :
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
-
IPv6 proud usage le script en question, sous WTFPL
-
SixorNot une extension Firefox pour savoir si vous surfez en IPv6
- Traffic accounting with Iptables
-
Les règles présentées ici sont volontairement simplifiées et d'aucune utilité en l'état. ↩
-
Une machine Debian/Linux sur un dreamplug, mais cela marche aussi bien (testé) avec OpenWRT. ↩
-
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 ! ↩