学习DNS查询

一。DNS的作用是把域名转换为IP地址。这样就不用记住很多的IP地址,只需要记住域名就行了。

通过这样简单的代码可以完成DNS查询:

#!/usr/bin/python
import sys,socket
print socket.getaddrinfo(sys.argv[1],None)[0][4]#返回了很多个元组,其中每个元组第五项是IP,这里只显示第一个元组的IP,返回的元组中的IP可能会重复,这是因为这个函数会根据不同的协议产生所有结果,在第四个参数加上socket.SOCK_STREAM代表IPv#4后就不会重复了。


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

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

#!/usr/bin/python
import sys,socket
def gethost():
	'''
	get hostname
	'''
	try :
		result = socket.gethostbyaddr(sys.argv[1])
	except socket.herror ,e :
		print "Conldn't look up name:",e
#	print result
	return result[0]
def is_true(result):#我们需要对返回的域名做一次验证,因为我们反向查询的第一步是访问该IP,而该IP可以在自己的记录中把,这个IP伪装成其他域名。所以简单的正向验证一次是必要的。对于正向DNS,是从权威的.服务器开始的,一般不存在欺骗。
	ip = socket.getaddrinfo(result,None)
	# get All ip v4
	try :
		for x in ip:
			if x[4][0] == sys.argv[1]:
				return True
		else:
			return False
	except socket.herror ,e :
		print "Conldn't get info:",e
	
r = gethost()
if is_true(r):
	print r
else:
	print "no"

三。小作用,获得环境信息,通常是域名

socket.getfqdn()或者socket.gethostname()  前者能提供更多信息。



四。下面是不使用自带的socket而是用PyDNS包来查询,它可以提供更多的信息,不只是IP和域名。

关于包的安装.查询类型。翻看Py网络编程P76.

下面是个小例子。我们先查询包含了Input(域名)的DNS服务器,我们指定了类型为NS,所以可以找到0个或1个权威的DNS服务器,它包含了Input或者是Input上一级域名(第一个点.后面的),我们通过这个DNS服务查找关于Input的所有信息,这样比直接在本地查可以获取更多的信息。因为本地cache信息可能不完整。


#!/usr/bin/python
import sys,DNS
def 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 dnslist
	else :
		remainder = qstring.split(".",1)
		if len(remainder) == 1:
			return None
		else:
			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).answers
			if len(ans):
				return ans
		except DNS.Base.DNSError:
			pass
	return []

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值