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).
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."
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».
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.
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.
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.
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.
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é.
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.
Lorsque vous indiquez le début et la fin de l'adresse IP à l'argument du constructeur et appuyez sur [cidrs ()](https://netaddr.readthedocs.io/en/latest/api.html#netaddr.IPRange.cidrs) Vous obtiendrez un tableau [^ cidr-array] de CIDR (objet ʻIP Network
).[^ 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()
from netaddr import IPSet
v4set = IPSet(v4_cider_list)
for cidr in v4set.iter_cidrs():
print(cidr)
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
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