[PYTHON] Faire une liste d'allocation / allocation d'adresses IP pour une certaine zone

introduction

Lorsque je fais des services Internet, je veux parfois déterminer la région de l'hôte qui accède à [^ host-user].

Par exemple, au Japon, il peut être déterminé que "lorsque l'adresse IP est inversée, c'était * .hkd.mesh.ad.jp, donc cela ressemble à un accès depuis Hokkaido" [^ maxmind], mais cette fois, les détails ne sont pas si détaillés. Non. Bien que ce soit une expression de région, nous y pensons avec la granulométrie [^ region] du pays.

[^ maxmind]: Cette direction sera autour de MaxMind.

[^ host-user]: Je pense que ce que je veux vraiment, c'est la zone de résidence de l'utilisateur qui accède, mais on suppose que je ne connais que l'adresse IP de l'hôte qui accède. En fait, l'adresse IP de la source d'accès ne vous indique que la zone où se trouve l'organisation distribuée, et l'emplacement réel de l'hôte ou de l'utilisateur est une autre histoire (il y a VPN).

Association d'adresse IP et de région

Adresse IP de l'IANA chaque [RIR](https://ja.wikipedia.org/wiki/%E5%9C%B0%E5%9F%9F%E3%82%A4%E3%83%B3%E3%82 % BF% E3% 83% BC% E3% 83% 8D% E3% 83% 83% E3% 83% 88% E3% 83% AC% E3% 82% B8% E3% 82% B9% E3% 83% 88 Il est alloué à% E3% 83% AA), et le RIR qui le reçoit alloue et alloue à chaque région.

Par conséquent, si vous traitez la liste «Enregistré dans quelle région» fournie par chaque RIR, vous pouvez créer une liste d'adresses IP distribuées pour chaque région.

[^ region]: En parlant d'un pays, c'est comme: "Il y a une allocation à Guam en dehors des États-Unis."

Allocation et allocation

Comme je l'ai écrit dans le titre de l'article, "Assignment / Allocation", il existe deux expressions pour la distribution. En outre, il existe deux types de «attribué» et «attribué» dans la liste émise par RIR.

Ceci est décrit dans le document Qu'est-ce que l'allocation et l'affectation publié par JPNIC. Cependant, il existe une différence selon que le destinataire de la zone d'adresses distribuée l'utilise ou non.

--allouer --Distribuer à l'organisation de gestion (distribuer aux membres affiliés) --attribuer --Distribution aux utilisateurs finaux (distribuer la zone d'adresse distribuée à l'endroit où elle est réellement utilisée)

Dans cet article, lorsque nous utilisons ces deux sans distinction, nous écrivons «distribution».

Prédécesseurs

Comme ce besoin existe depuis longtemps, il existe déjà des listes sur Internet qui ont été créées sur la base des idées ci-dessus.

Je veux le faire moi-même

Ce ne serait pas amusant si cela se terminait par une liste, alors j'ai décidé de le faire moi-même. Puisqu'il existe des données qui peuvent être considérées comme la bonne réponse sur le net, il semble que l'exactitude puisse être évaluée en comparant le résultat généré avec lui.

Problèmes pour faire une liste

Le format de liste du RIR est public par APNIC etc. .. Vous pouvez le lire et le créer, mais il y a quelques problèmes.

Pas de notation CIDR pour IPv4

IPv4 a la notation [^ ipv4-value] de "adresse de début + numéro". Lors de la détermination de la zone à partir de l'adresse IP dans le programme, il est plus pratique de la convertir en CIDR car elle est souvent prise en compte par CIDR. De plus, il existe un bloc [^ non-cidr] qui ne peut pas être représenté par une notation CIDR dans un enregistrement [^ historic-noncidr].

Dans le cas d'IPv6, ce problème ne se produit pas car il s'agit de la notation CIDR [^ ipv6-value].

