DNS 基础知识
DNS
DNS (Domain Name Service) 将域名地转换成 IP 地址,熟知端口为 53
DNS 相关概念
DNS VIEW (DNS 视图)
视图基本概念
View 是 DNS 服务器的一个高级特性,用于根据查询请求的来源或其他条件,每个视图可以包含自己的区域配置、访问控制列表(ACL)以及响应策略,为同一个域名提供不同的 DNS 响应。它是通过将不同的 view 与特定的条件匹配来实现的。
视图用途
以下是 view 的主要作用和常见应用场景(以开源 DNS 软件 BIND 为例):
- 基于来源 IP 的条件响应 - 作用: BIND 可以根据查询请求的来源 IP 地址或 IP 地址范围(通过 ACL,即访问控制列表)决定将请求定向到哪个 view。 
- 应用场景: - 内部和外部 DNS 解析: 企业可以配置两个 views,一个针对内部网络用户(例如,公司局域网),另一个针对外部用户(例如,互联网用户)。内部用户可能会解析 - example.com得到内网 IP(例如,- 10.0.0.1),而外部用户则解析得到公网 IP(例如,- 203.0.113.1)。
- 地理位置优化: DNS 服务器可以根据查询者的地理位置,提供指向最近数据中心的 IP 地址。这对于 CDN(内容分发网络)或有多个数据中心的全球性企业非常有用。 
 
 
- 提供不同级别的访问控制 - 作用: 通过使用不同的 views,可以实现对 DNS 数据的访问控制。例如,某些数据只对特定的 IP 地址范围可见。 
- 应用场景: - 内部服务保护: 某些 DNS 记录可能只需要在公司内部可见,例如内网的数据库服务器或内部的应用服务。这些记录可以配置在只对内部 view 可见的 zone 中,而外部用户无法查询到这些记录。 
 
 
- 不同的 DNS 策略管理 - 作用: 不同的 views 可以配置不同的 DNS 策略,如不同的缓存策略、转发器配置或解析行为。 
- 应用场景: - 测试和生产环境分离: 通过配置不同的 views,你可以在同一台 DNS 服务器上管理测试环境和生产环境的 DNS 配置。例如,测试环境的查询可能会转发到测试 DNS 服务器,而生产环境的查询则会使用不同的解析路径。 
- 细化的 DNS 服务管理: 某些情况下,你可能需要对某些用户提供特定的解析策略,比如强制使用某个转发器或设置特定的 TTL 值,这些都可以通过 views 来实现。 
 
 
- 多租户环境中的 DNS 隔离 - 作用: 在多租户环境中(例如,托管服务或云服务),可以使用 views 来隔离不同租户的 DNS 数据。 
- 应用场景: - 租户数据隔离: 每个租户都有独立的 view 和 zone,因此不同租户之间的 DNS 记录是完全隔离的,确保一个租户的 DNS 配置不会影响另一个租户。 
 
 
- View 的配置示例 
假设你有一个 example.com 的域名,并且需要为内部和外部用户提供不同的 IP 地址,你可以这样配置 views:
view "internal" {
    match-clients { 10.0.0.0/8; };  # 仅限内部网段
    zone "example.com" {
        type master;
        file "/etc/bind/zones/db.internal.example.com";
    };
};
view "external" {
    match-clients { any; };  # 所有其他用户
    zone "example.com" {
        type master;
        file "/etc/bind/zones/db.external.example.com";
    };
};在这个示例中,internal view 针对内网用户,他们会解析到内网的 DNS 记录,而 external view 针对其他所有用户,他们会得到外网的 DNS 记录。
DNS ZONE (DNS 区)
DNS(Domain Name System)区(zone)是DNS中一个管理单位,它代表了DNS命名空间的一部分。每个区由一个特定的DNS服务器负责,称为权威DNS服务器。以下是DNS区的详细描述:
DNS 区的基本概念
- Zone(区): DNS区是DNS命名空间中的一个子树,它包含了该区域内所有域名的DNS记录。每个DNS区通常对一个或多个域名,如 - example.com。
- Zone File(区文件): DNS区的所有记录都存储在一个或多个文本文件中,这些文件被称为区文件。区文件包含了域名和对应的IP地址、别名、邮件交换器等信息。 
- SOA Record(起始授权记录): 每个区文件中必须包含一个SOA记录,定义了区的基本信息,如序列号、主DN服务器、管理员邮箱、刷新间隔等。 
DNS区的类型
- 主区(Primary Zone): 主区是一个DNS区的主要副本,包含了该区的所有DNS记录,并且可以进行读写操作主DNS服务器管理主区文件。 
- 从区(Secondary Zone): 从区是主区的只读副本,从区的DNS服务器通过区传送(zone transfer)从主DN服务器获取数据。它为主区提供了冗余,确保DNS服务的高可用性。 
- 转发区(Forward Zone): 转发区并不存储DNS记录,而是将DNS查询请求转发给指定的DNS服务器处理。 
- 反向区(Reverse Zone): 反向区与正向区相对,用于从IP地址解析到域名。这对于网络诊断和反向DNS查询有用。 
DNS记录类型
- A Record(地址记录): 将域名映射到IPv4地址。 
- AAAA Record: 将域名映射到IPv6地址。 
- CNAME Record(别名记录): 为一个域名创建别名,指向另一个域名。 
- MX Record(邮件交换记录): 指定域名的邮件服务器。 
- NS Record(名称服务器记录): 指定该区的权威DNS服务器。 
- PTR Record(指针记录): 用于反向DNS查询,将IP地址映射到域名。 
- TXT Record: 用于存储任意文本信息,通常用于验证和安全目的(如SPF、DKIM等)。 
区传送(Zone Transfer)
- AXFR: 完整区传送,通常用于将整个区文件从主DNS服务器复制到从DNS服务器。 
- IXFR: 增量区传送,仅传送自上次传送后更新的记录。 
动态 DNS 和 TSIG
- 动态DNS(Dynamic DNS): 允许实时更新DNS记录,而不需要手动编辑区文件。 
- TSIG(Transaction SIGnature): 使用共享密钥对DNS消息进行签名,确保区传送等操作的安全性。 
DNS 区管理工具
- BIND: 最常用的DNS服务器软件,广泛用于配置和管理DNS区。 
- rndc: BIND的远程管理工具,允许管理员对DNS服务进行动态更新、重新加载区等操作。 
DNS 权威区
权威区(Authoritative Zone)是指由 DNS 服务器直接管理和负责的 DNS 区域。在权威区内,DNS 服务器是该区域的唯一可信来源,负责存储并提供该区域的 DNS 记录。这意味着当客户端请求与该区域相关的 DNS 信息时,权威 DNS 服务器会提供准确且最新的记录。
主要特点
- 数据来源:权威区的数据直接存储在权威 DNS 服务器的区域文件中,这些数据包括域名的 A 记录、MX 记录、CNAME 记录等。 
- 权威响应:当权威 DNS 服务器收到针对该区域的查询请求时,它返回的响应被称为权威响应(Authoritative Response),这些响应通常会包含一个 - AA(Authoritative Answer)标志,表明数据来自权威来源。
- 区域类型: - 主区域(Primary/Master Zone):服务器是该区域的主要管理者,存储着该区域的原始数据。任何更改都是在主区域中完成的。 
- 从区域(Secondary/Slave Zone):服务器从主服务器获取数据的副本,并定期进行同步。虽然从区域也能提供权威响应,但它的记录副本来源于主服务器。 
 
