学习DNS查询
来源:互联网 发布:什么是网络优化 编辑:程序博客网 时间:2024/06/06 01:30
一。DNS的作用是把域名转换为IP地址。这样就不用记住很多的IP地址,只需要记住域名就行了。
通过这样简单的代码可以完成DNS查询:
#!/usr/bin/pythonimport sys,socketprint socket.getaddrinfo(sys.argv[1],None)[0][4]#返回了很多个元组,其中每个元组第五项是IP,这里只显示第一个元组的IP,返回的元组中的IP可能会重复,这是因为这个函数会根据不同的协议产生所有结果,在第四个参数加上socket.SOCK_STREAM代表IPv#4后就不会重复了。
一个简单的反向查找例子是这样的:
#!/usr/bin/pythonimport sys,socketdef gethost():'''get hostname'''try :result = socket.gethostbyaddr(sys.argv[1])except socket.herror ,e :print "Conldn't look up name:",e#print resultreturn result[0]def is_true(result):#我们需要对返回的域名做一次验证,因为我们反向查询的第一步是访问该IP,而该IP可以在自己的记录中把,这个IP伪装成其他域名。所以简单的正向验证一次是必要的。对于正向DNS,是从权威的.服务器开始的,一般不存在欺骗。
ip = socket.getaddrinfo(result,None)
# get All ip v4try :for x in ip:if x[4][0] == sys.argv[1]:return Trueelse:return Falseexcept socket.herror ,e :print "Conldn't get info:",er = gethost()if is_true(r):print relse:print "no"
三。小作用,获得环境信息,通常是域名
socket.getfqdn()或者socket.gethostname() 前者能提供更多信息。
四。下面是不使用自带的socket而是用PyDNS包来查询,它可以提供更多的信息,不只是IP和域名。
关于包的安装.查询类型。翻看Py网络编程P76.
下面是个小例子。我们先查询包含了Input(域名)的DNS服务器,我们指定了类型为NS,所以可以找到0个或1个权威的DNS服务器,它包含了Input或者是Input上一级域名(第一个点.后面的),我们通过这个DNS服务查找关于Input的所有信息,这样比直接在本地查可以获取更多的信息。因为本地cache信息可能不完整。
#!/usr/bin/pythonimport sys,DNSdef getdnsserverlist(qstring,qtype):#递归的找服务器的主函数。'''show the dns server list'''reqobj = DNS.Request();try:ansobj = reqobj.req(name = qstring, qtype = qtype)dnslist = [x['data'] for x in ansobj.answers if x['type']==qtype]except:dnslist = []if len(dnslist):return dnslistelse :remainder = qstring.split(".",1)if len(remainder) == 1:return Noneelse:return getdnsserverlist(remainder[1],qtype)def findnameservers(hostname):#在这里定义了我们要的类型是NS,就是域定义名称服务器return getdnsserverlist(hostname,DNS.Type.NS)def getrecord(qstring,qtype,dnslist):#在服务器上找关于Input的信息for dns in dnslist:reqobj = DNS.Request(server = dns)try:ans = reqobj.req(name = qstring,qtype = qtype).answersif len(ans):return ansexcept DNS.Base.DNSError:passreturn []def query(qstring,qtype,show = 1):dnslist = findnameservers(qstring)#找个服务器if dnslist == None:raise RuntimeError,"Could not find namesever to use."if show:print "Using nameservers:",",".join(dnslist)return getrecord(qstring,qtype,dnslist)if __name__ == '__main__':q = sys.argv[1]DNS.DiscoverNameServers()ans = query(q,DNS.Type.ANY)if not len(ans):print 'Not Found!'for item in ans:print "%-5s %s" % (item['typename'],item['data'])
参考资料:py网络编程第四章。
- 学习DNS查询
- DNS学习笔记之2 - DNS客户端的查询
- Python学习笔记--简单实现DNS查询
- linux命令行学习-dig(DNS查询器)
- 【学习笔记】计算机网络-DNS层次查询
- dns查询
- DNS查询
- DNS查询
- DNS查询
- DNS学习
- DNS学习
- DNS学习
- 如何进行DNS查询
- DNS查询原理总结
- DNS查询网站
- 关闭DNS查询功能
- DNS查询过程
- C#:DNS HostName查询
- Hibernate与 MyBatis的比较
- 将smartforms的输出结果另存为是PDF格式
- 在顺序存储模式下将所有的负数放到正数前面的三种算法
- Google莫斯科办公室里那个世界上最牛的程序员,这个程序员叫做Petr,他的感言...
- 【转】eclipse中禁用javadoc注释的Format功能
- 学习DNS查询
- unity3d GUI上显示3d模型
- fedora17修改启动模式
- adb Install安装错误常见列表
- 特殊IP地址(保留IP地址)介绍
- 如何成为一名优秀的web前端工程师
- 软件项目管理体系
- 监控linux 网络流量
- andrid 读取Word文件 (无格式)