Bibliothèque pour spécifier un serveur de noms en python et dig

Déclencheur

Il y avait une tâche pour vérifier que plusieurs enregistrements dans plusieurs zones correspondaient pour chaque serveur de noms, et il y en avait tellement, j'ai donc créé un script avec python.

À ce moment-là, je me demandais s'il y avait quelque chose de bien dans une bibliothèque qui creuse avec la spécification NS en python, mais au début de 202006, je ne pouvais pas trouver une page avec des informations utiles, je vais donc l'écrire ici. pensée.

Puisque python étudie simplement python, je pense qu'il aurait été plus rapide de l'écrire dans un script shell si je voulais le faire facilement.

environnement

Pour vérifier le fonctionnement lors de la rédaction de cet article, Installé sur Windows10 / WSL / Ubuntu-18.04

# pyenv --version
pyenv 1.2.17-2-ga8ca63fc

# pipenv --version
pipenv, version 2018.11.26

# python --version
Python 3.8.2

Je l'ai confirmé à.

En dehors de ce qui précède, il est également implémenté dans la même version pyenv / pipenv / python sur CentOS8.

Lors de la vérification avec la commande dig

Un échantillon de ce que je voulais essayer.

# dig blog.watarinohibi.tokyo @8.8.8.8

;; ANSWER SECTION:
blog.watarinohibi.tokyo. 19     IN      A       157.230.43.191

# dig blog.watarinohibi.tokyo @dns1.p06.nsone.net 

;; ANSWER SECTION:
blog.watarinohibi.tokyo. 20     IN      A       157.230.45.115

dns1.p06.nsone.net est le serveur NS de Netlify L'URL que vous recherchez est votre propre site de blog qui est déployé sur Netlify Ce qui précède est un exemple, et il a en fait été effectué pour un enregistrement A, un enregistrement SOA, un enregistrement TXT, un enregistrement MX, etc. qui renvoient un enregistrement spécifique.

Bibliothèque qui semble utilisable

socket

https://docs.python.org/ja/3/library/socket.html#socket.gethostbyname

socket.gethostbyname_ex(hostname) Obtenez diverses informations d'adresse au format IPv4 à partir du nom d'hôte. La valeur de retour est un tapple de (hostname, aliaslist, ipaddrlist), hostname est le nom officiel de l'hôte spécifié par ip_address, aliaslist est une liste d'alias pour la même adresse (qui peut être vide) et ipaddrlist est pour la même interface sur le même hôte. Affiche une liste d'adresses IPv4 (principalement une seule adresse).

Comment utiliser

test1.py


#!/usr/bin/env python3
import socket

domain = 'blog.watarinohibi.tokyo'
ns1 = '8.8.8.8' # google DNS
ns2 = 'dns1.p06.nsone.net' # Netlify DNS

# socket
print ("=== socket.getaddinfo")
addrs = socket.getaddrinfo(domain, 80)
for addr in addrs:
    print(addr)

print ("=== socket.gethostbyname")
addrs = socket.gethostbyname(domain)
print (addrs)
 # ./test.py
=== socket.getaddinfo
(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('157.230.45.115', 80))
(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_DGRAM: 2>, 17, '', ('157.230.45.115', 80))
(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_RAW: 3>, 0, '', ('157.230.45.115', 80))
(<AddressFamily.AF_INET6: 10>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('2400:6180:0:d1::575:a001', 80, 0, 0))
(<AddressFamily.AF_INET6: 10>, <SocketKind.SOCK_DGRAM: 2>, 17, '', ('2400:6180:0:d1::575:a001', 80, 0, 0))
(<AddressFamily.AF_INET6: 10>, <SocketKind.SOCK_RAW: 3>, 0, '', ('2400:6180:0:d1::575:a001', 80, 0, 0))
=== socket.gethostbyname
157.230.45.115

Il n'y a aucune option pour spécifier NS (probablement pas négligé). Ne convient pas à cette application, mais si vous souhaitez essayer la résolution de noms avec une bibliothèque standard, cela suffit.

dnspython