[^ ipv4-value]: Le texte original dit "Dans le cas d'une adresse IPv4, le nombre d'hôtes pour cette plage. Ce nombre ne doit pas nécessairement représenter une plage CIDR." Dans la section valeur. Il dit que ce n'est pas CIDR.

[^ ipv6-value]: Le texte original dit "Dans le cas d'une adresse IPv6, la valeur sera la longueur du préfixe CIDR à partir de la valeur" première adresse "de ."

[^ historic-noncidr]: C'est un format qui existait avant l'apparition du concept de CIDR.

Même avec CIDR, il y a des moments où les blocs sont subdivisés

Ceci n'est pas mentionné dans la documentation RIR. Il y a une description à cet effet dans l'article précédent, et même si vous l'implémentez vous-même, la liste diminuera certainement [^ historic-noncidr].

Il n'y a rien de particulièrement bon à rendre la liste redondante, il est donc préférable de la raccourcir.

Concernant la liaison de CIDR, Quel type de traitement fait CIDR + CIDR? est recommandé.

Essayez de le faire avec Python

Le CIDR est généré et combiné, mais il existe une bibliothèque netaddr pour des opérations telles que la combinaison CIDR en Python.

Génération d'enregistrements CIDR

[^ cidr-array]: Ceci est dû au fait que, comme mentionné ci-dessus, la plage d'adresses IP ne peut pas toujours être représentée par un seul CIDR.

from netaddr import IPRange,IPAddress

# `start`Quand`value`Les informations d'enregistrement RIR sont-elles
start_ip = IPAddress(start, version = 4)
end_ip = IPAddress(int(start_ip) + value - 1) # `value`Est le nombre-1
cidr_list = IPRange(start, end_ip).cidrs()

Rejoindre les blocs CIDR

from netaddr import IPSet

v4set = IPSet(v4_cider_list)
for cidr in v4set.iter_cidrs():
    print(cidr)

Ce que j'ai fait

J'ai beaucoup écrit, mais j'ai pu l'écrire rapidement. La bibliothèque est incroyable.

Ce n'est pas un gros problème, mais je l'ai jeté dans Gist.

https://gist.github.com/walkure/d1d87d8b4aad3c692edef1cce0f69aab

Et les autres langues

Dans le cas de Perl, il semble que la liaison CIDR puisse être effectuée avec la bibliothèque [Net :: CIDR :: Lite](https://metacpan.org/pod/Net :: CIDR :: Lite) [^ perl-lib]. Je pensais vraiment l'écrire, mais quand j'ai frappé cpan, j'ai dit" Libre au mauvais pool 1f7d20 et non 89034600d957d249 à C: \ Perl64 \ site \ lib / IO / Socket / SSL.pm ligne 2739. " Je vais finir. Après examen, j'ai abandonné l'apparence d'un problème connu et non résolu [^ état actif de la communauté] qui ne se produit que sous Windows.

Dans le cas de Go, il existe une bibliothèque [^ cidrman-readme] inspirée de netaddr appelée cidrman, mais actuellement seul IPv4 est implémenté. [^ problème cidrman-v6].

Pour PHP, il existe un article Créez votre propre liste d'attribution d'adresses IPv6, IPv4 spécifique au pays.

Recommended Posts

Faire une liste d'allocation / allocation d'adresses IP pour une certaine zone
Python: obtenir une liste de méthodes pour un objet
Comment créer un package Python (écrit pour un stagiaire)
Créer une boîte à Tweet pour Pepper
python / Créer un dict à partir d'une liste.
Changer la liste dans l'instruction for
Pour obtenir une adresse IP locale par programme
Qt pour l'application de bureau de l'application Python
Cours ROS 107 Créer un client pour rosblidge
Créez un modèle d'échiquier pour l'étalonnage de la caméra
Faisons un plug-in backend pour Errbot
[Python] Créer une liste de date et d'heure (type datetime) pour une certaine période
Écrivons un processus d'agrégation pour une certaine période en utilisant pandas × groupby × Grouper