Python自動化メンテナンスノート(三):DNS処理モジュールdnspython


運転環境:Python 3.6,Windwos10 RS1,Pycharm
モジュールの紹介dnspythonは、Pythonによって実装されたDNSツールパッケージであり、ほとんどのレコードタイプをサポートし、ZONE情報をクエリー、転送、動的に更新するとともに、TSIG(トランザクション署名)検証メッセージおよびEDNS0(拡張DNS)をサポートする.nslookupdigなどのツールに代わることができ、プラットフォームの統合を容易に行うことができます.
モジュールのインストール
私のコンピュータの現在の環境はPython3.6で、すでにpipのソフトウェア管理ツールを継承しているので、私は直接pipを使ってdnspythonモジュールをインストールしました.
pip install dnspython   #     1.15.0,   Python2 Python3       ,     python3 ,   pip3 install dnspython    

ドメイン名の解析方法dnspythonは大量のDNS処理方法を提供し、最もよく使われるのはドメイン名クエリーである.dnspythonは、ドメイン名のクエリー機能を実現するために、DNSの解析器クラスresolverを提供する.
query(self,qname,rdtype=1,rdclass=1,tcp=False,source=None,raise_on_no_answer=True,source_port=0)
queryはクエリのドメイン名であり、qnamerdtypeリソースのタイプを指定するために使用されます.
A記録:ホスト名をIPアドレスMX記録に変換する:メール交換記録、メールサーバードメイン名を定義するCNAME記録:別名記録、ドメイン名間のマッピングNS記録を実現する:マーキングエリアのドメイン名サーバー及び授権サブドメインPTR記録:逆解析、A記録と反対、IPをホスト名SOA記録に変換する:一つの開始授権エリアの定義
ドメイン名解析タイプの詳細については、この記事(リンク)を参照してください.
一般的なドメイン名解析の例
6つのドメイン名解析タイプについて述べたが、RRAMXNSCNAMEの4つの解析タイプにすぎない.
①AレコードAレコードのインスタンスコードは以下の通りである.
# -*- coding: utf-8 -*-
# @Time : 2017/10/1 9:58 
# @File : DNS.py 
# @Software: PyCharm

import dns.resolver

domain = input("       :")       #       
A = dns.resolver.query(domain, 'A')     #        A     
for i in A.response.answer:             #   response.answer          
    # print(i)          
    for j in i.items:           
        print(j)

実行結果は次のとおりです.
       :>? www.baidu.com
www.a.shifen.com.
14.215.177.38
14.215.177.39

これでwww.baidu.comのドメイン名を解析しました.それ以外に、デバッグウィンドウで変数iが何であるかを見ることができます.
print(i)    #     i    

出力結果は次のとおりです.
>>> print(i)
www.a.shifen.com. 225 IN A 14.215.177.38
www.a.shifen.com. 225 IN A 14.215.177.39
iには、出力されたj値に対応する2つのエントリがあることが分かった.また、注意すべき点はいくつかあります.
  • 『Python自動化メンテナンス』で使用されているPython2.6は、サンプルコードの最後の動作print j.address、すなわち変数iのaddressの属性を印刷するが、私はコードを実行する際に異常が発生し、このaddressの属性が存在しないことを示唆し、直接変数jを印刷すれば解析アドレスをフィードバックすることができ、この具体的な原因はまだ不明である.
  • このDNSの解析時に新しいドメイン名www.a.shifen.comが現れ、インターネットで関連資料を調べたところ、digの追跡によりshifen.combaidu.comのサーバーが同じであることが判明し、具体的には(リンク)
  • を参照することができる.
    ②MX記録実現MX記録照会方法の例は、メールボックス解析用として上述したので、QQメールボックスを例に挙げます.
    # -*- coding: utf-8 -*-
    # @Software: PyCharm
    
    import dns.resolver
    domain = input('Input an domain')
    MX = dns.resolver.query(domain, 'MX')   #        MX  
    for i in MX:                            #       
        print('MX preference =', i.preference, 'mail exchanger =', i.exchange)

    実行結果は次のとおりです.
    >>> Please input a domain>? qq.com
    MX preference = 20 mail exchanger = mx2.qq.com.
    MX preference = 30 mail exchanger = mx1.qq.com.
    MX preference = 10 mail exchanger = mx3.qq.com.

    ここで、優先度のデフォルトはpreferenceであり、MXレコードは優先度を設定することによってプライマリ・セカンダリ・サーバの設定を実現することができ、「優先度」の数字が小さいほどレベルが高くなり、「優先度」はMXレコードにのみ有効である.
    ③NSレコードNSレコードサンプルコードは以下の通りである.
    # -*- coding: utf-8 -*-
    # @Software: PyCharm
    
    import dns.resolver
    domain = input('Input an domain')
    NS = dns.resolver.query(domain, 'NS')
    for i in NS.response.answer:
        for j in i.items:
            print(j.to_text())

    実行結果は次のとおりです.
    >>> Input an domain>? baidu.com
    dns.baidu.com.
    ns3.baidu.com.
    ns4.baidu.com.
    ns2.baidu.com.
    ns7.baidu.com.
    exchangeドメイン名サーバレコード.ドメイン名をどのサーバで解析するかを示すために使用します.ドメイン名を登録するとき、デフォルトの10があり、登録されたドメイン名はDNSドメイン名サーバによって解析されます.しかし、NS(Name Server)などの1級ドメイン名しか入力できないことに注意してください.DNS baidu.comのような2レベルおよびマルチレベルドメイン名はエラーです.
    ④CNAME記録CNAME記録照会コード例は以下の通りである.
    # -*- coding: utf-8 -*-
    # @Software: PyCharm
    import dns.resolver
    domain = input('Input an domain:')
    CNAME = dns.resolver.query(domain,'CNAME')
    for i in CNAME.response.answer:
        for j in i.items:
            print(j.to_text())

    実行結果は次のとおりです.
    >>> Input an domain:>? www.baidu.com
    www.a.shifen.com.

    また、上記のAレコードに登場するwww.baidu.comドメイン名が再び現れ、このドメイン名はwenku.baidu.comの別名指向であることが分かった.www.a.shifen.comの代わりにサブドメイン名を使用することに相当し、www.baidu.comが変化すると、ip の解析を1つずつ変更する必要がなく、サブドメイン名の解析を変更するだけでよいという利点がある.
    注意事項:
  • CNAMEのターゲットホストアドレスはホスト名のみ使用でき、ip は使用できません.
  • ホスト名には、ip などの他の接頭辞は許可されていません.
  • AレコードはCNAMEレコードよりも優先される.すなわち、ホストアドレスにAレコードとCNAMEレコードが同時に存在する場合、CNAMEレコードは有効にならない.