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.
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.
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.
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).
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/
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/
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/
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',
... ]
... )
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