Calendrier de l'Avent NetOpsCoding 2015 C'est l'article du 21e jour. Je suis désolé d'avoir mal compris le calendrier ...
Lorsqu'un ingénieur réseau écrit un script, je pense que l'adresse IP peut être manipulée ou calculée dans le script. Si vous souhaitez calculer de la même manière qu'une valeur numérique normale, analysez l'adresse IP du type de chaîne de caractères et convertissez-la en Int avec pondération pour chaque chiffre. ne peux pas. De plus, ipv6 a un grand nombre de chiffres, et il y a des cas où il ne peut pas être traité par une simple analyse syntaxique telle que la notation abrégée, il est donc un peu difficile de l'implémenter vous-même.
Cette fois, je vais vous présenter le module ipaddress qui permet de gérer très facilement l'adresse IP gênante! Évidemment pour ceux qui savent, je ne connaissais pas cette commodité jusqu'à récemment, donc je vais la partager pour ceux qui ne le savent pas encore.
Le module ipaddress est un module standard officiellement implémenté à partir de python 3.3. (PEP3144) Il est basé sur le module ipaddr développé par Google. Bien sûr, presque la même opération peut être effectuée en utilisant le module ipaddr, mais cette fois, utilisons l'adresse IP qui est installée en tant que module standard et ne nécessite pas d'installation.
Le module ipaddress a des fonctions dédiées à v4 / v6 telles que ʻIPv4Address () et ʻIPv6Address ()
, mais des fonctions telles que ʻip_address () `qui les incluent sont préparées et les arguments. Vous pouvez l'utiliser sans vous soucier de savoir si c'est v4 ou v6.
Le module ipaddress utilise les trois types de fonctions suivants.
Comme le nom de la fonction l'indique, ip correspond à ʻip_address () , l'adresse réseau correspond à ʻip_network ()
et l'adresse d'interface correspond à ʻip_interface () `.
Utilisez cette fonction pour créer un objet de type ipv4 / v6. En outre, diverses conversions et calculs peuvent être effectués en utilisant des fonctions optionnelles. Les fonctions qui sont pratiques et souvent utilisées personnellement sont les suivantes.
une fonction | une fonction |
---|---|
*.version | L'objet est v4/v6 Déterminez les informations dont vous disposez. 4 pour la v4, 6 pour la v6 |
*.compressed | v4 est équivalent,v6 renvoie une chaîne de raccourcis |
*.exploded | v4 est équivalent,v6 renvoie une chaîne de notation qui n'omet pas 0 |
*.is_link_local | Vrai s'il s'agit d'une adresse réservée locale de lien dans RFC3927 |
.with_with_prefixlen | prefix Renvoie une adresse longue sous forme de chaîne(10.10.10.1/24 mag) |
.with_with_netmask | Renvoie une adresse de format de masque de réseau sous forme de chaîne(10.10.10.1 255.255.255.0 mag) |
Vous pouvez également utiliser divers opérateurs. Lors de l'incrémentation de l'adresse IP, ajoutez simplement les opérateurs «+», «-» au module d'adresse IP et décrivez la valeur, et les hauts et les bas des chiffres seront traités de manière arbitraire.
Voici un exemple d’exécution.
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: #Il est possible de déterminer s'il est inclus dans l'adresse réseau avec une ligne d'ip dans le réseau
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 Vérifiez quelle adresse est stockée
print ("%s is IPv%d"%(ip,ip.version))
print ("%s is IPv%d"%(ipv6,ipv6.version))
print ("="*15)
#Incrément d'adresse
ip = ip + 1
ipv6 = ipv6 -2
print ("increment ipv4 : %s"%ip)
print ("decrement ipv6 : %s"%ipv6)
print ("="*15)
#Conversion abrégée et non abrégée d'ipv6
print ("exploded ipv6 : %s"%ipv6.exploded)
print ("compressed ipv6 : %s"%ex_ipv6.compressed)
print ("="*15)
#Déterminer s'il s'agit d'une adresse locale de lien
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
Comme vous pouvez le voir ci-dessus, les fonctions ip_address et ip_network déterminent le traitement d'ipv4 / v6. Si vous utilisez ce module, vous pouvez économiser beaucoup de temps et d'efforts pour séparer les cas de traitement entre ipv4 et ipv6.
Ce module m'a été très utile dans de tels moments
Dans ce cas. Le module ipaddress joue un rôle actif dans la phase de mappage Interface et BGP en analysant la configuration et en extrayant les informations. Supposons que vous analysiez une configuration comme celle ci-dessous
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
!
!
Cette fois, je vais omettre la méthode d'analyse de cette configuration car ce n'est pas le point principal. Tout d'abord, analysez la configuration d'interface et conservez les informations d'interface. Ensuite, les informations de voisin sont extraites, et si l'adresse de voisin est incluse dans les informations d'interface, elle est associée à l'interface.
Pour la partie mapping, le même code a été présenté comme exemple ci-dessus, mais Il est possible de distinguer avec juste cette description. (Puisque la partie perspective est omise, l'adresse IP atteint directement la même adresse que la configuration)
neighbor = ipaddress.ip_address('fd00:260:301:222::333:123') #IP voisine
interface = ipaddress.ip_interface('fd00:260:301:222::222:1/64') #IP de l'interface
# interface.Comparer après la conversion en adresse réseau réseau avec le réseau
if neighbor in interface.network:
print ("%s is included %s ."%(neighbor, interface))
else :
print ("%s isn't included %s ."%(neighbor, interface))
Résultat d'exécution.log
fd00:260:301:222::333:123 is included fd00:260:301:222::222:1/64 .
Si vous recherchez ces modules utiles, ils sont souvent installés en standard ou sont fabriqués par des tiers. Il est normal de l'implémenter avec difficulté, mais en fait, il était possible de l'implémenter immédiatement en utilisant des fonctions plus pratiques. Il y en a souvent. Ce n'est pas une mauvaise chose de tout mettre en œuvre vous-même, mais si vous trouvez quelque chose de pratique et adapté à votre objectif, il est beaucoup plus rapide de le mettre en œuvre. Ne soyez pas trop enthousiaste à propos de la mise en œuvre et faites une «enquête» approfondie.
C'est peut-être évident, mais je vais l'écrire ici comme une auto-discipline (rires)