http://www.dnspython.org/ https://github.com/rthalley/dnspython https://pypi.org/project/dnspython/

Comment utiliser

http://www.dnspython.org/examples.html  Veuillez vous référer à la zone. Cette fois, je veux essayer de rechercher un enregistrement A en spécifiant NS.

test.py


import dns.resolver

print ("=== dns.resolver @", ns1)
resolver = dns.resolver.Resolver()
resolver.nameservers = [ns1]
answers = resolver.query(domain, 'A')
for rdata in answers:
    print (rdata)

print ("=== dns.resolver @", ns2)
resolver = dns.resolver.Resolver()
resolver.nameservers = [ns2]
answers = resolver.query(domain, 'A')
for rdata in answers:
    print (rdata)
 # ./test.py
=== dns.resolver @ 8.8.8.8
134.209.106.40
=== dns.resolver @ dns1.p06.nsone.net
Traceback (most recent call last):
  ~~~ stack trace

Avec ce sentiment, il fonctionnait avec la spécification NS avec l'adresse IPv4, mais une erreur s'est produite avec la spécification NS avec un enregistrement CNAME tel que Netlify DNS. https://github.com/rthalley/dnspython/issues/235 Il y a un échange qui semble être cette erreur, mais il semble qu'il n'est pas pris en charge car il n'est pas dans RFC. Cependant, j'ai une image que les enregistrements NS sont utilisés pour CNAME du tout, donc je ne suis pas sûr à ce sujet. ..

pynslookup

https://github.com/wesinator/pynslookup https://pypi.org/project/nslookup/

Comment utiliser

test.py


from nslookup import Nslookup

print ("=== nslookup @", ns1)
dns_query = Nslookup(dns_servers=[ns1])
ips_record = dns_query.dns_lookup(domain)
print(ips_record.response_full, ips_record.answer)

print ("=== nslookup @", ns2)
dns_query = Nslookup(dns_servers=[ns2])
ips_record = dns_query.dns_lookup(domain)
print(ips_record.response_full, ips_record.answer)
 # ./test.py
=== nslookup @ 8.8.8.8
['blog.watarinohibi.tokyo. 19 IN A 178.128.17.49'] ['178.128.17.49']
=== nslookup @ dns1.p06.nsone.net
Traceback (most recent call last):
~~~ stack trace

C'est pourquoi c'est aussi une erreur. Quand j'ai vérifié le code, https://github.com/wesinator/pynslookup/blob/master/nslookup/nslookup.py

nslookup.py


import dns.resolver, dns.exception

Il semble que dnspython soit utilisé tel quel en interne.

pydig

https://github.com/leonsmith/pydig https://pypi.org/project/pydig/

Comment utiliser

test.py


import pydig

print ("=== nslookup @", ns1)
resolver = pydig.Resolver(
    nameservers = [ns1]
)
answer = resolver.query(domain, 'A')
print (answer)

print ("=== nslookup @", ns2)
resolver = pydig.Resolver(
    nameservers = [ns2]
)
answer = resolver.query(domain, 'A')
print (answer)
 # ./test.py
=== nslookup @ 8.8.8.8
['157.230.35.153']
=== nslookup @ dns1.p06.nsone.net
['206.189.89.118']

Oh, ça a marché. Ce type semble fonctionner même avec la désignation NS de CNAME. Si vous vérifiez le code, https://github.com/leonsmith/pydig/blob/master/pydig/resolver.py

import subprocess
--
Builds up the final arguments to pass into subprocess

Il était écrit que la fouille locale était juste en cours d'exécution dans le sous-processus. Je vois. Si le chemin de fouille est différent ou si vous souhaitez le spécifier, vous pouvez le spécifier en option.

>>> resolver = pydig.Resolver(
...     executable='/usr/bin/dig',
...     nameservers=[
...         '1.1.1.1',
...         '1.0.0.1',
...     ],
...     additional_args=[
...         '+time=10',
...     ]
... )

Conclusion

