python解析DNS记录

导语

最近项目用到 python 解析DNS记录,故将过程记录下来

常用解析记录

1.主机[A]记录

描述: 主机地址记录。在 DNS 域名与 IP 地址之间建立映射关系语法: owner class ttl A IP_v4_address 例子: host1.example.microsoft.com. IN A 127.0.0.1

2.别名[CNAME]

描述: 用来表示用在该区域中的其它资源记录类型中已指定名称的替补或别名 DNS 域名。语法: owner ttl class AFSDB subtype server_host_name 例子: aliasname.example.microsoft.com. AFSDB 1 truename.example.microsoft.com.

3.主机信息[HINFO]

描述: 用来说明映射到特定 DNS 主机名的 CPU 类型和操作系统类型的 RFC-1700 保留字符串类型,这个信息可以被应用程序通信协议使用。语法: owner ttl class HINFO cpu_type os_type 例子: my-computer-name.example.microsoft.com. HINFO INTEL-386 WIN32

4.邮箱[MB]

描述: 用来将指定的域邮箱名映射到这个邮箱的主机的当前区域中的主机地址记录语法: owner ttl class MB mailbox_hostname 例子: mailbox.example.microsoft.com. MB mailhost1.example.microsoft.com

5.邮箱或通信信息 MINFO

描述: 用来指定负责维护该记录中特定通信名单或邮箱的联系域邮箱名称。同时,还被用来指定接收与该记录中特定通信名单或邮箱有关的错误信息的邮箱语法: owner ttl class MINFO responsible_mailbox error_mailbox 例子: administrator.example.microsoft.com. MINFO resp-mbox.example.microsoft.com err-mbox.example.microsoft.com

6.邮件交换器 [MX]

描述: 用来向特定邮件交换器提供消息路由,该主机作为指定 DNS 域名的邮件交换器。MX 记录需要一个16-位整数来表示消息路由中的主机优先级,多个邮件交换在消息一中被指定。对于这个记录类型中的每个邮件交换主机,需要一个相应的主机地址类型记录。语法: owner ttl class MX preference mail_exchanger_host 例子: example.microsoft.com. MX 10 mailserver1.example.microsoft.com

7.指针记录 [PTR]

描述:用来指向域名空间中的某个位置。PTR记录通常在特殊域中来执行地址到名称镜像的反向搜索。每个记录提供要指向域名称空间的某个其它位置的简单数据。 Syntax: owner ttl class PTR targeted_domain_name 例子: 1.0.0.10.in-addr.arpa. PTR host.example.microsoft.com.

8.服务记录 [SRV]

描述: SRV 资源记录允许管理员使用单一 DNS 域的多个服务器,容易的用管理功能将 TCP/IP 服务从一个主机移到另一个主机,并且将服务提供的程序主机分派为服务的主服务器,将其它的分派为辅助的语法: service.protocol.name ttl class SRV preference weight port target 例子: ldap.tcp.ms-dcs SRV 0 0 389 dc1.example.microsoft.com SRV 10 0 389 dc2.example.microsoft.com

9.已知服务记录 [WKS]

描述: 用来描述一个特定 IP 地址上特定通讯协议支持的 TCP/IP 服务,它提供 TCP 和 UDP 可使用性信息。如果服务器同时支持 TCP 和 UDP 的已知服务,或者有多个支持服务的 IP 地址,多个 WKS 记录会被使用语法: owner ttl class WKS address protocol service_list 例子: example.microsoft.com. WKS 10.0.0.1 TCP ( telnet smtp ftp )   在"起始颁发机构" SOA 中,记录了这个 Zone 中 DNS 服务器是那一台主机,也记录着负责本 zone 的管理员的邮件地址,如果以后在安装邮件服务器需要修改该信息时,注意将邮件地址中的 “@” 符改为句点 “.” ,因为 “@” 是保留字,代表 zone;另外,要使用域完整名称 FQDN,不要漏掉最后的句点。可以通过 "zone→属性→起始颁发机构"对管理员邮件地址进行修改。

dnspython库

如果查询不到对应的结果报dns.resolver.NoAnswer错误:

dns.resolver.NoAnswer: The DNS response does not contain an answer to the question: baidu.com. IN XXX

可以使用如下:

try:
    re = dns.resolver.query(qname,rdtype)
except dns.resolver.NoAnswer:
   XXXX

解析 A记录

'''
如果不知道返回的Re 结果怎么取值, 
可以通过 print(re.__dict__) 查看返回结果的内置对象
或者print(dir(re))
'''

import dns

if __name__ == '__main__':
    re = dns.resolver.query("www.bai.com","A")

    print(re.__dict__)
    print("{:-^50s}".format("华丽的分割线1"))
    for i in re.rrset:
         print(i)
    print("{:-^50s}".format("华丽的分割线2"))
    for i in re.response.answer:
        for j in i.items:
            print(j.to_text())
'''
output:

{'qname': <DNS name baidu.com.>, 'rdtype': 1, 'rdclass': 1, 'response': <DNS message, ID 22745>, 'canonical_name': <DNS name baidu.com.>, 'rrset': <DNS baidu.com. IN A RRset>, 'expiration': 1637812232.3766685}
---------------------华丽的分割线1----------------------
220.181.38.148
220.181.38.251
---------------------华丽的分割线2----------------------
220.181.38.148
220.181.38.251
'''

