Une histoire qui était pratique lorsque j'ai essayé d'utiliser le module d'adresse IP python

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.

1. À propos du module ipaddress

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.

2. Environnement

3. Fonctions du module ipaddress

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.

4. Par exemple, vous pouvez l'utiliser à de tels moments (dans votre cas)

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 .

5. Résumé

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)

Recommended Posts

Une histoire qui était pratique lorsque j'ai essayé d'utiliser le module d'adresse IP python
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
J'ai essayé d'utiliser le module Datetime de Python
Une histoire à laquelle j'étais accro après la communication SFTP avec python
Notes diverses sur l'utilisation de python pour les projets
J'ai essayé d'utiliser Kwant, un module python pour le calcul du transport quantique
L'histoire de l'erreur de hachage est apparue lors de l'utilisation de Pipenv
L'histoire de la création d'un module qui ignore le courrier avec python
Quand j'ai essayé de gratter en utilisant des requêtes en python, j'étais accro à SSLError, donc un mémo de contournement
[Python] J'ai essayé de créer un programme simple qui fonctionne sur la ligne de commande en utilisant argparse
Lorsque j'ai essayé d'exécuter Python, j'ai été ignoré dans le Microsoft Store
vprof - J'ai essayé d'utiliser le profileur pour Python
J'ai essayé de lire un fichier CSV en utilisant Python
J'ai essayé d'ajouter un module Python 3 en C
Django super introduction par les débutants Python! Partie 2 J'ai essayé d'utiliser les fonctions pratiques du modèle
L'histoire de l'adresse IPv6 que je souhaite conserver au minimum
J'ai essayé d'utiliser la bibliothèque Python "pykakasi" qui peut convertir des kanji en romaji.
Une histoire que Seaborn était facile, pratique et impressionnée
Une histoire à laquelle j'étais accro chez np.where
[Python] J'ai essayé d'exécuter un serveur local en utilisant flask
Un mémo que j'ai touché au magasin de données avec python
J'ai essayé de dessiner une pseudo figure fractale en utilisant Python
J'ai essayé d'utiliser Python (3) au lieu d'un calculateur de fonctions
Ce à quoi j'étais accro lors de l'utilisation de Python tornado
Une histoire bloquée lors de la tentative de mise à niveau de la version Python avec GCE
J'ai essayé de noter la syntaxe trop humoristique et humoristique en utilisant l'API COTOHA.
Il y a un modèle que le programme ne s'est pas arrêté lors de l'utilisation du thread Python
Une histoire lorsque j'utilisais IntelliJ sous Linux et que je ne pouvais pas saisir le japonais
Une histoire dont j'ai été très convaincu lorsque j'ai écrit le code du problème Monty Hall et calculé le taux de gain
Une histoire qui a trébuché lorsque j'ai créé un bot de chat avec Transformer
J'ai essayé d'utiliser la bibliothèque Python de Ruby avec PyCall
J'ai essayé "un programme qui supprime les déclarations en double en Python"
Résolvez le problème japonais lors de l'utilisation du module CSV en Python.
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai obtenu "ModuleNotFoundError: aucun module nommé" azure "" lors de l'exécution d'un programme à l'aide du SDK Azure pour Python
J'ai écrit un script Python qui exporte tous mes articles à l'aide de l'API Qiita v2
Une histoire qui facilite l'estimation de la surface habitable à l'aide d'Elasticsearch et de Python
Quand j'ai essayé le concours AtCoder pour débutants, c'était un résultat terrible, alors je regarde en arrière
Une histoire qui a disparu quand j'ai spécifié un chemin commençant par tilda (~) en python open
Une histoire à laquelle j'étais accro en spécifiant nil comme argument de fonction dans Go
Lors de l'écriture dans un fichier csv avec python, une histoire que j'ai fait une légère erreur et n'a pas respecté la date de livraison
Une histoire à laquelle j'étais accro à appeler Lambda depuis AWS Lambda.
L'histoire selon laquelle la version de python 3.7.7 n'était pas adaptée à Heroku
J'ai essayé d'exécuter le référentiel de packages Python (entrepôt) qui prend en charge PyPI
J'ai fait un Line-bot avec Python!
J'ai essayé le mouvement Python3 qui change la direction dans le système de coordonnées
L'histoire selon laquelle l'environnement Homebrew a été époustouflé lors de l'installation d'Anaconda
On m'a dit que je ne pouvais pas trouver XML_SetHashSalt lorsque j'ai essayé d'utiliser pip avec python.
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
Une histoire que j'ai corrigée lorsque j'ai obtenu le journal Lambda de Cloudwatch Logs
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
Notez que j'étais accro à accéder à la base de données avec mysql.connector de Python en utilisant une application Web
J'ai essayé de créer une expression régulière de "date" en utilisant Python
[Ev3dev] Créez un programme qui capture LCD (écran) en utilisant python
J'ai essayé d'utiliser Thonny (Python / IDE)