DNS 查询 - Domain Name Server
1 DNS 查询 - Domain Name Server 2 socket.getaddrinfo("www.baidu.com",None) 3 返回时一个 tuple list - (family, sockettype, protocol, canonname, socketaddr) 4 list 的没一个 tuple 元素是一个对应该 域名 host 的一个 web 服务器. 5 # [(<AddressFamily.AF_INET: 2>, 0, 0, '', ('61.135.169.125', 0)), 6 # (<AddressFamily.AF_INET: 2>, 0, 0, '', ('61.135.169.121', 0))] 7 8 反向查询 - IP 到 hostname 9 socket.gethostbyaddr(addr) 10 因为 DNS 信息的授权方式,返回查询得到数据可能是伪造的. 对于反向查询授权是基于IP地址的, 11 所以 DNS 的组织结构中没有办法阻止这种欺骗, 但是可以在程序中做一个反向查找数据的真实性验证: 12 首先方向查找根据 IP 得到一个 hostname , 然后使用反向查询得到的 hostname 做正向查询, 13 如果得到的 IP 跟之前方向查找所用的 IP 一致即反向查到到的 hostname 是真实的,否者就是伪造的. 14 由于正向 DNS 查询是的授权信息是基于域名服务器的, 所以正常查询的信息无法被伪造. 15 16 例子, 17 import sys, socket 18 19 def getips(hostname): 20 res = socket.getaddrinfo(hostname, None, 0, socket.SOCK_STREAM) 21 ips = [i[4][0] for i in res] 22 return ips 23 24 def gethostname(ip): 25 return socket.gethostbyaddr(ip)[0] 26 27 try: 28 IP = "" 29 hostname = gethostname(IP) 30 ips = getips(hostname) 31 except socket.herror as e: 32 print("Hostname not available for : %s" % IP) 33 print(e) 34 except socket.gaierror as e: # 询址错误 35 print("Hostname got : %s , however could not forward lookup the host with error : %S" % (hostname, str(e))) 36 37 if IP not in ips: 38 print("Forward check failed about hostname : %s with IP: %s" % (hostname,IP)) 39 else: 40 print("Validated hostname : %s " % hostname) 41 42 环境信息相关, 43 socket.gethostname() 44 本地的 hostname 45 socket.getfqdn(hostname) 46 通过 hostname 获得 full hostname 47 48 为了得到完整的域名和 IP 地址, 可以首先通过 gethostname() 方法获得 hostname, 49 接着 通过 getfqdn() 得到完成的信息 - full hostname. 最后使用 getaddrinfo() 50 来获得该域名对应的 IP 地址. 51 52 例子, 53 import sys, socket 54 def getips(hostname): 55 res = socket.getaddrinfo(hostname, None, 0, socket.SOCK_STREAM) 56 ips = [i[4][0] for i in res] 57 return ips 58 59 hostname = socket.gethostname() 60 print("hostname is : %s" % hostname) 61 fullhostname = socket.getfqdn(hostname) 62 print("full hostname is %s" % fullhostname) 63 try: 64 print("IP addrs :", ", ".join(getips(fullhostname))) 65 except socket.gaierror as e: 66 print("Could not get IP addr : ",e)