Es gab eine Aufgabe zu überprüfen, ob mehrere Datensätze in mehreren Zonen für jeden Nameserver übereinstimmten, und es gab so viele, dass ich ein Skript mit Python erstellte.
Zu dieser Zeit habe ich mich gefragt, ob eine Bibliothek, die mit NS-Spezifikation in Python arbeitet, etwas Gutes hat, aber seit Anfang 202006 konnte ich keine Seite mit nützlichen Informationen finden, deshalb werde ich sie hier aufschreiben. habe gedacht.
Da Python einfach Python studiert, wäre es meiner Meinung nach schneller gewesen, es in ein Shell-Skript zu schreiben, wenn ich es einfach machen wollte.
Um den Vorgang beim Schreiben dieses Artikels zu überprüfen, Installiert unter Windows 10 / 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
Ich habe es bei bestätigt.
Abgesehen davon ist es auch in der gleichen Version pyenv / pipenv / python unter CentOS8 implementiert.
Ein Beispiel von dem, was ich ausprobieren wollte.
# 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 ist der NS-Server von Netlify Die URL, nach der Sie suchen, ist Ihre eigene Blog-Site, die auf Netlify bereitgestellt wird Das Obige ist ein Beispiel und wurde tatsächlich für einen Datensatz, einen SOA-Datensatz, einen TXT-Datensatz, einen MX-Datensatz usw. durchgeführt, die einen bestimmten Datensatz zurückgeben.
socket
https://docs.python.org/ja/3/library/socket.html#socket.gethostbyname
socket.gethostbyname_ex(hostname) Beziehen Sie verschiedene Adressinformationen im IPv4-Format vom Hostnamen. Der Rückgabewert ist ein Tapple von (Hostname, Aliasliste, ipaddrlist), Hostname ist der offizielle Name des durch ip_address angegebenen Hosts, Aliasliste ist eine Liste von Aliasnamen für dieselbe Adresse (die leer sein kann) und ipaddrlist ist für dieselbe Schnittstelle auf demselben Host. Zeigt eine Liste der IPv4-Adressen an (meistens nur eine einzelne 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
Es gibt keine Option zur Angabe von NS (wahrscheinlich nicht übersehen). Nicht für diese Anwendung geeignet, aber wenn Sie die Namensauflösung mit einer Standardbibliothek versuchen möchten, reicht dies aus.
dnspython
http://www.dnspython.org/ https://github.com/rthalley/dnspython https://pypi.org/project/dnspython/
http://www.dnspython.org/examples.html Bitte beziehen Sie sich auf den Bereich. Dieses Mal möchte ich versuchen, einen Datensatz durch Angabe von NS nachzuschlagen.
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
Mit diesem Gefühl funktionierte es mit der NS-Spezifikation mit IPv4-Adresse, aber bei der NS-Spezifikation mit CNAME-Eintrag wie Netlify DNS trat ein Fehler auf. https://github.com/rthalley/dnspython/issues/235 Es gibt einen Austausch, bei dem es sich anscheinend um diesen Fehler handelt, der jedoch nicht unterstützt wird, da er nicht in RFC enthalten ist. Ich habe jedoch ein Bild, dass NS-Datensätze überhaupt für CNAME verwendet werden, daher bin ich mir nicht sicher. ..
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
Deshalb ist dies auch ein Fehler. Nachdem Sie den Code überprüft haben, https://github.com/wesinator/pynslookup/blob/master/nslookup/nslookup.py
nslookup.py
import dns.resolver, dns.exception
Es scheint, dass dnspython so verwendet wird, wie es intern ist.
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, es hat funktioniert. Dieser Typ scheint sogar mit der NS-Bezeichnung CNAME zu arbeiten. Wenn Sie den Code überprüfen, https://github.com/leonsmith/pydig/blob/master/pydig/resolver.py
import subprocess
--
Builds up the final arguments to pass into subprocess
Es wurde geschrieben, dass die lokale Ausgrabung nur im Unterprozess ausgeführt wurde. Das war's. Wenn der Grabungspfad anders ist oder Sie ihn angeben möchten, können Sie ihn als Option angeben.
>>> resolver = pydig.Resolver(
... executable='/usr/bin/dig',
... nameservers=[
... '1.1.1.1',
... '1.0.0.1',
... ],
... additional_args=[
... '+time=10',
... ]
... )
Wenn Sie dig mit in Python angegebenem NS verwenden möchten, können Sie pydig verwenden, einen Wrapper des dig-Befehls. Es scheint jedoch, dass es sich nur um einen Wrapper handelt, sodass Sie ihn möglicherweise selbst in einem Unterprozess schreiben können. Unbekannt.
DNS ist nicht gut.
Recommended Posts