Si vous voulez utiliser dig avec NS spécifié en Python, vous pouvez utiliser pydig qui est un wrapper de la commande dig, mais il semble que ce soit juste un wrapper, vous pouvez donc l'écrire vous-même dans le sous-processus. inconnue.

Le DNS n'est pas bon.

Recommended Posts

Bibliothèque pour spécifier un serveur de noms en python et dig
Procédure d'installation pour Python et Ansible avec une version spécifique
Un exemple pour dessiner des points avec PIL (Python Imaging Library).
Créez une illusion rayée avec correction gamma pour Python3 et openCV3
Un mémo contenant Python2.7 et Python3 dans CentOS
Essayez le scraping HTML avec la bibliothèque Python
Janken Poi avec Python Exécutons sur un serveur local Windows pour les débutants
Construisez un serveur léger en Python et écoutez les extensions HTTP de Scratch 2
Raisonnement causal et recherche causale par Python (pour les débutants)
Obtenez un billet pour un parc à thème avec python
Construire un environnement python avec virtualenv et direnv
Créer un LINE BOT avec Minette pour Python
Procédure de création d'un LineBot réalisé avec Python
Démarrez un serveur Web Python simple avec Docker
Obtenez le nom de la branche git et le nom de la balise avec python
Commandes pour créer un environnement python3 avec virtualenv
Jusqu'à ce que Python soit installé avec pythonbrew et que Flask s'exécute sur le serveur WSGI
[Python] Comment créer un environnement de serveur Web local avec SimpleHTTPServer et CGIHTTPServer
Serveur local avec python
Création d'un environnement de travail Docker R et Python
Créez un environnement virtuel python avec virtualenv et virtualenvwrapper
Benchmarks langage C, Java, Python avec factorisation prime
Créez un environnement python pour chaque répertoire avec pyenv-virtualenv
Essayez de créer un jeu simple avec Python 3 et iPhone
Un serveur qui fait écho aux données POSTées avec flask / python
Créez un environnement virtuel python avec virtualenv et virtualenvwrapper
Créer une couche pour AWS Lambda Python dans Docker
[Python] Supprimer en spécifiant une balise avec Beautiful Soup
Créez un faux serveur Minecraft en Python avec Quarry
[Vagrant] Configurer un serveur API simple avec python
Construisez un serveur API pour vérifier le fonctionnement de l'implémentation frontale avec python3 et Flask
[Création d'un environnement CI en 2 heures] Procédure de création d'un serveur Web Python avec CircleCI et réussite d'un test de communication HTTP
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Créez un arbre de décision à partir de zéro avec Python et comprenez-le (3. Bibliothèque d'analyse de données édition Pandas)
écran et écran partagé avec connexion python et ssh au serveur distant
Python et matériel - Utilisation de RS232C avec Python -
Recommandation de django, wagtail ~ Pourquoi développer un site web avec python ~
Associez Python Enum à une fonction pour la rendre appelable
Créer un compte enfant de connect with Stripe en Python
[Python] Créer une liste de dates et d'heures pour une période spécifiée
Expérimentez pour créer un PDF indépendant pour Kindle avec Python
Créons un diagramme PRML avec Python, Numpy et matplotlib.
Analysez les actions avec python et recherchez des phases de trading favorables
Résolution avec Ruby, Perl, Java et Python AtCoder ATC 002 A
J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
Créez un Twitter BOT avec le SDK GoogleAppEngine pour Python
Créer un environnement Python et transférer des données vers le serveur
Faites une loterie avec Python
Package d'exécution Python et bibliothèque pypi avec chef / omnibus et Docker
Hash avec python et échapper à l'égosa d'un certain ministre
<Python> Construisez un serveur dédié pour l'analyse des données Jupyter Notebook
python avec pyenv et venv
Serveur HTTP simple pour python
Obtenez une liste des métriques CloudWatch et une table de correspondance des unités unitaires avec Python boto
Créer un répertoire avec python
[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 5: Formation et enregistrement des modèles à l'aide de T-SQL
Tourner un tableau de chaînes avec une instruction for (Python3)
Créez un environnement python sur CentOS 7.7 pour votre serveur domestique