Bibliothek zur Angabe eines Nameservers in Python und Dig

Auslösen

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.

Umgebung

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.

Bei der Überprüfung mit dem Befehl dig

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.

Bibliothek, die nutzbar zu sein scheint

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).

Wie benutzt man

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/

Wie benutzt man

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/

Wie benutzt man

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/

Wie benutzt man

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

Fazit

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

Bibliothek zur Angabe eines Nameservers in Python und Dig
Installationsverfahren für Python und Ansible mit einer bestimmten Version
Ein Beispiel zum Zeichnen von Punkten mit PIL (Python Imaging Library).
Erstellen Sie eine gestreifte Illusion mit Gammakorrektur für Python3 und openCV3
Ein Memo mit Python2.7 und Python3 in CentOS
Versuchen Sie HTML-Scraping mit der Python-Bibliothek
Janken Poi mit Python Lassen Sie uns für Anfänger auf einem lokalen Windows-Server laufen
Erstellen Sie einen leichtgewichtigen Server in Python und hören Sie sich die HTTP-Erweiterungen von Scratch 2 an
Kausales Denken und kausale Suche von Python (für Anfänger)
Holen Sie sich ein Ticket für einen Themenpark mit Python
Erstellen einer Python-Umgebung mit virtualenv und direnv
Erstellen Sie mit Minette für Python einen LINE BOT
Vorgehensweise zum Erstellen eines mit Python erstellten LineBot
Starten Sie mit Docker einen einfachen Python-Webserver
Holen Sie sich den Git-Zweignamen und den Tag-Namen mit Python
Befehle zum Erstellen einer Python3-Umgebung mit virtualenv
Bis Python mit Pythonbrew installiert ist und Flask auf dem WSGI-Server ausgeführt wird
[Python] So erstellen Sie eine lokale Webserverumgebung mit SimpleHTTPServer und CGIHTTPServer
Lokaler Server mit Python
Erstellen einer R- und Python Docker-Arbeitsumgebung
Erstellen Sie eine virtuelle Python-Umgebung mit virtualenv und virtualenvwrapper
C-Sprache, Java, Python-Benchmarks mit Primfaktorisierung
Erstellen Sie mit pyenv-virtualenv eine Python-Umgebung für jedes Verzeichnis
Versuchen Sie, ein einfaches Spiel mit Python 3 und iPhone zu erstellen
Ein Server, der POST-Daten mit flask / python wiedergibt
Erstellen Sie eine virtuelle Python-Umgebung mit virtualenv und virtualenvwrapper
Erstellen Sie in Docker eine Ebene für AWS Lambda Python
[Python] Löschen Sie, indem Sie ein Tag mit Beautiful Soup angeben
Erstellen Sie mit Quarry einen gefälschten Minecraft-Server in Python
[Vagrant] Richten Sie einen einfachen API-Server mit Python ein
Erstellen Sie einen API-Server, um den Betrieb der Front-Implementierung mit Python3 und Flask zu überprüfen
[Erstellen einer CI-Umgebung in 2 Stunden] Verfahren zum Erstellen eines Python-Webservers mit CircleCI und zum Bestehen eines HTTP-Kommunikationstests
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Erstellen Sie mit Python einen Entscheidungsbaum aus 0 und verstehen Sie ihn (3. Datenanalysebibliothek Pandas Edition)
Bildschirm und geteilter Bildschirm mit Python- und SSH-Anmeldung am Remote-Server
Python und Hardware-Verwenden von RS232C mit Python-
Empfehlung von Django, Bachstelze ~ Warum eine Website mit Python entwickeln ~
Verknüpfen Sie Python Enum mit einer Funktion, um es aufrufbar zu machen
Erstellen Sie ein untergeordnetes Konto für die Verbindung mit Stripe in Python
[Python] Erstellen Sie eine Datums- und Zeitliste für einen bestimmten Zeitraum
Experimentieren Sie mit Python, um ein PDF für Selbstversorger für Kindle zu erstellen
Lassen Sie uns ein PRML-Diagramm mit Python, Numpy und matplotlib erstellen.
Analysieren Sie Aktien mit Python und suchen Sie nach günstigen Handelsphasen
Lösen mit Ruby, Perl, Java und Python AtCoder ATC 002 A.
Ich habe einen Server mit Python-Socket und SSL erstellt und versucht, über den Browser darauf zuzugreifen
Erstellen Sie einen Twitter-BOT mit dem GoogleAppEngine SDK für Python
Erstellen Sie eine Python-Umgebung und übertragen Sie Daten auf den Server
Machen Sie eine Lotterie mit Python
Paket Python-Laufzeit- und Pypi-Bibliothek mit Chef / Omnibus und Docker
Hasch mit Python und entkomme dem Ego eines bestimmten Ministers
<Python> Erstellen Sie einen Server für die Datenanalyse mit Jupyter Notebook
Python mit Pyenv und Venv
Einfacher HTTP-Server für Python
Holen Sie sich eine Liste der CloudWatch-Metriken und eine Entsprechungstabelle der Einheiteneinheiten mit Python boto
Erstellen Sie ein Verzeichnis mit Python
[In-Database Python Analysis Tutorial mit SQL Server 2017] Schritt 5: Training und Speichern von Modellen mit T-SQL
Drehen Sie ein Array von Zeichenfolgen mit einer for-Anweisung (Python3).
Erstellen Sie unter CentOS 7.7 eine Python-Umgebung für Ihren Heimserver