• DNS处理模块dnspython


    一、模块介绍

    dnspython 是Python实现的一个DNS工具包,支持几乎所有的记录类型,可以用于查询,传输并动态更新ZONE信息,同时支持TSIG(事务签名)验证消息和EDNS0(扩展DNS)。可以替代nslookup,dig等工具,轻松做到平台整合。

    二、模块安装

    pip3 install dnspython

    三、域名解析方法

    dnspython提供了大量的DNS处理方法,最常用的是域名查询。dnspython提供了一个DNS解析器类resolver,使用它的query方法来实现域名的查询功能。

    query(self,qname,rdtype=1,rdclass=1,tcp=False,source=None,raise_on_no_answer=True,source_port=0)

    qname为查询的域名,rdtype用来指定RR资源的类型:

    A记录:将主机名转换成IP地址
    MX记录:邮件交换记录,定义邮件服务器域名
    CNAME记录:别名记录,实现域名间的映射
    NS记录:标记区域的域名服务器及授权子域
    PTR记录:反向解析,与A记录相反,将IP转换为主机名
    SOA记录:一个起始授权区的定义

    四、常见域名解析示例

    上面说到了六种域名解析类型,不过我们常用的不过A、MX、NS、CNAME四种解析类型。

    ①A记录

    关于A记录的实例代码如下:

    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. 826 IN CNAME www.a.shifen.com.
    www.a.shifen.com. 241 IN A 180.101.49.12
    www.a.shifen.com. 241 IN A 180.101.49.11
    >>> for j in i.items:
    ...     print (j)
    ... 
    180.101.49.12
    180.101.49.11

    这样子我们就将www.baidu.com的域名解析出来了。

    除此之外,我们可以在调试窗口中看一下变量i是什么。

    www.baidu.com. 826 IN CNAME www.a.shifen.com.
    www.a.shifen.com. 241 IN A 180.101.49.12
    www.a.shifen.com. 241 IN A 180.101.49.11

    发现i中具有两个条目,对应我们输出的j值。

    ②MX记录

    实现MX记录查询方法示例,在上面提到了是用于邮箱解析的,所以我们以QQ邮箱为例。

    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值(优先级)和exchange值(交换地址),其中优先级默认为10,MX记录可以通过设置优先级实现主辅服务器设置,”优先级”中的数字越小表示级别越高,”优先级”仅对MX记录有效。

    ③NS记录

    NS记录示例代码如下:

    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.

    NS(Name Server)域名服务器记录。用来表明由哪台服务器对该域名进行解析。在注册域名时,总有默认的DNS服务器,每个注册的域名都是由一个DNS域名服务器来进行解析的。但是需要注意的是只能输入一级域名,如:baidu.com;对于二级以及多级域名,如www.baidu.com、wenku.baidu.com则是错误的。

    ④CNAME记录

    CNAME记录查询代码示例如下:

    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.a.shifen.com域名,这个域名就是www.baidu.com的别名指向。相当于用子域名来代替ip地址,优点是如果ip地址变化,只需要改动子域名的解析,而不需要逐一改变ip地址解析。

    五、注意事项:

    CNAME的目标主机地址只能使用主机名,不能使用IP地址;

    主机名前不能有任何其他前缀,如:http://等是不被允许的;

    A记录优先于CNAME记录。即如果一个主机地址同时存在A记录和CNAME记录,则CNAME记录不生效。

  • 相关阅读:
    zoj 2406 Specialized FourDigit Numbers
    hdu 1016 Prime Ring Problem(深度优先搜索)
    【ObjectiveC】08self关键字
    【ObjectiveC】09空指针和野指针
    【零基础学习iOS开发】【01前言】01开篇
    【零基础学习iOS开发】【01前言】03前景和难易度分析
    多线程编程1NSThread
    【零基础学习iOS开发】【02C语言】02第一个C语言程序
    多线程编程2NSOperation
    【零基础学习iOS开发】【01前言】02准备
  • 原文地址:https://www.cnblogs.com/liujunjun/p/13475161.html
Copyright © 2020-2023  润新知