DNS反向查询是什么

DNS反向查询大概的一个定义就是:

从 IP 地址获取 PTR 记录。也就是说,通过使用一些网络工具可以将 IP 地址转换为主机名。 实际上,PRT 代表 POINTER,在 DNS 系统有唯一性,将 IP 地址与规范化的主机名联系起来。PTR 记录其实是 NDS 系统的一部分,但是由专门的区域文件组成的,使用的是传统的 in-addr.arpa 格式。

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

原理就是 dig -x ip

➜  ~ 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地址,是否真的有它所声称的域名,如果反向查询和声称不一致,那么就可以认为有风险。

注意:

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

DNS反向查询的使用场景

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

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

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

  • 系统日志记录或监视工具通常会接收仅由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服务。你添加上记录,那么能查询出来,你没添加上去,那么就什么都没有,只能报错了。

参考

https://www.cnblogs.com/wunaozai/p/3753731.html

https://www.dnsqueries.com/zh/reverse_lookup.php

https://blog.csdn.net/t_tzz/article/details/79779226

DNS反向查询的更多相关文章

  1. DNS BIND配置 配置基本缓存服务器 DNS正向解析 DNS反向解析

    一. 缓存服务器配置 1.DNS:BIND    Berkeley Internet Name Domain    版本bind97: RPM服务器端包的名字  安装bind-libs    bind ...

  2. django ORM model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct

    版权归作者所有,任何形式转载请联系作者.作者:petanne(来自豆瓣)来源:https://www.douban.com/note/301166150/ 1.多表连接查询:感觉django太NX了. ...

  3. django xadmin多对多字段过滤(含filter的反向查询)

    要实现的功能: 继昨天实现拓展User模型使其得到其上级用户,今天要实现某些模型与用户多对多字段过滤功能. 功能描述:以用户指派功能为例,当前用户将文件指派给多个下级,修改前 程序会将所有用户都显示出 ...

  4. Django ORM 反向查询

    一/一对多反向查询   先定义两个模型,一个是A,一个是B,是一对多的类型. class A(models.Model): name= models.CharField('名称', max_lengt ...

  5. ORM查询之基于对象的正向查询与反向查询

    一.为什么有正向查询和反向查询? 举例有两张表,一张表叫书籍表,一张表叫出版社表,他们关系是一对多的关系,书籍是多,出版社是一,因为一本书应该只有一个出版社对应,而出版社可以有多本书对应. 那么在实际 ...

  6. ORM正向和反向查询

    表结构 from django.db import models # Create your models here.class Publisher(models.Model): id = model ...

  7. (19)模型层 -ORM之msql 跨表查询(正向和反向查询)

    基于对象的跨表查询 基于对象的跨表查询'''正向和反向查询'''# 正向 ----> 关联字段在当前表中,从当前表向外查叫正向# 反向 ---> 关联字段不在当前表中,当当前表向外查叫反向 ...

  8. ORM 创建manytomay的三种方法 反向查询 和一些 双下方法版学员管理系统3

    老师信息管理   三种创建多对对外键的方式常用第二种和第三种 思考 三种方式创建多对多外键方式及其优缺点. 外键的查询和使用 1外键的创建: 在数据库表中的表现形式 如何连表查询和使用 表里边:  s ...

  9. bbs项目中对反向查询和分组查询的具体的应用

    我的数据库是按照下面的图片的方式设计的 然后看下model中代码 class User(models.Model): uid = models.AutoField(primary_key=True) ...

随机推荐

  1. python django mkdir和makedirs的用法

    总结一下mkdir和makedirs的用法:      1.mkdir( path [,mode] )      作用:创建一个目录,可以是相对或者绝对路径,mode的默认模式是0777.      ...

  2. spring boot actuator监控需要注意的点

    1. /metrics接口提供的信息进行简单分类如下表: 分类 前缀 报告内容 垃圾收集器 gc.* 已经发生过的垃圾收集次数,以及垃圾收集所耗费的时间,适用于标记-清理垃圾收集器和并行垃圾收集器(数 ...

  3. Flask-install-python2.6

    命令: # 安装virtualenv $ sudo yum install python-setuptools $ sudo easy_install virtualenv OR sudo pip i ...

  4. 作为一个Java开发你用过Jib吗

    1. 前言 Jib是Google开发的可以直接构建 Java应用的Docker和OCI镜像的类库,以Maven和Gradle插件形式提供.它最骚操作的是可以在没有Docker守护程序的情况下构建,也就 ...

  5. Python3笔记015 - 3.6 空语句

    第3章 流程控制语句 3.6 空语句 # pass 占位符,暂时不做任何事情,方便后面补充功能 for i in range(1,10): if i%2 == 0: print(i, end = '' ...

  6. TJOI2013 奖学金—大根堆实现(洛谷P3963)

    奖学金 题目描述 小张学院有 \(c\) 名学生,第 \(i\) 名学生的成绩为 \(ai\) ​,要获得的奖学金金额为 \(bi\) . 要从这 \(c\) 名学生中挑出 \(n\) 名学生发奖学金 ...

  7. P3261 [JLOI2015]城池攻占 题解

    题目 小铭铭最近获得了一副新的桌游,游戏中需要用 \(m\) 个骑士攻占 \(n\) 个城池.这 \(n\) 个城池用 \(1\) 到 \(n\) 的整数表示.除 \(1\) 号城池外,城池 \(i\ ...

  8. POJ 3057 Evacuation 题解

    题目 Fires can be disastrous, especially when a fire breaks out in a room that is completely filled wi ...

  9. 【Python篇】工厂模式

    工厂方法模式 前言 在<设计模式>一书中工厂模式提到了: 工厂方法模式(Factory Method) 抽象工厂模式 (Abstract Factory) 但是在实际过程中还有一种工厂模式 ...

  10. U盘+grub2安装centos8实战

    1. U盘准备 这里的U盘也可以换成硬盘 grub2安装一直失败,怀疑U盘坏了,下面命令修复了一下 [root@host2 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE ...