IPToGeo
Voici la première version d'IPToGeo. Il s'agit d'un double service (serveur et ligne de commande), qui permet de récupérer l'assignation géographique (code pays ISO) d'une adresse IP. Je parle ici d'assignation, car, même si dans 90% des cas, la localisation du fournisseur est la même que celle de l'utilisateur, il reste 10% où ce n'est pas vrai. Par exemple, un fournisseur de service VPN peut avoir des utilisateurs dans le monde entier, donc les utilisateurs finaux ne seront pas ceux de l'adresse remontée dans le journal. Pour avoir une géolocalisation précise, il faudra se tourner vers d'autres services qui ont des bases de données beaucoup plus fines.
Pour se faire, IPToGeo va récupérer les données des 5 RIR (Regional Internet Registries) : AfriNIC, APNIC, ARIN, LACNIC et RIPE NCC et les compiler en données statiques pour fournir une base de données sous forme d'un arbre non équilibré (pour le langage C). Le but est d'utiliser le moins de ressources possible et d'avoir une très forte réactivité.
La partie serveur est écrite en C, les données sont générées à partir d'un script Python. Les tests sont eux aussi en Python (une classe haut niveau est fournie). Afin d'améliorer encore la sécurité, il y a un support (optionnel) de seccomp. Les adresses IPv4 et IPv6 sont supportées.
Pourquoi iptogeo alors qu'il existe déjà des bases de données gratuites (notamment celle de Maxmind) ? Tout d'abord pour des raisons de confidentialités. Faire une requête sur une IP pour obtenir une position géographique est une source d'information pour celui qui écoute le trafic réseau. Ensuite, parce que c'est simple : la compilation des données et la recherche a demandé peu de travail (de plus, les données sont fournies gratuitement et mises à jour quotidiennement). Ce projet m'a permis de poser les bases d'un serveur optimisé, sécurisé (via seccomp) et qui écoute aussi bien en IPv4 qu'en IPv6. Finalement, parce que la recherche telle qu'implémenté nativement dans AWStats, et qui se base sur l'extension du DNS inversé est mauvaise (impossible de déterminer la position d'un .com grâce à son extension). En effet, le but de la classe Python est du test, mais aussi et surtout pour être intégrée à iwla.
Comme d'habitude, les sources sont disponibles sous licence GPLv3 dans ma forge inDefero.
IPv6
Petit aparté sur IPv6. Naïvement, je pensais qu'IPv6, c'était comme IPv4 avec des adresses plus longues, du coup il était idiot de ne pas migrer, surtout que l'on prédit sans cesse l'épuisement des adresses IPv4 au niveau mondial. Au lieu de réaliser cette migration, les opérateurs réseaux utilisent des techniques plus ou moins louches pour pallier à ce problème (NAT, double NAT, adresses privées...).
Pour rappel, IPv4 est un système d'adressage qui date de janvier 1980, on est donc au début de l'informatique moderne. À ses 18/19 ans, la norme IPv6 a été finalisée par l'IETF. Norme qui a aujourd'hui elle-même 18 ans. 1998, c'est le tout tout début du haut débit en France, le bas débit ayant déjà bien vécu et une solide expérience dans un réseau mondial appelé Internet ayant été acquise par l'IETF.
La norme IPv6 a donc été définie, non pas seulement pour augmenter la taille des adresses IP, mais aussi pour corriger tout un tas de défauts d'IPv4. Les deux normes doivent cohabiter : d'un côté, une norme archaïquerudimentaire, et de l'autre une super norme qui se révèle pourtant beaucoup plus complexe.
C'est cette question de complexité qui fait toute la différence. Tout le monde est capable de comprendre rapidement les mécanismes IPv4 (en plus de pouvoir retenir plus ou moins facilement une adresse de tête). L'administration y est simple, même si la puissance de calcul des routeurs doit être plus importante. C'est ce qui fait sa force (en plus d'être déjà en place depuis des années) là où IPv6 amène plein de nouveaux concepts nécessitant d'adapter tous les étages du réseau (matériel, administration, logiciel...) : auto-configuration, adresse privée + adresse publique, renouvellement d'adresse...
D'un point de vue technique, IPv6 est pourtant implémenté dans les équipements depuis des années. Linux facilite lui aussi la migration en faisant une correspondance automatique IPv6 -> IPv4 pour les serveurs qui n'écoutent qu'en v4. Néanmoins, basculer le réseau mondial en IPv6, c'est potentiellement priver les utilisateurs de réseau à cause d'une mauvaise configuration (qui va assurer le support ?). Risque trop important dans un monde qui se veut "tout connecté". La transition se fait donc extrêmement lentement (tout le monde freine le plus possible) via des services comme des tunnels (6rd) ou encore l'implémentation de double pile au niveau des boxs. Paradoxalement, ces solutions de migrations sont finalement plus complexes à mettre en œuvre que l'IPv6 natif !