学习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后就不会重复了。


二。反向DNS是用来将IP地址转换成域名的,反向的用处在于你能大概知道哪些主机访问了你的服务器,这对于服务器的安全是有意义的。

一个简单的反向查找例子是这样的:

#!/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网络编程第四章。


原创粉丝点击