[PYTHON] Erstellen Sie eine IP-Adresszuweisung / Zuweisungsliste für einen bestimmten Bereich

Einführung

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).

Zuordnung von IP-Adresse und Region

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."

Zuordnung und Zuordnung

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".

Vorgänger

Da es diesen Bedarf schon lange gibt, gibt es im Internet bereits einige Listen, die auf der Grundlage der oben genannten Ideen erstellt wurden.

Ich möchte es selbst machen

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.

Probleme beim Erstellen einer Liste

Das Listenformat von RIR ist öffentlich von APNIC usw. .. Sie können dies lesen und machen, aber es gibt einige Probleme.

Keine CIDR-Notation für IPv4

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.

Selbst mit CIDR gibt es Zeiten, in denen die Blöcke unterteilt sind

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.

Versuchen Sie es mit Python zu machen

CIDR wird generiert und kombiniert, es gibt jedoch eine Bibliothek netaddr für Operationen wie die CIDR-Kombination in Python.

Generieren von CIDR-Datensätzen

[^ 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()

Verbinden Sie CIDR-Blöcke

from netaddr import IPSet

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

Was ich gemacht habe

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

Was ist mit anderen Sprachen?

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

Erstellen Sie eine IP-Adresszuweisung / Zuweisungsliste für einen bestimmten Bereich
Python: Ruft eine Liste der Methoden für ein Objekt ab
Wie erstelle ich ein Python-Paket (geschrieben für Praktikanten)
Machen Sie eine Tweet-Box für Pepper
Python / Machen Sie ein Diktat aus einer Liste.
Ändern Sie die Liste in der for-Anweisung
Programmgesteuert eine lokale IP-Adresse abrufen
Qt für Python App Desktop App
ROS-Kurs 107 Machen Sie einen Kunden für Rosblidge
Erstellen Sie ein Schachbrettmuster für die Kamerakalibrierung
Lassen Sie uns ein Backend-Plug-In für Errbot erstellen
[Python] Erstellen Sie eine Liste mit Datum und Uhrzeit (Datum / Uhrzeit-Typ) für einen bestimmten Zeitraum
Schreiben wir einen Aggregationsprozess für einen bestimmten Zeitraum mit pandas × groupby × Grouper