DNS采用C/S机制。实现域名与IP地址转换。DNS服务器用于存储资源记录并提供名称查询服务,DNS客户端也称解析程序,用来插叙服务器并获取名称解析信息。

正向解析与反向解析

按照DNS查询目的,可将DNS解析分为以下两种类型。

  • 正向解析
    在这里插入图片描述

根据计算机的DNS名称(即域名)解析出相应的IP地址。

大部分DNS解析都是正向解析,即根据DNS域名查询对应的IP地址及其他相关信息。正向解析又称标准查询。正向解析记录存储在正向解析区域文件中。

  • 反向解析
    在这里插入图片描述

根据计算机的IP地址解析其DNS名称,多用来为服务器进行身份验证。

有时我们也会用到反向解析,即通过IP地址查询对应的域名,最典型的就是判断IP地址所对应的域名是否合法。由于反向解析的特殊性,RFC 1304规定了固定格式的反向解析区域后缀格式in-addr.arpa

与DNS名称不同,当IP地址从左到右读时,它们是以相反的方式解释的,所以对每个8位字节值需要使用域的反序,因此建立 in-addr-arpa

反向解析区域文件与正向解析区域文件格式相同,只是其主要内容是用于建立IP地址到DNS域名的转换记录,即PTR资源指针记录。PTR资源指针记录和A资源记录正好相反,它是将IP地址解析成DNS域名的资源记录。

域名解析的具体过程

域名系统 (DNS) 旨在将主机名解析为 IP 地址。 将名称解析为 IP 地址的过程称为“正向解析”。 DNS 树被组织成一个倒置的树结构,地址的最不具体的部分在顶部,地址的最具体的部分在底部。
在这里插入图片描述
我们知道DNS服务器里面有两个区域,即“正向查找区域”和“反向查找区域”,正向查找区域就是我们通常所说的域名解析,反向查找区域即是所说的IP反向解析,我们下面来解析上图的域名解析过程。

  • 当客户机提出查询请求时,首先在本地计算机的缓存中查找。如果在本地无法获得查询信息,则将查询请求发给DNS服务器。
  • 首先客户机将域名查询请求发送到本地DNS服务器,当本地DNS服务器接到查询后,首先在该服务器管理的区域的记录中查找,如果找到该记录,则利用此记录进行解析;如果没有区域信息可以满足查询要求,服务器在本地的缓存中查找。
  • 如果本地服务器不能在本地找到客户机查询的信息,将客户机请求发送到根域名DNS服务器。
  • 根域名服务器负责解析客户机请求的根域部分,它将包含下一级域名信息的DNS服务器地址返回给客户机的DNS服务器地址。
  • 客户机的DNS服务器利用根域名服务器解析的地址访问下一级DNS服务器,得到再下一级域我的DNS服务器地址。
  • 按照上述递归方法逐级接近查询目标,最后在有目标域名的DNS服务器上找到相应IP地址信息。
  • 客户机的本地DNS服务器将递归查询结果返回客户机。
  • 客户机利用从本地DNS服务器查询得到的IP访问目标主机,就完成了一个解析过程。

正向解析可以通过主机名获取其对应的广域网IP地址,使用 nslookup 命令在 Linux上输入

nslookup 【domain】

在这里插入图片描述

从返回的信息中可以看到正向解析的结果。

如何做反向DNS?

我们可以通过命令来执行反向 DNS 查找

1、使用 nslookup 命令
2、使用 dig 命令
3、使用 rDNS 查找工具

反向 DNS 查找命令

nslooup命令
nslookup最简单的用法是查询域名对应的IP地址,也可以使用IP地址查找域名,例如:

nslookup [ip_address]

在这里插入图片描述

使用nslookup可以输出返回指定 IP 地址的域名

由于在域名系统中,一个IP地址可以对应多个域名,因此从IP出发去找域名,理论上应该遍历整个域名树,但这在Internet上是不现实的。为了完成逆向域名解析,系统提供一个特别域,该特别域称为逆向解析域in-addr.arpa。

在这里插入图片描述
在 IPv6 中,PTR 记录将 rDNS 条目存储.ip6.arpa 域中,而不是 .in-addr.arpa

dig命令

Linux下解析域名除了使用nslookup之外,还可以使用dig命令来解析域名,dig命令可以得到更多的域名信息。

dig命令是一个用于询问 DNS 域名服务器的灵活的工具。常见使用:

dig -x [ip_address]

更多关于dig命令,可以查找man手册。
在这里插入图片描述

dig -x 8.8.8.8

在这里插入图片描述
输出显示指定 IP 地址的域名

DNS反向解析实现

int main(int argc, char* argv[]) 
{

	int ret = 0;
	DNS_QUERY query;

	/* 只接受一个命令行参数  */
	if (argc != 2 || (argc == 2 && argv[1][0] == '-')) 
	{
		fprintf(stderr, "usage: %s [DOMAIN | IP]\n\n", argv[0]);
		return -1;
	}

	/* 从传递的域(或 IP)创建 DNS_QUERY */
	query = createQuery(argv[1]);

	/* DNS 查询的十六进制转储  */
	printf("\nDNS Query (%i bytes):\n", query.len);
	if (query.len == 0)
		return -1;
	
	hexDump(query.bytes, query.len);

	ret = dnsLookup(&query);
	if (ret == -1)
	{
		printf("dnsLookup fail!!!\n");
		return -1;
	}
	printf("\n");

	return 0;
}

编译运行
在这里插入图片描述

总结

反向 DNS 是从 IP 地址对域名的 DNS 查找。 常规 DNS 请求从域名解析 IP 地址,而 rDNS 则相反,因此名称相反。

域名是为了方便记忆而专门建立的一套地址转换系统,要访问一台互联网上的服务器,最终还必须通过IP地址来实现,域名解析就是将域名重新转换为IP地址的过程。这一过程通过域名解析系统DNS来完成。

欢迎关注微信公众号【程序猿编码】,需要DNS反向源码的添加本人微信号(c17865354792)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