22、深入理解DNS:BIND与DHCP的应用与配置

深入理解DNS:BIND与DHCP的应用与配置

1. 反向查找区域文件

反向查找区域文件中,存在针对网络10.1.1.0/24的反向区域。 $ORIGIN 指令是可选的,但它能让区域文件更易读,它会补全那些未完全限定的资源记录(RR)。例如,当使用IP地址10.1.1.[1,2,6]时, $ORIGIN 指令会在1、2和6前加上10.1.1,以得到完整的IP地址。TTL值为一天,主机名需使用带末尾 . 的完全限定域名(FQDN),否则回复会不准确。以下是一个示例:

1       IN      PTR     gw01.example.org.
2       IN      PTR     time1.example.org.
6       IN      PTR     www.example.org.

测试区域文件可使用如下命令:

$ dig +short –x time1.example.org
10.1.1.2
2. 根服务器

根服务器用于引导DNS。域名的根是 . ,位于树的顶部。有13个命名权威机构,即[a - m].root - servers.net,全球有数百个根服务器,列表可在https://www.iana.org/domains/root/servers 找到。对于BIND,需从http://www.internic.net/domain/named.root 下载根提示文件,并在 /etc/named.conf 中引用,示例如下:

#ROOT SERVERS
zone "." {
    type hint;
    file "root.hints";
};

建议直接下载互联网网络信息中心(InterNIC)提供的根提示文件,因为该文件包含命名权威机构的A、NS和AAAA记录,需确保其值正确,否则DNS将无法工作。

3. 安装BIND

BIND在大多数Linux发行版中都可用。以CentOS为例,可使用yum仓库安装,命令如下:

#install BIND using yum on CentOS
# yum install bind

BIND有不同的分支,具有不同的支持模式,具体如下:
| 分支状态 | 描述 |
| ---- | ---- |
| 当前稳定版 | 最新的稳定版本,适合生产环境使用 |
| 当前稳定扩展支持版(ESV) | 稳定且保证有扩展支持,适合生产环境 |
| 接近生命周期结束(EOL) | 仅提供漏洞和安全补丁,无新功能 |
| 开发版 | 仅用于测试和评估,不用于生产 |
| EOL | 无支持,不建议使用 |
| 已弃用 | 超出EOL,绝对不建议使用 |

若要获取当前稳定的ESV版本,可从https://www.isc.org/downloads/bind/ 下载并编译,步骤如下:

#install development tools yum group on CentOS or RedHat
$ sudo yum groupinstall "Development Tools" –y

#after untarring the distribution, run configure 
#in this case we want BIND installed in  /opt/bind-9.9.5 so we use –prefix option
#to get a detailed explanation of configure options run ./configure --help
$ ./configure --prefix=/opt/bind-9.9.5 --enable-newstats --with-libxml2
$ make
# make install
4. 跟踪更改

为便于在出现错误时轻松恢复到先前版本,BIND配置文件应使用配置管理工具进行维护,可使用Git。具体操作如下:
- 在Git服务器的 /gitrepos/dns/master 目录下:

$ git –bare init etc
Initialized empty Git repository in /gitrepos/dns/master/etc/

$ git –bare init maps
Initialized empty Git repository in /gitrepos/dns/master/maps/
  • 在BIND主服务器(假设安装在 /opt/bind ):
$ cd /opt/bind
$ git clone git@gitserver.example.com:/gitrepos/dns/master/etc
$ git clone git@gitserver.example.com:/gitrepos/dns/master/maps

对于从服务器,需为 etc maps 维护单独的仓库,所有从服务器可共享相同的 etc Git仓库。

5. 命名配置文件

BIND的配置文件 named.conf 是其工作流程的起点,控制着BIND的行为和功能,通常位于 /etc 目录。该文件由子句组成,子句组合成语句,也可包含注释。编辑此文件时需格外小心,小的语法错误都会导致BIND加载失败。以下是一个示例 named.conf 配置:

#logging-specific statements
logging {
    channel default_log {
        file "log/named.log" versions 5 size 10m;
        severity info;
        print-time yes;
        print-severity yes;
        print-category yes;
    };
    category default {
        default_log;
    };
};

#general server options
options {
    directory "/";
    allow-query-cache { my-networks; };
    allow-query { my-networks; };
    allow-recursion { my-networks; };
    allow-transfer { 10.1.1.100; 10.1.2.100; };
    notify yes;
    statistics-file "log/named.stats";
    pid-file "log/named.pid";
};

#acl-related statements
acl "my-networks" {
    127.0.0.1;
    localhost;
    localnets;
    10.1.0.0/16;
};