解析 CNAME记录

import dns

if __name__ == '__main__':
    re = dns.resolver.query("www.baidu.com",'CNAME')
    print(re.__dict__)
    print("{:-^50s}".format("华丽的分割线1"))
    for i in re.rrset:
         print(i.to_text().replace('\"',''))
    print("{:-^50s}".format("华丽的分割线2"))
    for i in re.response.answer:
        for j in i.items:
            print(j.to_text())
    print("{:-^50s}".format("华丽的分割线3"))
    for i in re:
        print(i.to_text())
'''
output: 

{'qname': <DNS name www.baidu.com.>, 'rdtype': 5, 'rdclass': 1, 'response': <DNS message, ID 21322>, 'canonical_name': <DNS name www.baidu.com.>, 'rrset': <DNS www.baidu.com. IN CNAME RRset>, 'expiration': 1637813064.512025}
---------------------华丽的分割线1----------------------
www.a.shifen.com.
---------------------华丽的分割线2----------------------
www.a.shifen.com.
---------------------华丽的分割线3----------------------
www.a.shifen.com.
'''

解析 MX记录

import dns

if __name__ == '__main__':
    re = dns.resolver.query("baidu.com","MX")
    print(re.__dict__)
    print("{:-^50s}".format("华丽的分割线1"))
    for i in re.rrset:
         print(i)
    print("{:-^50s}".format("华丽的分割线2"))
    for i in re.response.answer:
        for j in i.items:
            print(j.to_text())
    print("{:-^50s}".format("华丽的分割线3"))
    for i in re:
        print('MX preference =', i.preference, 'mail exchanger =', i.exchange)
        
'''
output:
{'qname': <DNS name baidu.com.>, 'rdtype': 15, 'rdclass': 1, 'response': <DNS message, ID 47237>, 'canonical_name': <DNS name baidu.com.>, 'rrset': <DNS baidu.com. IN MX RRset>, 'expiration': 1637817511.307147}
---------------------华丽的分割线1----------------------
20 mx1.baidu.com.
15 mx.n.shifen.com.
20 mx50.baidu.com.
20 usmx01.baidu.com.
20 jpmx.baidu.com.
10 mx.maillb.baidu.com.
---------------------华丽的分割线2----------------------
20 mx1.baidu.com.
15 mx.n.shifen.com.
20 mx50.baidu.com.
20 usmx01.baidu.com.
20 jpmx.baidu.com.
10 mx.maillb.baidu.com.
---------------------华丽的分割线3----------------------
MX preference = 20 mail exchanger = mx1.baidu.com.
MX preference = 15 mail exchanger = mx.n.shifen.com.
MX preference = 20 mail exchanger = mx50.baidu.com.
MX preference = 20 mail exchanger = usmx01.baidu.com.
MX preference = 20 mail exchanger = jpmx.baidu.com.
MX preference = 10 mail exchanger = mx.maillb.baidu.com.
'''

解析 NS记录

import dns

if __name__ == '__main__':
    re = dns.resolver.query("baidu.com","NS")
    print(re.__dict__)
    print("{:-^50s}".format("华丽的分割线1"))
    for i in re.rrset:
         print(i)
    print("{:-^50s}".format("华丽的分割线2"))
    for i in re.response.answer:
        for j in i.items:
            print(j.to_text())
    print("{:-^50s}".format("华丽的分割线3"))
    for i in re:
        print(i.to_text())

'''
output:

{'qname': <DNS name baidu.com.>, 'rdtype': 2, 'rdclass': 1, 'response': <DNS message, ID 64405>, 'canonical_name': <DNS name baidu.com.>, 'rrset': <DNS baidu.com. IN NS RRset>, 'expiration': 1637815874.9459918}
---------------------华丽的分割线1----------------------
dns.baidu.com.
ns4.baidu.com.
ns3.baidu.com.
ns7.baidu.com.
ns2.baidu.com.
---------------------华丽的分割线2----------------------
dns.baidu.com.
ns4.baidu.com.
ns3.baidu.com.
ns7.baidu.com.
ns2.baidu.com.
---------------------华丽的分割线3----------------------
dns.baidu.com.
ns4.baidu.com.
ns3.baidu.com.
ns7.baidu.com.
ns2.baidu.com.

Process finished with exit code 0

'''

解析 DMARC 记录


import dns

if __name__ == '__main__':
    re = dns.resolver.query("_dmarc."+"google.com","TXT")
    print(re.__dict__)
    print("{:-^50s}".format("华丽的分割线1"))
    for i in re.rrset:
         print(i.to_text().replace('\"',''))
    print("{:-^50s}".format("华丽的分割线2"))
    for i in re.response.answer:
        for j in i.items:
            print(j.to_text())
    print("{:-^50s}".format("华丽的分割线3"))
    for i in re:
        print(i.to_text())
        
'''
output:
---------------------华丽的分割线1----------------------
v=DMARC1; p=reject; rua=mailto:mailauth-reports@google.com
---------------------华丽的分割线2----------------------
"v=DMARC1; p=reject; rua=mailto:mailauth-reports@google.com"
---------------------华丽的分割线3----------------------
"v=DMARC1; p=reject; rua=mailto:mailauth-reports@google.com"
'''
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值