什么是DNS的正向解析与反向解析?代码实现?

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)

### CentOS 7 中配置 DNS正向反向解析操作指南 #### 1. 软件安装 在 CentOS 7 系统中,可以通过 `yum` 命令来安装 Bind 其相关工具。执行以下命令完成软件包的安装: ```bash yum install -y bind bind-chroot bind-utils ``` 此命令会自动下载并安装必要的组件以支持 DNS 解析功能[^3]。 --- #### 2. 主配置文件编辑 主要的配置文件位于 `/etc/named.conf`。需要对其进行修改以便定义区域以及指定数据存储路径。 打开该文件后,在适当位置添加如下内容用于正向反向解析区声明: 对于 **正向解析**: ```plaintext zone "example.com" IN { type master; file "/var/named/example.com.zone"; }; ``` 对于 **反向解析**: ```plaintext zone "10.168.192.in-addr.arpa" IN { type master; file "/var/named/192.168.10.rev"; }; ``` 上述例子假设 IP 地址范围为 `192.168.10.x`,需根据实际环境调整数值。 --- #### 3. 创建 Zone 文件 创建对应的 zone 数据文件以保存记录条目信息。 ##### (a) 正向解析文件 (`example.com.zone`) 新建文件 `/var/named/example.com.zone` 并写入类似下面的内容: ```plaintext $TTL 86400 @ IN SOA ns1.example.com. admin.example.com. ( 2023101001 ; Serial 3600 ; Refresh 1800 ; Retry 604800 ; Expire 86400 ) ; Minimum TTL ; Name Servers IN NS ns1.example.com. IN NS ns2.example.com. ; A Records ns1 IN A 192.168.10.1 ns2 IN A 192.168.10.2 www IN A 192.168.10.3 mail IN A 192.168.10.4 ``` ##### (b) 反向解析文件 (`192.168.10.rev`) 同样建立 `/var/named/192.168.10.rev` 文件,填写如下结构的数据: ```plaintext $TTL 86400 @ IN SOA ns1.example.com. admin.example.com. ( 2023101001 ; Serial 3600 ; Refresh 1800 ; Retry 604800 ; Expire 86400 ) ; Minimum TTL IN NS ns1.example.com. IN NS ns2.example.com. 1 IN PTR ns1.example.com. 2 IN PTR ns2.example.com. 3 IN PTR www.example.com. 4 IN PTR mail.example.com. ``` 以上两份文档分别描述了域名到 IP 映射关系及其逆过程中的映射方式。 --- #### 4. 启动验证服务状态 完成所有前期准备工作之后,启动 Bind 服务并通过命令检测运行状况。 ```bash systemctl start named systemctl enable named ``` 利用 `nslookup` 或者 `dig` 工具可以初步检验是否能够成功查询目标主机名或者地址转换结果。例如: ```bash nslookup www.example.com dig @localhost -x 192.168.10.3 ``` 如果一切正常,则说明已经实现了预期的功能效果[^4]。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值