# a forwarding sample
zone "example.org" {
    type forward;
    forwarders { 199.43.132.53; 199.43.133.53; };
};

#rndc statements
include "etc/rndc.key";
controls {
    inet 127.0.0.1 port 953
    allow {127.0.0.1;} keys { "rndc-key"; };
};

#dns bootstrapping statements
zone "." {
    type hint;
    file "etc/root.hints";
};

#example.com zone
zone "example.com" {
    type master;
    file "maps/example.com.zone";
    allow-transfer {
        10.1.0.0/16;
    };
};

zone "1.1.10.in-addr.arpa" {
    type master;
    file "maps/reverse/1.1.10.rev";
};
6. DNS服务器类型

DNS服务器有四种类型:主服务器、从服务器、转发服务器和缓存服务器。它们的特点和配置如下:
- 主服务器 :所有编辑操作都在此进行,在 named.conf 中指定类型为 master ,示例如下:

#example.com zone
zone "example.com" {
    type master;
    file "maps/example.com.zone";
    allow-transfer {
        10.1.0.0/16;
    };
};
  • 从服务器 :是只读副本,存储完整配置,在 named.conf 中指定类型为 slave ,示例如下:
#example.com zone
zone "example.com" {
    type slave;
    masters { 10.1.1.10; }
    file "maps/example.com.zone";
    allow-transfer {
        10.1.0.0/16;
    };
};
  • 缓存服务器 :配置相对简单,开启递归查询并允许特定网络查询,示例如下:
options {
    recursion yes;
    allow-query { my-networks };
    dnssec-validation auto;
}
  • 转发服务器 :配置与缓存服务器类似,需指定转发的DNS服务器,示例如下:
options {
    recursion yes;
    allow-query { my-networks };
    forwarders {
        8.8.8.8;
        8.8.4.4;
    }
    forward only;
    dnssec-enable yes;
    dnssec-validation yes;
}

企业环境中可根据需求组合使用不同类型的服务器,如远程小办公室适合使用缓存服务器,大型数据中心则至少需要一个主服务器和多个从服务器,转发服务器可用于存根DNS区域。

7. 发送者策略框架(SPF)

SPF是一种利用DNS防止发件人地址伪造的方法,保护信封发件人地址。电子邮件地址有信封发件人地址(通常不显示,用于服务器间邮件传递)和邮件头发件人地址。以example.com为例,可通过创建包含SPF的文本记录来实现:

$ dig example.com txt
"v=spf1 mx -all"

v=spf - all 表示若邮件源自该域名的MX记录,则认为有效,否则可忽略。查询MX记录命令如下:

$ dig example.com mx
10 mx10.example.com.
20 mx20.example.com.

若不想从example.com发送邮件,可设置TXT记录为 "v=spf1 - all" ;若只允许特定网络发送邮件,则记录中应包含网络编号,如 "v=spf1 ip4: 93.184.216.0/24"

8. DNS安全扩展(DNSSEC)

为解决域名委派机制中的漏洞,引入了DNSSEC(RFC 4033)。它通过使用公钥基础设施对区域数据进行数字签名来工作,区域签名从根区域 . 开始,向下延伸到顶级域名(TLD)。企业也可对其区域数据进行签名。设置DNSSEC的步骤如下:
1. 在 /etc/named.conf 中启用DNSSEC:

options {
    dnssec-enable yes;
    dnssec-validation yes;
    dnssec-lookaside auto;
}
  1. 创建KSK和ZSK密钥:
# mkdir /etc/pki/dnssec-keys/
# cd dnssec-keys/
# dnssec-keygen -a RSASHA1 -b 1024 -n ZONE example.com
Generating key pair...........++++++ .....++++++
Kexample.com.+005+20898
# dnssec-keygen -a RSASHA1 -b 4096 -n ZONE -f KSK example.com
Generating key pair....................++ ..................++
Kexample.com.+005+28642
# ls
Kexample.com.+005+20898.key Kexample.com.+005+20898.private Kexample.com.+005+28642.key 
Kexample.com.+005+28642.private
  1. 在需要签名的区域文件中包含密钥路径:
$INCLUDE /etc/pki/dnssec-keys/Kexample.com.+005+20898.key
$INCLUDE /etc/pki/dnssec-keys/Kexample.com.+005+28642.key
  1. 签名区域:
cd /var/named
dnssec-signzone -S -K /etc/pki/dnssec-keys -e +3024000 -o example.com -N INCREMENT  example.com.hosts
  1. /etc/named.conf 中替换区域信息为签名后的区域:
#in /etc/named.conf
zone "example.com" {
    file "example.com.signed";
};
  1. 重启named服务:
