三、DNS记录类型

这里写图片描述

  • 在之前的文章中,我们了解了什么是DNS以及DNS如何工作,现在让我们来看看 DNS 记录有哪些种类,以及它们有什么作用。

  • 要理解不同的 DNS 记录,首先必须了解区域文件是什么?

区域文件(Zone files)

区域文件是名称服务器存储其所知道的域名的信息的方式。名称服务器知道的每个域名都存储在区域文件中。对于名称服务器来说,大多数请求都不能在它自己服务器中找到区域文件。

如果它被配置成可以递归查询,如解析名称服务器,那它会递归找到结果并返回。否则,它会告诉请求者方下一步到哪里查询。

名称服务器具有的区域文件越多,它能够权威回答的请求越多。

区域文件描述 DNS “区域”,其基本上是整个 DNS 命名系统的子集。它通常只配置一个域名。它可以包含多个记录,定义了该域名下的资源位置。

区域文件的$ORIGIN表示该区域最高等级的权威。
所以如果一个区域文件被配置为 “example.com” 域,$ORIGIN会被设置为 example.com

它配置在区域文件的顶部,或者可以在引用区域文件的 DNS 服务器的配置文件中定义。无论哪种方式,此参数描述区域将是什么等级的权威。

类似地,$TTL 配置它提供的信息的 “生存时间”。它基本上是一个计时器。高速缓存名称服务器可以使用先前查询的结果来回答问题,直到 TTL 值用完。

资源记录

ZONE file的资源记录(RR:Resource Record)的格式:

name [TTL] IN rr_type value

注意:
(1) TTL可从全局继承
(2) @可用于引用当前区域的名字
(3) 同一个名字可以通过多条记录定义多个不同的值;此时DNS服务器会以轮询方式响应
(4) 同一个值也可能有多个不同的定义名字;通过多个不同的名字指向同一个值进行定义;此仅表示通过多个不同的名字可以找到同一个主机

资源记录类型
rr_type,资源记录类型(RR:Resource Record)主要分为以下几种:
SOA记录(Start Of Authority record):起始授权记录
A 和 AAAA 记录(Adress record)
CNAME:(Canonical Name record)别名记录
MX 记录(Mail eXchange record)邮件交换器
NS 记录(Name Server record)专用于标明当前区域的DNS服务器
PTR 记录(PoinTer Record)全限定域名

下面详解一下各种记录类型:

SOA记录(Start Of Authority record)

起始授权记录,或者说是 SOA,这种记录是所有区域性文件中的强制性记录。它必须是一个文件中的第一个记录($ORIGIN$TTL 会在它之前指定)。它还是最难理解的一种记录。

开始权限记录的看起来像这样:

domain.com. 86400 IN SOA ns.domain.com. admin.domain.com. (
    2015042201  ;序列号
    2H          ;刷新时间
    10M         ;重试时间
    1W          ;过期时间
    1D          ;否定答案的TTL值
)

我们来解释一下各部分分别表示什么:

domain.com.:这是区域的根。这表明该区域文件用于 domain.com 域名。通常,你会看到这个用 @ 代替,它只是一个占位符,表示我们之前学到的 $ORIGIN 变量的内容。

IN SOA:"IN" 部分表示互联网(它会出现在许多记录中), IN 可以省略不写。 SOA 是表示这是开始权限记录。

ns1.domain.com.:这定义了该域的主名称服务器。名称服务器可以是主服务器或从服务器,如果配置了动态 DNS,就像这里,则一个服务器需要是 “主服务器”。如果你未配置动态 DNS,那么这只是你其中一个主名称服务器。

