Bei Internetdiensten möchte ich manchmal die Region des Hosts ermitteln, der auf [^ Host-Benutzer] zugreift.
In Japan kann beispielsweise festgestellt werden, dass "wenn die IP-Adresse umgekehrt wurde, es" * .hkd.mesh.ad.jp "war, so dass es aussieht, als würde Hokkaido darauf zugreifen" [^ maxmind], aber diesmal sind die Details nicht so detailliert. Ich werde nicht. Obwohl es ein Ausdruck der Region ist, denken wir darüber mit der Korngröße [^ Region] des Landes nach.
[^ maxmind]: Diese Richtung ist um MaxMind.
[^ Host-Benutzer]: Ich denke, was ich wirklich will, ist der Wohnbereich des zugreifenden Benutzers, aber es wird angenommen, dass ich nur die IP-Adresse des zugreifenden Hosts kenne. Tatsächlich gibt die IP-Adresse der Zugriffsquelle nur den Bereich an, in dem sich die verteilte Organisation befindet, und der tatsächliche Standort des Hosts oder Benutzers ist eine andere Geschichte (es gibt ein VPN).
IP-Adresse von IANA jeweils [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 Es wird% E3% 83% AA) zugewiesen, und das RIR, das es empfängt, weist jeder Region zu und ordnet sie zu.
Wenn Sie die von jedem RIR bereitgestellte Liste "Registriert für welche Region" verarbeiten, können Sie daher eine Liste der verteilten IP-Adressen für jede Region erstellen.
[^ region]: Grob gesagt lautet das Land: "Es gibt eine Zuteilung nach Guam getrennt von den Vereinigten Staaten."
Da ich im Titel des Artikels "Zuordnung / Zuordnung" geschrieben habe, gibt es zwei Ausdrücke für die Verteilung. Darüber hinaus gibt es in der von RIR herausgegebenen Liste zwei Arten von "zugewiesen" und "zugewiesen".
Dies ist in dem von JPNIC herausgegebenen Dokument Was ist Zuweisung und Zuweisung beschrieben. Es gibt jedoch einen Unterschied, ob der Empfänger des verteilten Adressbereichs ihn verwendet oder nicht.
--zuweisen
Wenn wir in diesem Artikel diese beiden ohne Unterschied verwenden, schreiben wir "Verteilung".
Da es diesen Bedarf schon lange gibt, gibt es im Internet bereits einige Listen, die auf der Grundlage der oben genannten Ideen erstellt wurden.
Es würde keinen Spaß machen, wenn es mit einer Liste enden würde, also habe ich beschlossen, es selbst zu machen. Da es Daten gibt, die im Netz als die richtige Antwort angesehen werden können, scheint es, dass die Richtigkeit durch Vergleichen des generierten Ergebnisses damit bewertet werden kann.
Das Listenformat von RIR ist öffentlich von APNIC usw. .. Sie können dies lesen und machen, aber es gibt einige Probleme.
IPv4 hat die Notation [^ ipv4-Wert] von "Startadresse + Nummer". Wenn Sie den Bereich anhand der IP-Adresse im Programm ermitteln, ist es bequemer, ihn in CIDR zu konvertieren, da er häufig von CIDR berücksichtigt wird. Darüber hinaus gibt es einen Block [^ non-cidr], der nicht durch eine CIDR-Notation in einem Datensatz [^ historisch-noncidr] dargestellt werden kann.
Im Fall von IPv6 tritt dieses Problem nicht auf, da es sich um die CIDR-Notation [^ ipv6-Wert] handelt.
[^ ipv4-value]: Der Originaltext lautet "Im Fall einer IPv4-Adresse die Anzahl der Hosts für diesen Bereich. Diese Anzahl muss keinen CIDR-Bereich darstellen." Im Abschnitt "value". Es heißt, es ist nicht CIDR.
[^ ipv6-Wert]: Der Originaltext lautet "Im Fall einer IPv6-Adresse ist der Wert die CIDR-Präfixlänge ab dem Wert der ersten Adresse von
[^ historisch-noncidr]: Es ist ein Format, das existierte, bevor das Konzept von CIDR entstand.
Dies wird in der RIR-Dokumentation nicht erwähnt. Eine entsprechende Beschreibung finden Sie im vorherigen Artikel, und selbst wenn Sie sie selbst implementieren, wird die Liste sicherlich kleiner [^ historisch-noncidr].
Es ist nicht besonders gut, die Liste überflüssig zu machen, daher ist es am besten, sie zu verkürzen.
In Bezug auf die Bindung von CIDR Welche Art von Verarbeitung macht CIDR + CIDR? wird empfohlen.
CIDR wird generiert und kombiniert, es gibt jedoch eine Bibliothek netaddr für Operationen wie die CIDR-Kombination in Python.
IPNetwork
-Objekt).[^ cidr-array]: Dies liegt daran, dass der IP-Adressbereich, wie oben erwähnt, nicht immer durch einen einzelnen CIDR dargestellt werden kann.
from netaddr import IPRange,IPAddress
# `start`Wann`value`Ist RIR-Datensatzinformation
start_ip = IPAddress(start, version = 4)
end_ip = IPAddress(int(start_ip) + value - 1) # `value`Ist die Nummer-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)
Ich habe viel geschrieben, aber ich konnte es schnell schreiben. Die Bibliothek ist unglaublich.
Es ist keine große Sache, aber ich habe es in Gist geworfen.
https://gist.github.com/walkure/d1d87d8b4aad3c692edef1cce0f69aab
Im Fall von Perl kann die CIDR-Kombination anscheinend mit der Bibliothek [Net :: CIDR :: Lite](https://metacpan.org/pod/Net :: CIDR :: Lite) [^ perl-lib] durchgeführt werden. Ich dachte, ich würde es tatsächlich schreiben, aber als ich auf "cpan" drückte, sagte ich "Frei zu falschem Pool 1f7d20, nicht 89034600d957d249 unter C: \ Perl64 \ site \ lib / IO / Socket / SSL.pm, Zeile 2739". Ich werde am Ende. Bei der Prüfung gab ich das Auftreten eines bekannten und ungelösten Problems [^ Community-aktiver Zustand] auf, das nur unter Windows auftritt.
Im Fall von Go gibt es eine von Netaddr inspirierte [^ cidrman-readme] -Bibliothek namens cidrman, aber derzeit ist nur IPv4 implementiert. [^ cidrman-v6 Ausgabe].
Im Fall von PHP gibt es einen Artikel Erstellen Sie Ihre eigene länderspezifische IPv6-, IPv4-Adresszuweisungsliste.
Recommended Posts