DNS反向查询

DNS反向查询是什么

DNS反向查询大概的一个定义就是:
从 IP 地址获取 PTR 记录。也就是说,经过使用一些网络工具能够将 IP 地址转换为主机名。 实际上,PRT 表明 POINTER,在 DNS 系统有惟一性,将 IP 地址与规范化的主机名联系起来。PTR 记录实际上是 NDS 系统的一部分,可是由专门的区域文件组成的,使用的是传统的 in-addr.arpa 格式。php

最简单的理解就是使用一个在线服务来查询一个IP对应的域名服务
html

原理就是 dig -x ippython

➜  ~ dig -x 192.30.252.153

...

;; ANSWER SECTION:
153.252.30.192.in-addr.arpa. 3505 IN	PTR	lb-192-30-252-153-iad.github.com.

...

反向查询的一个应用,是能够防止垃圾邮件,即验证发送邮件的IP地址,是否真的有它所声称的域名,若是反向查询和声称不一致,那么就能够认为有风险。git

注意:
反向查询是根据一个资源记录查询域名,不必定是IP。这个资源记录多是A记录,也多是CNAME记录或者MX记录(见“DNS开源服务器BIND最小配置详解”),而PTR记录用于从IP地址反查域名。github


DNS反向查询的使用场景

  • rDNS的最初用途:经过traceroute,ping和SMTP电子邮件的“Received:”跟踪标题字段进行网络故障排除,网站跟踪用户(特别是在Internet论坛上)等。服务器

  • 一种电子邮件反垃圾邮件技术:检查rDNS中的域名是否可能来自拨号用户,或动态分配的地址不太可能被合法邮件服务器使用。这些IP地址的全部者一般会为其分配通用的rDNS名称,例如“1-2-3-4-dynamic-ip.example.com”。一些反垃圾邮件过滤器假设来自这些地址的电子邮件多是垃圾邮件,并可能拒绝链接。网络

  • 向确认反向DNS(FCrDNS)验证能够建立验证的形式示出了域名的全部者,而且已经在给定IP地址的服务器的全部者之间的关系有效。虽然不是很正全面,但这种验证足够强大,常常用于白名单目的,由于垃圾邮件制造者和钓鱼者在使用僵尸计算机伪造域记录时一般没法实现前向验证。socket

  • 系统日志记录或监视工具一般会接收仅由IP地址指定的相关设备的条目。为了提供更多可用的数据,这些程序一般在写入日志以前执行反向查找,从而写入名称而不是IP地址。函数

从使用场景中也能发现这个技术点也是攻守双方博弈的战场,防守方经过反向查询来确认攻击方的信息,而攻击方为了隐藏本身的信息,也会让反向查询获得的域名并非真实的,由于攻击者会在反向查找的记录中插入伪造的数据,达到迷惑的做用。工具


实验

为了增强理解,我写了段py代码来帮助理解

import sys
import socket

try:
    # gethostbyaddr的做用是经过IPv4的地址来获取主机信息,并放在hostent结构体中
    result = socket.gethostbyaddr(sys.argv[1])

    # 显示查找到的主机名
    print("Primary hostname: " + result[0])

    # 显示还返回的可用地址列表
    print("Addresses: ")
    for item in result[2]:
        print("           " + item)
except socket.error as e:
    print("Failed to look up hostname:", e)

运行:查询 127.0.0.1 ,获得了域名

(python3) ➜  dns_anti_found python foundip.py 127.0.0.1      
Primary hostname: localhost
Addresses: 
           127.0.0.1

运行:查询百度的ip 115.239.211.110,发现是Unknown host

(python3) ➜  dns_anti_found python foundip.py 115.239.211.110
Failed to look up hostname: [Errno 1] Unknown host

我猜想,不是每个IP地址都存在反向的映射(事实上不少IP地址就没有对应的域名),后面查了一下,发现这个猜想是错误的,

手动在/etc/hosts下增长一下映射

发现域名能够查询出来了

查询网上资料以后,得出结论,要使用socket.gethostXxx( )函数,本地要有反向解析的服务。若是你使用的不是服务器,是没有反向解析服务的,若是你使用本地电脑,确定没有域名解析服服务。那么 本地的/etc/hosts就会提供DNS服务。你添加上记录,那么能查询出来,你没添加上去,那么就什么都没有,只能报错了。


参考

http://www.javashuo.com/article/p-ydbwqcdj-mp.html
https://www.dnsqueries.com/zh/reverse_lookup.php
https://blog.csdn.net/t_tzz/article/details/79779226