admin.domain.com.:这是这个区域文件管理员的邮箱地址。邮箱地址的 @ 这里用一个 . 代替。如果你的名字中也有 . 它会用 \ 代替。(比如 your.name@domain.com 变成 your\name.domain.com2015042201:这是区域文件的序列号。每次编辑区域文件时,必须增加此序列号以使区域文件能够正确传播。从服务器将检查主服务器的区域序列号是否大于它们在系统上的序列号。如果是,它请求新的区域文件,如果不是,它继续服务原始文件。

2h:这是区域的刷新间隔。这是从服务器向主服务器轮询检查区域文件是否变更之间等待的时间量。

10m:这是此区域的重试间隔。如果slave从机在刷新周期结束时无法连接到master主机,则它将等待此时间并重试轮询主机。

1w:这是到期时间。如果slave从服务器在此时间内无法与master主服务器联系,则它不再作为此区域的权威来源的返回响应,并停止对外提供服务。

1d:这是名称服务器在此文件中找不到所请求的名称时缓存找不到结果的时间量。
A 和 AAAA 记录(Adress record)

这两个记录都将主机映射到 IP 地址。 “A” 记录用于将主机映射到 IPv4 IP 地址,而 “AAAA” 记录用于将主机映射到 IPv6 地址。

这些记录的一般格式是:

host     IN      A       IPv4_address
host     IN      AAAA    IPv6_address

因为我们的 SOA 记录指出了我们的主服务器是 “ns1.domain.com”,而 “ns1.domain.com” 也是 “domain.com” 区域文件定义的,所以我们需要把它指向一个 IP 地址。

这条记录可能看起来像这样:

ns1     IN  A       111.222.111.222

请注意,我们不必提供全名。我们可以只给主机名,不需要 FQDN,然后 DNS 服务器会通过 $ORIGIN 补足其余部分。但是,我们也可以使用完整的 FQDN :

ns1.domain.com.     IN  A       111.222.111.222

大多数情况下,在这里你可以将你的 web 服务器定义为 “www”:

www     IN  A       222.222.222.222

我们还可以说明基本域解析到哪里。如下表示:

domain.com.     IN  A       222.222.222.222

我们还可以使用 “@” 来表示基本域名:

@       IN  A       222.222.222.222

我们还可以解析此域下未明确定义的任何内容到此服务器。可以使用 “*” 通配符:

*       IN  A       222.222.222.222

以上这些对于 AAAA 记录同样适用。

CNAME 记录(Canonical Name record)

CNAME 记录为您的服务器(由A或AAAA记录定义的名称)定义规范名称的别名。

例如,我们可以有一个 A 记录定义 “server1” 主机,然后使用 “www” 作为此主机的别名:

server1     IN  A       111.111.111.111
www         IN  CNAME   server1

请注意,这些别名会带来一些性能损失,因为它们需要对服务器进行额外的查询。大多数时候,通过使用附加的 A 或 AAAA 记录可以实现相同的结果。

推荐使用 CNAME 的一种情况是为当前区域之外的资源提供别名。

MX 记录(Mail eXchange record)

MX 记录用来定义用于域的邮件交换。这有助于电子邮件正确到达您的邮件服务器。

与许多其他记录类型不同的是,邮件记录通常不会将主机映射到某些内容,因为它们适用于整个区域。因此,他们通常看起来像这样:

IN  MX  10   mail.domain.com.

请注意,开头没有主机名。

还要注意,它还有一个额外的数字。如果定义了多个邮件服务器,这是帮助计算机决定发送邮件的服务器的首选项号。较低的数字具有较高的优先级。

MX 记录通常应指向由 A 或 AAAA 记录定义的主机,而不是由 CNAME 定义的主机。

所以,假设我们有两个邮件服务器。可以这样表示:

IN  MX  10  mail1.domain.com.
IN  MX  50  mail2.domain.com.
mail1   IN  A       111.111.111.111
mail2   IN  A       222.222.222.222

在这个例子中,”mail1” 主机是首选电子邮件交换服务器。

我们也可以这样写:

IN  MX  10  mail1
IN  MX  50  mail2
mail1   IN  A       111.111.111.111
mail2   IN  A       222.222.222.222
NS 记录(Name Server record)

此记录类型定义用于此区域的名称服务器。

你可能想知道,”如果区域文件放在名称服务器上,为什么它需要引用自身?”。DNS 如此成功的其中一个原因是它的多级缓存。在区域文件中定义名称服务器的一个原因是区域文件可能是另外一个名称服务器的缓存副本。至于其他原因,我们不在这里讨论。

与 MX 记录一样,它也有一些区域范围的参数,因此它们也不使用主机。一般来说,它们看起来像这样:

IN  NS     ns1.domain.com.
IN  NS     ns2.domain.com.

你应该在每个区域文件中至少定义两个名称服务器,以便在一个服务器出现问题时还能正确运行。如果只有一个名称服务器,大多数 DNS 服务器软件都会认为区域文件无效。

同样,把主机的 A 或者 AAAA 映射也包含记录中:

IN  NS     ns1.domain.com.
IN  NS     ns2.domain.com.
ns1     IN  A      111.222.111.111
ns2     IN  A      123.211.111.233

你还可以使用很多其他记录类型,但这些可能是你会遇到的最常见的类型。

PTR 记录(PoinTer Record)

PTR 记录用于定义与 IP 地址相关联的名称。 PTR 记录是 A 或 AAAA 记录的逆。 PTR 记录是唯一的,因为它们以 .arpa 根开始并被委派给 IP 地址的所有者。区域互联网注册管理机构(RIRs)管理 IP 地址到组织和服务提供商的指派。区域互联网注册管理机构包括 APNIC,ARIN,RIPE NCC,LACNIC 和 AFRINIC。

这里是一个 111.222.333.444 的 PTR 记录的示例:

444.333.222.111.in-addr.arpa.   33692   IN  PTR host.example.com.

我们可以看到地址是反的,而且ip后面加了一个特定的后缀.in-addr.arpa.。

IPv6 地址的这个 PTR 记录示例使用了 Google IPv6 DNS 服务器(2001:4860:4860::8888)的逆转形式的半字节格式。

8.8.8.8.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.6.8.4.0.6.8.4.1.0.0.2.ip6.arpa. 86400IN PTR google-public-dns-a.google.com.

dig 命令的 -x 参数可用于查找 IP 地址的反向 DNS 名称。

下面是一个 dig 命令的例子。+short 确保只输出反向 DNS 名称。

dig -x 8.8.4.4 +short

上述 dig 命令的输出将是该 IP 地址的 PTR 记录中的域名:

google-public-dns-b.google.com.

互联网上的服务器在日志中使用 PTR 记录,来做出明智的垃圾邮件处理决策,并显示​​其他设备上的易于阅读的详细信息。

最常用的电子邮件服务器将查找从其接收电子邮件的 IP 地址的 PTR 记录。如果源 IP 地址没有与其相关联的 PTR 记录,则发送的电子邮件可被视为垃圾邮件并被拒绝。PTR 中的 FQDN 与要发送的电子邮件的域名是否匹配并不重要,重要的是存在有效的 PTR 记录,具有对应的和匹配的前向 A 记录。

通常,互联网上的网络路由器会被赋予与其物理位置相对应的 PTR 记录。例如,你可能会在纽约市或芝加哥看到使用 “NYC” 或 “CHI”。这对于运行 traceroute 或者 MTR 来检查网络流量经过的路径很有用。

大多数提供专用服务器或 VPS 服务的提供商允许客户为其 IP 地址设置 PTR 记录。

注意: PTR 记录中的 FQDN 具有对应的和匹配的正向 A 记录是非常重要的。示例:111.222.333.444 有一条指向 server.example.com 的 PTR 记录,那 server.example.com 需要具有一条指向 111.222.333.444 的 A 记录。

总结

了解了不同类型的 DNS 记录以及它们的作用之后,你就可以根据需要选择不同的 DNS 记录。

不同的域名服务商提供了不一样的 DNS 记录的的配置方法,但是你理解了 DNS 记录的作用之后,配置对你来说就不是难事了。

`ZoneData` 类的实现通常会依赖于实际的数据格式和源。假设我们的测区数据是以某种地理坐标系统(如WGS84)下的边界点列表形式存储的,我们可以这样实现: ```cpp class ZoneData { protected: std::vector<GeoPoint> boundaryPoints; // 用一个GeoPoint对象表示边界点 // 其他可能需要的数据成员 public: // 构造函数 ZoneData() {} // 接口:自适应导入数据 bool importAdaptive(const std::string& filePath) { try { // 使用文件操作加载数据 std::ifstream file(filePath); if (!file.is_open()) { throw std::runtime_error("Failed to open file"); } // 解析边界点 while (std::getline(file, line)) { GeoPoint point(line); boundaryPoints.push_back(point); } file.close(); return true; } catch (const std::exception& e) { std::cerr << "Error importing data: " << e.what() << std::endl; return false; } } // 获取数据接口 const std::vector<GeoPoint>& getBoundaryPoints() const { return boundaryPoints; } // ... 其他可能的获取方法 }; ``` 在这个例子中,`GeoPoint`是一个简单的结构体或类,包含经纬度信息。`importAdaptive`方法尝试打开指定的文件,读取每一行解析成`GeoPoint`,然后将它们添加到`boundaryPoints`向量中。如果导入过程有任何错误,它会抛出异常。 注意,这只是一个基础示例,实际的`ZoneData`类可能需要处理更复杂的数据格式,如XML、JSON或数据库查询结果,并根据实际情况调整导入逻辑。此外,错误处理和性能优化也是重要考虑因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值