本地DNS服务器

news/2024/11/23 16:04:22/

小菜鸡第一次拿python做作业
实现了一个简易的local dns server
使用迭代的方法
毫无注释,只对本部分网址有效
基于UDP
需要使用dig测试

  • 迭代原理图:
    在这里插入图片描述
    在这里插入图片描述
  • DNS 信息结构:
    在这里插入图片描述
    在这里插入图片描述

localDNS.py

# -*- coding: UTF-8 -*-import socket
import dnslibdef local_DNS_Server():# List of records about the domain name and IPv4 address of Root DNS servers.root_DNS_servers=[["A.root-servers.net",'198.41.0.4'],["B.root-servers.net",'192.228.79.201'],["C.root-servers.net",'192.33.4.12'],["D.root-servers.net",'128.8.10.90'],["E.root-servers.net",'192.203.230.10'],["F.root-servers.net",'192.5.5.241'],["G.root-servers.net",'192.112.36.4'],["H.root-servers.net",'128.63.2.53'],["I.root-servers.net",'192.36.148.17'],["J.root-servers.net",'192.58.128.30'],["K.root-servers.net",'193.0.14.129'],["L.root-servers.net",'198.32.64.12'],["M.root-servers.net",'202.12.27.33'],]print("========================================================================\nList of root dns servers:")for root in root_DNS_servers:print(root[0] + "  " + root[1])print("===========================================")# Maintain a cache here.# cache[qname]=responseMessagecache = {}while True:  # Keep the local dns server working.serverSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)serverSocket.bind(('127.0.0.1', 12000))message, clientAddress = serverSocket.recvfrom(2048)# Parse DNS packet data and return DNSRecord instance.message_parse = dnslib.DNSRecord.parse(message)message_parse.header.set_rd(0)message = dnslib.DNSRecord.pack(message_parse)# Judge whether the query is already in the cache.if message_parse.q.qname in cache:responseMessage = cache[message_parse.q.qname]serverSocket.sendto(responseMessage, clientAddress)else:# Split the qname into ['com.', 'baidu.', 'www.']qname = str(message_parse.q.qname);qnamelist = qname.split(".")qnamelist.pop(len(qnamelist) - 1)  # ['www', 'baidu.', 'com']for i in range(0, len(qnamelist)):qnamelist[i] = qnamelist[i] + "."qnamelist.reverse()  # ['com.', 'baidu.', 'www.']# Select a root server from 13 root_DNS_servers randomly to begin the iteration.# I select ["A.root-servers.net",'198.41.0.4'] here.a = "A.root-servers.net"domain = ""# Do iterations, take www.baidu.com as an example:# 1. domain='com.' 2. domain='baidu.com' 3.domain='www.baidu.com'for i in qnamelist:domain = i + domainr = dnslib.DNSRecord.question(domain, qtype="NS")rr = r.send(a)res = dnslib.DNSRecord.parse(rr)# print(res)# print("==============================================")a = res.auth[0].rdata.__str__()domain = str(res.rr[0].rdata)r = dnslib.DNSRecord.question(domain, qtype="A")rr = r.send(a)res1 = dnslib.DNSRecord.parse(rr)# print(res1)# Get Answer list, for example and then add these answers to response packet:# ;; ANSWER SECTION:# www.a.shifen.com.       300     IN      A       14.215.177.38# www.a.shifen.com.       300     IN      A       14.215.177.39rrlist = res1.rrfor i in rrlist:res.rr.append(i)# Modify some parameters of response packetsres.header.id = message_parse.header.id  # Set the id of response packet same with query packet. (dig)res.header.ra = 1res.q.qtype = 1 # Type"A"# Clear the AUTHORITY SECTION and ADDITIONAL SECTION to make the response packet simpler.res.auth = []res.ar = []print("===========================================\n response packet:")print(res)# Send the response packet back to the terminal.serverSocket.sendto(res.pack(), clientAddress)# Add the response packet into the cache.cache[message_parse.q.qname] = res.pack()if __name__ == '__main__':# dig @127.0.0.1 -p 12000 www.baidu.com# dig @127.0.0.1 -p 12000 www.sohu.comtry:local_DNS_Server()except KeyboardInterrupt:pass
  • 测试:
    在这里插入图片描述
    在这里插入图片描述

  • pychram 结果:

  • 在这里插入图片描述
    在这里插入图片描述

  • 写在最后:
    花这么大力气来写,dns.resolver 他不香吗?


http://www.ppmy.cn/news/551901.html

相关文章

公共DNS服务器IP地址

DNS(Domain Name System),即域名系统,在因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主…

初始DNS服务器地址是哪里来的?

DNS 是互联网中非常重要的一个系统。任何主机、设备,要想访问网络,几乎都需要先通过 DNS 服务器,查询主机的 IP 地址,然后才能与目标主机通信。通常情况下,我们都是无需为主机或设备设置 DNS 服务器地址的,…

微软自带dns服务器,win10微软设置哪个DNS服务器地址最快

win10微软设置哪个DNS服务器地址最快?DNS服务器作为我们访问网站的中转站,我们访问其他网站的IP地址都离不开它的指引,一个好的DNS服务器能够帮助你迅速的找到你想要的访问地址,减少向上级调取数据的时间。下面小编就为大伙儿详细介绍哪个DN…

DNS (Domain Name Server) 域名服务器

DNS 是进行域名和与之对应 IP地址转换的服务器。 DNS 是靠什么进行解析的呢? 在浏览器输入域名后的解析过程 : 浏览器先去本身缓存中找 该DNS的解析记录, 有就直接返回,没有则去寻找操作系统中(hosts文件)是否有记录&…

北京上网首选DNS服务器地址,北京最快的DNS服务器地址,北京DNS大全

为了提高北京上网用户打开网页的速度,北京上网用户要选择适合北京网络的DNS,很多时候北京上网用户在家或者在办公室上网,经常发现能够上网,但很多的网站和网址打不开,报解析错误,这种情况往往是属于您的DNS…

免费公共DNS服务器IP地址大全

国内常用公共DNS 114 DNS: (114.114.114.114;114.114.115.115) 114DNS安全版 (114.114.114.119;114.114.115.119) 114DNS家庭版 (114.114.114.110;114.114.115.110&am…

dns服务器ip地址 常用列表

目录 国内外公共DNS服务器IP地址大全 全国各地电信DNS服务器IP地址大全 全国各地联通DNS服务器IP地址大全 全国各地移动DNS服务器IP地址大全 什么是DNS服务器? 国内外公共DNS服务器IP地址大全 名称国内外公共DNS服务器IP大全114 DNS114.114.114.114114.114.11…

DNS域名服务及常用国内DNS服务器地址

DNS域名服务 DNS服务器分类 缓存域名服务器 也称为高速缓存服务器通过向其他域名服务器查询获得域名 -> IP 地址记录将域名查询结果缓存到本地,提高重复查询时的速度 主域名服务器 特定 DNS 区域的官方服务器,具有唯一性负责维护该区域内所有域名…