Python DNS解析之pydns/py3dns使用文档

由于工作中需要解析大量域名,获取DNS解析记录信息,于是找到了pydns库,此第三方库支持DNS解析,但是发现缺乏相关文档,特此整理了pydns/py3dns的使用文档。

前提

在此之前,你可能需要回顾下DNS有关基础知识,特别是域名相关解析记录类型,如下:

A记录: 将域名指向一个IPv4地址(例如:100.100.100.100),需要增加A记录

CNAME记录: 如果将域名指向一个域名,实现与被指向域名相同的访问效果,需要增加CNAME记录。这个域名一般是主机服务商提供的一个域名

MX记录: 建立电子邮箱服务,将指向邮件服务器地址,需要设置MX记录。建立邮箱时,一般会根据邮箱服务商提供的MX记录填写此记录

NS记录: 域名解析服务器记录,如果要将子域名指定某个域名服务器来解析,需要设置NS记录

TXT记录: 可任意填写,可为空。一般做一些验证记录时会使用此项,如:做SPF(反垃圾邮件)记录

AAAA记录: 将主机名(或域名)指向一个IPv6地址(例如:ff03:0:0:0:0:0:0:c1),需要添加AAAA记录

SRV记录: 添加服务记录服务器服务记录时会添加此项,SRV记录了哪台计算机提供了哪个服务。格式为:服务的名字.协议的类型(例如:_example-server._tcp)。

SOA记录: SOA叫做起始授权机构记录,NS用于标识多台域名解析服务器,SOA记录用于在众多NS记录中那一台是主服务器

PTR记录: PTR记录是A记录的逆向记录,又称做IP反查记录或指针记录,负责将IP反向解析为域名

显性URL转发记录: 将域名指向一个http(s)协议地址,访问域名时,自动跳转至目标地址。例如:将www.liuht.cn显性转发到www.itbilu.com后,访问www.liuht.cn时,地址栏显示的地址为:www.itbilu.com。

隐性UR转发记录L: 将域名指向一个http(s)协议地址,访问域名时,自动跳转至目标地址,隐性转发会隐藏真实的目标地址。例如:将www.liuht.cn显性转发到www.itbilu.com后,访问www.liuht.cn时,地址栏显示的地址仍然是:www.liuht.cn。

DNS默认端口为:53

DNS同时支持UDP和TCP协议,但一般情况下使用的都是UDP协议,关于协议的使用场景,可阅读:https://draveness.me/whys-the-design-dns-udp-tcp

好的,了解了DNS的基础知识,下面我们开始介绍pydns的使用方法

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Python 编写一个 DNS 服务器,你可以使用 `dnspython` 来处理 DNS 请求和响应。以下是一个简单的示例: 首先,确保你已经安装了 `dnspython` ,可以使用以下命令进行安装: ``` pip install dnspython ``` 然后,创建一个 Python 脚本(例如 `dns_server.py`),并使用以下代码编写 DNS 服务器: ```python import dns.message import dns.resolver import dns.query from dnslib import DNSRecord, QTYPE def handle_dns_request(data): request = DNSRecord.parse(data) qname = str(request.q.qname) qtype = request.q.qtype # 查询真实的 DNS 服务器 resolver = dns.resolver.Resolver() response = resolver.query(qname, qtype) # 构建 DNS 响应 dns_response = DNSRecord(DNSHeader(id=request.header.id, qr=1, aa=1, ra=1), q=request.q) for answer in response: rrtype = QTYPE[answer.rdtype] dns_response.add_answer(RR(qname, getattr(QTYPE, rrtype), rdata=RDMAP[rrtype](answer.to_text()))) return dns_response.pack() # DNS 服务器地址和端口 server_address = '127.0.0.1' server_port = 53 # 创建 UDP socket 并监听指定地址和端口 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind((server_address, server_port)) print(f"DNS server is running on {server_address}:{server_port}...") while True: data, addr = sock.recvfrom(1024) # 处理 DNS 请求 response_data = handle_dns_request(data) # 发送 DNS 响应 sock.sendto(response_data, addr) ``` 这个示例使用了 `dnspython` 和 `dnslib` 来处理 DNS 请求和响应。它接收来自客户端的 DNS 请求,并将其转发到真实的 DNS 服务器上进行查询,然后将查询结果返回给客户端。 请注意,上述示例仅提供了一个基本的框架,你可能需要根据实际情况做出适当的修改和扩展。例如,添加错误处理、缓存功能等。 运行上述脚本后,你可以将你的计算机的 DNS 设置为 `127.0.0.1`,以便使用你编写的 DNS 服务器进行域名解析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值