NetOpsCoding Adventskalender 2015 Dies ist der Artikel am 21. Tag. Es tut mir leid, dass ich den Zeitplan falsch verstanden habe ...
Wenn ein Netzwerktechniker ein Skript schreibt, kann die IP-Adresse im Skript manipuliert oder berechnet werden. Wenn Sie auf die gleiche Weise wie ein normaler numerischer Wert berechnen möchten, analysieren Sie die IP-Adresse des Zeichenfolgentyps und konvertieren Sie sie in Int mit der Gewichtung für jede Ziffer. kann nicht. Darüber hinaus hat ipv6 eine große Anzahl von Ziffern und kann möglicherweise nicht durch einfaches Parsen wie die Kurzschreibweise verarbeitet werden. Daher ist es etwas mühsam, es selbst zu implementieren.
Dieses Mal werde ich das IP-Adressmodul vorstellen, das es sehr einfach macht, mit der lästigen IP-Adresse umzugehen! Offensichtlich für diejenigen, die es wissen, wusste ich diese Bequemlichkeit bis vor kurzem nicht, also werde ich sie für diejenigen teilen, die es noch nicht wissen.
Das ipaddress-Modul ist ein Standardmodul, das offiziell aus Python 3.3 implementiert wurde. (PEP3144) Es basiert auf dem von Google entwickelten ipaddr-Modul. Natürlich kann fast derselbe Vorgang mit dem ipaddr-Modul ausgeführt werden, aber dieses Mal verwenden wir die IP-Adresse, die als Standardmodul installiert ist und keine Installation erfordert.
Das ipaddress-Modul verfügt über Funktionen für v4 / v6 wie "IPv4Address ()" und "IPv6Address ()", aber Funktionen wie "ip_address ()", die diese enthalten, sind vorbereitet und Argumente. Sie können es verwenden, ohne sich Gedanken darüber machen zu müssen, ob es sich um v4 oder v6 handelt. Das IP-Adressmodul verwendet die folgenden drei Arten von Funktionen.
Wie der Funktionsname andeutet, entspricht ip "ip_address ()", die Netzwerkadresse "ip_network ()" und die Schnittstellenadresse "ip_interface ()".
Verwenden Sie diese Funktion, um ein Objekt vom Typ ipv4 / v6 zu erstellen. Darüber hinaus können verschiedene Konvertierungen und Berechnungen mithilfe optionaler Funktionen durchgeführt werden. Die Funktionen, die bequem sind und oft persönlich verwendet werden, sind folgende.
Funktion | Funktion |
---|---|
*.version | Objekt ist v4/v6 Bestimmen Sie, über welche Informationen Sie verfügen. 4 für v4, 6 für v6 |
*.compressed | v4 ist äquivalent,v6 gibt eine Kurzzeichenfolge zurück |
*.exploded | v4 ist äquivalent,v6 gibt eine Notationszeichenfolge zurück, bei der 0 nicht weggelassen wird |
*.is_link_local | True, wenn es sich um eine lokal reservierte Linkadresse in RFC3927 handelt |
.with_with_prefixlen | Präfix Gibt eine lange Adresse als Zeichenfolge zurück(10.10.10.1/24 mag) |
.with_with_netmask | Gibt eine Adresse im Netzwerkmaskenformat als Zeichenfolgentyp zurück(10.10.10.1 255.255.255.0 mag) |
Sie können auch verschiedene Operatoren verwenden. Wenn Sie die IP-Adresse erhöhen, fügen Sie einfach die Operatoren "+", "-" zum IP-Adressmodul hinzu und beschreiben Sie den Wert. Die Höhen und Tiefen der Ziffern werden willkürlich behandelt.
Das folgende Beispiel zeigt ein Ausführungsbeispiel.
sample_ipaddress.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import ipaddress
if __name__ == "__main__":
ip = ipaddress.ip_address('10.2.3.4')
nw = ipaddress.ip_network('10.0.0.0/8')
if ip in nw: #Es ist möglich zu bestimmen, ob es in der Netzwerkadresse mit einer IP-Zeile im Netzwerk enthalten ist
print ("%s is included %s ."%(ip, nw))
else :
print ("%s isn't included %s ."%(ip, nw))
print ("="*15)
ip = ipaddress.ip_address('10.2.3.255')
ipv6 = ipaddress.ip_address('fd00:260:301:104::104:1')
ex_ipv6 = ipaddress.ip_address('fd00:0260:0301:0104:0000:0000:0104:1')
#ipv4/v6 Überprüfen Sie, welche Adresse gespeichert ist
print ("%s is IPv%d"%(ip,ip.version))
print ("%s is IPv%d"%(ipv6,ipv6.version))
print ("="*15)
#Adressinkrement
ip = ip + 1
ipv6 = ipv6 -2
print ("increment ipv4 : %s"%ip)
print ("decrement ipv6 : %s"%ipv6)
print ("="*15)
#Abgekürzte und nicht abgekürzte Konvertierung von ipv6
print ("exploded ipv6 : %s"%ipv6.exploded)
print ("compressed ipv6 : %s"%ex_ipv6.compressed)
print ("="*15)
#Feststellen, ob es sich um eine lokale Linkadresse handelt
print ("%s is linklocal : %s"%(ipv6,ipv6.is_link_local))
ipv6_ll = ipaddress.ip_address('fe80::104:1')
print ("%s is linklocal : %s"%(ipv6_ll,ipv6_ll.is_link_local))
% python3 ipaddress_sample.py
10.2.3.4 is included 10.0.0.0/8 .
===============
10.2.3.255 is IPv4
fd00:260:301:104::104:1 is IPv6
===============
increment ipv4 : 10.2.4.0
decrement ipv6 : fd00:260:301:104::103:ffff
===============
exploded ipv6 : fd00:0260:0301:0104:0000:0000:0103:ffff
compressed ipv6 : fd00:260:301:104::104:1
===============
fd00:260:301:104::103:ffff is linklocal : False
fe80::104:1 is linklocal : True
Wie Sie oben sehen können, bestimmen die Funktionen ip_address und ip_network die Verarbeitung von ipv4 / v6. Wenn Sie dieses Modul verwenden, können Sie viel Zeit und Mühe sparen, um die Verarbeitungsfälle zwischen ipv4 und ipv6 zu trennen.
Dieses Modul war zu solchen Zeiten für mich sehr nützlich
In einem solchen Fall. Das IP-Adressmodul spielt eine aktive Rolle in der Phase der Zuordnung von Schnittstelle und BGP, indem es die Konfiguration analysiert und Informationen extrahiert. Angenommen, Sie analysieren eine Konfiguration wie die folgende
ios-xr.conf
interface TenGigE0/0/0/0
ipv4 address 10.10.10.10 255.255.255.0
ipv6 nd suppress-ra
ipv6 address fe80::222:1 link-local
ipv6 address fd00:260:301:222::222:1/64
!
....Snip....
router bgp 64540
neighbor 10.10.10.200
remote-as 64601
description "TEST-BGP-CONFIGURE"
address-family ipv4 unicast
route-policy as64601-sample in
route-policy as64601-sample out
next-hop-self
soft-reconfiguration inbound always
!
!
neighbor fd00:260:301:222::333:123
remote-as 64601
description "TEST-IPV6-BGP-CONFIGURE"
address-family ipv6 unicast
route-policy as64601-sample in
route-policy as64601-sample out
next-hop-self
soft-reconfiguration inbound always
!
!
Dieses Mal werde ich die Methode zum Parsen dieser Konfiguration weglassen, da dies nicht der Hauptpunkt ist. Analysieren Sie zunächst die Schnittstellenkonfiguration und behalten Sie die Schnittstelleninformationen bei. Als nächstes werden die Nachbarinformationen extrahiert, und wenn die Nachbaradresse in den Schnittstelleninformationen enthalten ist, wird sie der Schnittstelle zugeordnet.
Für den Zuordnungsteil wurde derselbe Code oben als Beispiel dargestellt, jedoch Es ist möglich, nur mit dieser Beschreibung zu unterscheiden. (Da der perspektivische Teil weggelassen wird, trifft die IP direkt auf dieselbe Adresse wie die Konfiguration.)
neighbor = ipaddress.ip_address('fd00:260:301:222::333:123') #Nachbar IP
interface = ipaddress.ip_interface('fd00:260:301:222::222:1/64') #Schnittstellen-IP
# interface.Vergleichen Sie nach der Konvertierung in die Netzwerkadresse mit dem Netzwerk
if neighbor in interface.network:
print ("%s is included %s ."%(neighbor, interface))
else :
print ("%s isn't included %s ."%(neighbor, interface))
Ausführungsergebnis.log
fd00:260:301:222::333:123 is included fd00:260:301:222::222:1/64 .
Wenn Sie nach diesen nützlichen Modulen suchen, werden sie häufig standardmäßig installiert oder von Dritten hergestellt. Es ist in Ordnung, es mit Schwierigkeiten zu implementieren, aber tatsächlich war es möglich, es sofort mit bequemeren Funktionen zu implementieren. Oft gibt es. Es ist keine schlechte Sache, alles selbst zu implementieren, aber wenn Sie etwas finden, das für Ihren Zweck geeignet und geeignet ist, ist es viel schneller, es zu implementieren. Seien Sie nicht zu begeistert von der Implementierung und führen Sie eine gründliche "Untersuchung" durch.
Es mag offensichtlich sein, aber ich werde es hier als Selbstdisziplin schreiben (lacht)
Recommended Posts