# service named reload

默认情况下,区域签名在创建30天后过期,可创建脚本自动签名区域并放入 cron.monthly ,示例脚本如下:

#!/bin/bash
SIGNZONE="/usr/sbin/dnssec-signzone"
DNSSEC_KEYS="/etc/pki/dnssec-keys"
ZONEFILES="/var/named"
cd $ZONEFILES
for zones in *.signed; do
ZONE=`echo $zones | /bin/cut -d. -f1-2`
$SIGNZONE -S -K $DNSSEC_KEYS -e +3024000 -o $ZONE -N INCREMENT \
$ZONE.hosts
done
/sbin/service named reload

综上所述,通过合理配置和使用BIND,结合不同类型的DNS服务器以及相关的安全机制,可构建一个稳定、安全的DNS环境。

深入理解DNS:BIND与DHCP的应用与配置(续)

9. 操作流程总结

为了更清晰地展示DNS相关操作的流程,下面以设置一个完整的DNS环境为例,给出操作步骤的流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px

    A([开始]):::startend --> B(安装BIND):::process
    B --> C{选择安装方式}:::decision
    C -->|yum安装| D(使用yum install bind):::process
    C -->|下载编译| E(下载BIND源码):::process
    E --> F(安装开发工具):::process
    F --> G(配置编译选项):::process
    G --> H(编译并安装):::process
    D --> I(配置named.conf):::process
    H --> I
    I --> J(设置根提示文件):::process
    I --> K(配置日志记录):::process
    I --> L(配置服务器选项):::process
    I --> M(配置访问控制列表):::process
    I --> N(配置区域信息):::process
    J --> O(选择DNS服务器类型):::decision
    K --> O
    L --> O
    M --> O
    N --> O
    O -->|主服务器| P(设置type为master):::process
    O -->|从服务器| Q(设置type为slave):::process
    O -->|缓存服务器| R(开启递归查询):::process
    O -->|转发服务器| S(指定转发服务器):::process
    P --> T(配置区域文件):::process
    Q --> T
    R --> T
    S --> T
    T --> U(设置SPF记录):::process
    T --> V(启用DNSSEC):::process
    U --> W(完成配置):::process
    V --> W
    W --> X([结束]):::startend
10. 常见问题及解决方法

在使用BIND和配置DNS环境的过程中,可能会遇到一些常见问题,以下是一些问题及对应的解决方法:
| 问题描述 | 可能原因 | 解决方法 |
| ---- | ---- | ---- |
| BIND无法启动 | 配置文件存在语法错误 | 仔细检查 named.conf 文件,使用 named-checkconf 命令检查语法 |
| DNS查询无响应 | 防火墙阻止了DNS端口(通常是UDP 53) | 配置防火墙允许DNS流量通过 |
| 区域文件加载失败 | 区域文件路径错误或文件权限问题 | 检查区域文件路径是否正确,确保BIND进程有访问文件的权限 |
| DNSSEC签名失败 | 密钥文件丢失或权限不足 | 检查密钥文件是否存在,确保BIND进程有访问密钥文件的权限 |

11. 最佳实践建议

为了确保DNS环境的稳定和安全,以下是一些最佳实践建议:
- 定期备份 :定期备份BIND的配置文件和区域文件,以便在出现问题时能够快速恢复。
- 更新根提示文件 :定期从http://www.internic.net/domain/named.root 下载最新的根提示文件,确保DNS解析的准确性。
- 使用配置管理工具 :如Git,对BIND的配置文件和区域文件进行版本控制,方便跟踪更改和回滚操作。
- 监控日志 :定期查看BIND的日志文件,及时发现和解决潜在的问题。
- 安全配置 :使用访问控制列表(ACL)限制对DNS服务器的访问,启用DNSSEC增强安全性。

12. 总结

DNS是现代网络中不可或缺的一部分,BIND作为一款强大的DNS服务器软件,为我们提供了丰富的功能和灵活的配置选项。通过本文的介绍,我们了解了反向查找区域文件、根服务器、BIND的安装和配置、DNS服务器类型、SPF和DNSSEC等重要概念和操作方法。

在实际应用中,我们可以根据企业的需求和网络环境,选择合适的DNS服务器类型,并结合SPF和DNSSEC等安全机制,构建一个稳定、安全的DNS环境。同时,遵循最佳实践建议,定期维护和监控DNS服务器,能够有效避免潜在的问题,确保网络的正常运行。

希望本文能够帮助你更好地理解和使用BIND,在DNS管理方面取得更好的效果。如果你在实际操作中遇到任何问题,欢迎随时留言讨论。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值