示例
假设你管理的域名是 example.com,你可以在 BIND 的 named.conf 文件中定义一个主区域(Primary Zone):
zone "example.com" {
    type master;
    file "example.com.zone";
};在这个示例中,example.com 就是一个权威区。BIND 服务器通过读取 example.com.zone 文件中的数据来提供权威的 DNS 记录。
区别于非权威区
非权威区通常是指递归解析器从其他权威 DNS 服务器获取的缓存数据。当递归解析器响应查询时,如果数据来自缓存而不是其自身管理的区域,则这些数据是非权威的,不具有 AA 标志。
作用
权威区在 DNS 体系中起到了以下作用:
- 管理 DNS 记录:你可以直接在权威区中添加、修改或删除域名的 DNS 记录。 
- 提供准确的 DNS 信息:其他 DNS 服务器和客户端依赖于权威区提供的记录来解析域名。 
- 支持区域传送:主权威服务器可以通过区域传送将其数据分发给从服务器,确保冗余和负载均衡。 
总结
权威区是 DNS 服务器管理的一个关键部分,它确保域名的 DNS 记录是准确且可用的。通过权威区,DNS 服务器能够对外提供权威的 DNS 数据,并确保域名解析的正确性和一致性。
DNS 配置
named.conf 是 BIND DNS 服务器的主配置文件,用于定义 DNS 服务的全局设置、区域定义、访问控制和其他相关配置。下面是 named.conf 中所有主要配置参数的详解。
1. 全局选项(options)
options 块用于设置全局配置参数,影响整个 BIND 服务器的行为。
options {
    directory "/var/named";  # 指定存放区域文件的目录
    listen-on port 53 { 127.0.0.1; };  # 指定BIND监听的IP地址和端口
    allow-query { any; };  # 定义允许查询的客户端,默认允许所有
    recursion yes;  # 允许递归查询
    allow-recursion { 127.0.0.1; };  # 指定允许递归查询的客户端
    allow-transfer { none; };  # 定义允许区域传送的客户端
    forwarders { 8.8.8.8; 8.8.4.4; };  # 设置转发器,非权威查询将转发到这些DNS服务器
    dnssec-enable yes;  # 启用DNSSEC功能
    dnssec-validation auto;  # 自动启用DNSSEC验证
    max-cache-size 512M;  # 限制DNS缓存的最大大小
    version "none";  # 隐藏BIND版本信息
};- directory: 定义存放区域文件的目录。
- listen-on: 指定 BIND 监听的 IP 地址和端口,默认为 53。
- allow-query: 定义允许查询的客户端 IP 地址,可以是特定 IP、子网或- any表示所有。
- recursion: 启用或禁用递归查询。
- allow-recursion: 定义允许递归查询的客户端。
- allow-transfer: 指定允许进行区域传送的客户端 IP 地址。
- forwarders: 设置转发器 IP 地址,BIND 将非权威的查询转发给这些服务器。
- dnssec-enable: 启用 DNSSEC 功能,用于确保 DNS 数据的真实性。
- dnssec-validation: 设置 DNSSEC 的验证模式。
- max-cache-size: 限制 DNS 缓存的最大大小。
- version: 隐藏或指定 BIND 服务器对外显示的版本信息。
2. 区域定义(zone)
zone 块定义了一个特定 DNS 区域的配置,包括主区域、从区域、转发区域等。
zone "example.com" {
    type master;
    file "example.com.zone";
    allow-transfer { 192.168.1.2; };
    also-notify { 192.168.1.3; };
    allow-update { key "update-key"; };
};- type: 区域类型,包括- master(主区域)、- slave(从区域)、- forward(转发区域)、- stub(存根区域)。
- file: 指定区域文件的位置。
- allow-transfer: 定义允许进行区域传送的客户端 IP 地址。
- also-notify: 在区域更新时通知的其他服务器 IP 地址。
- allow-update: 指定允许动态更新的客户端,可以是 TSIG 密钥或 IP 地址。
3. 视图(view)
view 块允许你根据客户端的 IP 地址或其他条件提供不同的 DNS 视图。
view "internal" {
    match-clients { 192.168.1.0/24; };
    recursion yes;
    zone "example.com" {
        type master;
        file "example.com.internal.zone";
        allow-update { 192.168.1.1; };
    };
};- match-clients: 定义哪些客户端可以使用此视图。
- recursion: 启用或禁用此视图中的递归查询。
- zone: 在视图中定义特定区域的配置。
4. 访问控制列表(acl)
acl 块用于定义一组 IP 地址或子网,供其他配置指令使用。
acl "trusted" {
    192.168.1.0/24;
    10.0.0.0/8;
};- acl: 定义一个访问控制列表,可以在- allow-query、- allow-transfer等指令中引用。
5. 日志(logging)
logging 块用于配置 BIND 的日志输出,包括日志类别、通道和输出位置。
logging {
    channel default_log {
        file "/var/log/named.log" versions 3 size 5m;
        severity info;
        print-time yes;
        print-severity yes;
        print-category yes;
    };
    category default { default_log; };
};- channel: 定义日志输出通道,包括输出文件、日志轮转、日志级别等。
- category: 定义日志类别,将其输出到指定的日志通道。
6. 密钥(key)
key 块用于定义 TSIG 密钥,用于认证区域传送、动态更新等操作。
key "rndc-key" {
    algorithm hmac-sha256;
    secret "base64-encoded-secret";
};- algorithm: 指定密钥的加密算法,如- hmac-sha256。
- secret: 共享密钥的 Base64 编码字符串。
7. 控制(controls)
controls 块配置 BIND 的控制接口,用于与 rndc 工具通信。
controls {
    inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; };
};- inet: 指定控制接口的 IP 地址和端口。
- allow: 定义允许访问控制接口的 IP 地址。
- keys: 指定用于认证的 TSIG 密钥。
8. 转发(forwarders)
forwarders 用于指定 BIND 在处理非权威查询时转发到的上游 DNS 服务器。
forwarders {
    8.8.8.8;
    8.8.4.4;
};- forwarders: 列出转发查询的上游 DNS 服务器 IP 地址。
9. 限制(rate-limit)
rate-limit 块用于设置 BIND 的查询速率限制,以防止 DoS 攻击。
rate-limit {
    responses-per-second 10;
    slip 2;
};- responses-per-second: 设置每秒钟允许的最大查询响应数。
- slip: 设置丢弃响应前的查询次数。
10. 动态 DNS(dynamic DNS)
allow-update 指令用于指定哪些客户端可以动态更新区域记录。
allow-update { key "update-key"; };- allow-update: 允许动态更新的客户端,可以是 IP 地址或 TSIG 密钥。
11. 通知(notify)
notify 指令用于指定在区域更新时是否发送通知给从服务器。
notify yes;- notify:- yes或- no,决定是否通知从服务器。
12. 解析器配置(resolver)
用于配置 BIND 的递归解析行为,通常在 ISP 或企业级 BIND 服务器中使用。
resolver {
    query-source address * port 53;
};- query-source: 指定递归查询的源地址和端口。
13. DNSSEC 相关配置
dnssec-enable yes;
dnssec-validation auto;
dnssec-lookaside auto;- dnssec-enable: 启用 DNSSEC。
- dnssec-validation: 自动启用 DNSSEC 验证。
- dnssec-lookaside: 启用 DNSSEC 查阅,通常设置为- auto。
14. 根提示文件(root hints)
named.conf 中可以指定根提示文件的位置,以便 BIND 查找根 DNS 服务器。
zone "." {
    type hint;
    file "named.root";
};- type hint: 指定根提示类型。
- file: 指定根提示文件的位置。
15. 转发区域(forward zone)
用于指定特定区域的转发设置。
zone "example.org" {
    type forward;
    forwarders { 8.8.8.8; 8.8.4.4; };
};- type forward: 指定区域类型为转发。
- **`forward 
ers`**: 设置此区域的特定转发器。
16. 缓存控制
通过 max-cache-size 控制缓存的大小。
max-cache-size 512M;- max-cache-size: 限制缓存的最大大小。
总结
BIND 的 named.conf 配置文件提供了丰富的配置选项,可以灵活地配置 DNS 服务器的行为。通过合理的配置,你可以优化 DNS 性能、增强安全性,并实现复杂的 DNS 解析策略。
最后更新于