1. 简介
1.1 域名解析服务
目前 TCP/IP 网络中的设备之间进行通信,是依赖于 IP 地址实现的。但数字形式的 IP 地址是很难记忆的,当网络设备众多,想要记住每个设备的 IP地址,可以说是不现实的。那么如何解决这一难题呢?可以给每个网络设备起一个友好的名称,如:www.wuvikr.top,这种由字母组成的名称被称为域名,显而易见域名要更容易记忆。但是计算机并不认识域名,需要利用一种域名解析服务将域名解析成 IP 地址,而 DNS 就是这样一种域名解析服务。
除此之外使用域名还有一个好处,它可以实现主机和 IP 的解耦,即:当主机 IP 变化时,只需要修改域名解析服务中域名和 IP 的映射关系即可,用户仍可以通过原有的域名进行访问而不受影响。
DNS:Domain Name System 域名系统是互联网上解决网上机器名字和IP的对应关系的一种系统,它将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问。基于C/S架构,服务器端端口为 53/UDP,53TCP。
它将域名从后往前,从上到下,以一颗倒立的树状结构,将域名分为根域,顶级域,二级域……每一级域的服务器存储着下级域所有的其他域服务器的IP地址,类似与现实生活中的地址一样,DNS服务器可以一级一级查找,最终找到对应域名机器的IP地址。
存储机器 IP 的服务器叫做权威服务器。
1.2 DNS 查询过程
当客户端在浏览器中敲出 www.baidu.com 并按下回车后,客户端机器会先去自己本机的 hosts 文件中查找有没有对应的域名的 IP 记录,如果有,直接以其中的 IP 进行访问,如果没有,客户端回向本地 DNS 服务器发起询问,本地 DNS 收到客户端的请求后,会先去查看自己的缓存,如果有对应的域名的 IP 记录,则将其回复给客户端机器,如果没有,DNS 会向互联网的根服务器发起询问,根服务器本身并没有存储某个具体机器域名的 IP 地址,所以也不能做出应答,但是根服务器上有其对应的顶级域名 com 的服务器地址,根服务器会将顶级域名 com 的 域名服务器地址告诉本地 DNS 服务器,本地服务器这时候会再去询问 com 的域名服务器,但是 com域名服务器本身也不存储某个具体机器域名的 IP 地址,所以它会将自己的下级域名 baidu 的服务器地址告诉本地 DNS 服务器,本地服务器这时候会再去询问其下级的 baidu 域名服务器,这样一级一级迭代查询下去,最终找到对应的真正存放 www.baidu.com 的域名服务器,它会返回 www.baidu.com 具体的 IP 地址给本地 DNS 服务器,本地服务器得到真正的 IP 地址后回复给客户端机器,客户端机器拿着这个 IP 完成访问。
客户端到本地DNS之间的查询称为递归查询
本地DNS往下一级一级查询的过程称为迭代查询
2. DNS 服务 bind
2.1 安装
CentOS
yum -y install bind bind-utils
Ubuntu
apt -y install bind9 bind-utils
2.2 bind 主要文件
这里以 CentOS 为例,Ubuntu 只是文件的路径不一样。
rpm -ql bind
BIND主程序:
/usr/sbin/named- 主配置文件:
/etc/named.conf,/etc/named.rfc1912.zones,/etc/rndc.key - 管理工具:
/usr/sbin/rndc,remote name domain controller,默认与 bind 安装在同一主机,只能通过 127.0.0.1 连接 named 进程,提供辅助性的管理功能,使用 953/tcp 端口。 - 解析库文件:
/var/named/ZONE_NAME.ZONE,存放域解析记录的文件。2.3 主配置文件解析
2.3.1 named.conf
配置文件由以下四部分组成:
全局配置:options {…}; ```bash options { listen-on port 53 { localhost; }; // IPV4 监听端口和地址,默认为127.0.0.1,建议修改为localhost listen-on-v6 port 53 { ::1; }; // IPV6 监听端口和地址 directory “/var/named”; // bind相关文件默认目录设置 dump-file “/var/named/data/cache_dump.db”; // statistics-file “/var/named/data/named_stats.txt”; memstatistics-file “/var/named/data/named_mem_stats.txt”; recursing-file “/var/named/data/named.recursing”; secroots-file “/var/named/data/named.secroots”; allow-query { any; };
/*
- If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
- If you are building a RECURSIVE (caching) DNS server, you need to enable recursion.
If your recursive DNS server has a public IP address, you MUST enable access control to limit queries to your legitimate users. Failing to do so will cause your server to become part of large scale DNS amplification attacks. Implementing BCP38 within your network would greatly reduce such attack surface */ recursion yes;
dnssec-enable yes; dnssec-validation yes;
/ Path to ISC DLV key / bindkeys-file “/etc/named.root.key”;
managed-keys-directory “/var/named/dynamic”;
pid-file “/run/named/named.pid”; session-keyfile “/run/named/session.key”; };
2. 日志子系统配置:logging {...};```bashlogging {......};
区域定义:zone “.” IN {…};
zone "." IN { type hint; file "named.ca"; };这里是对根域的定义:
type hint:区域类型,可以接受的值有 primary (or master), secondary (or slave), mirror, hint, stub, static-stub, forward, redirect, or delegation-only,不同类型的区别请参考官方文档;file named.ca:这是根域的解析数据库文件。加载外部文件:include …;
include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";/etc/named.rfc1912.zones是安装完后自带的区域定义文件,包括 localhost,回环网卡等。
对于自定义的域可以都放在此文件中,也可以自行创建一个xxx.zones文件,然后使用在主配置文件中使用 include 语法加载。2.3.2 域数据库文件
在定义域的时候有一个 file 字段,这个字段指明了域数据库文件的所在,使用相对路径
/var/named/。
此文件对命名没有要求,但内容需要遵循域数据库资源记录格式。2.3.2.1 资源记录格式
name [TTL] IN rr_type value
name:主机记录,域名名称TTL:有效时间,可从全局继承IN:固定格式,可以不写rr_type:资源记录类型value:IP:记录值
注意:
- 使用 “@” 符号可用于引用当前区域的域名。
- 同一个 name 可以通过多条记录定义多个不同的值,此时 DNS 服务器会以轮询方式响应,这也是一种负载均衡的方式之一。
- 同一个值也可能有多个不同的 name,表示通过多个不同的 name 找到同一个主机。
2.3.2.2 资源记录类型
SOA:Start Of Authority,起始授权记录,一个区域解析库有且仅能有一个SOA记录,必须位于解析库的第一条记录。A:internet Address,正向解析,域名到 IP 地址,FQDN —> IPv4AAAA:FQDN —> IPv6。PTR:PoinTeR,反向解析,IP 地址到域名,IP —> FQDN。NS:Name Server,用于标明当前区域的 DNS 服务器。CNAME: Canonical Name,别名记录。MX:Mail eXchanger,邮件交换器。TXT:对域名进行标识和说明的一种方式,一般做验证记录时会使用此项,如:SPF(反垃圾邮件)记录,https验证等。2.3.2.3 范例
自带的 localhost 域: ```bash [root@c7-01 named]# grep -A 4 ‘zone “localhost”‘ /etc/named.rfc1912.zones zone “localhost” IN { type master; file “named.localhost”; allow-update { none; }; };
[root@c7-01 named]# cat named.localhost $TTL 1D @ IN SOA @ rname.invalid. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS @ A 127.0.0.1 AAAA ::1
- `$TTL 1D`:定义 TTL 为一天,资源记录中没有写则默认使用此值。
- `@`:使用 “@” 符号可用于引用当前区域的名字,即 zone 文件中定义的域名称,这里是 localhost。
- `name`:不写,默认从上一条记录继承
<a name="CTGXX"></a>
## 2.4 实现主 DNS 服务
<a name="wcyEK"></a>
### 2.4.1 修改配置文件
```bash
[root@c7-01 ~]# vim /etc/named.conf
listen-on port 53 { localhost; }; // 监听本机IP
allow-query { any; }; // 允许任何机器查询
2.4.2 添加资源记录数据库文件
[root@c7-01 ~]# vim /var/named/wuvikr.local.zone
$TTL 1D
@ IN SOA master wuvikr.qq.com ( 1 1H 10M 1W 1D )
NS master
master A 10.0.0.71
@ A 10.0.0.71
* A 10.0.0.71
www A 1.1.1.1
# 修改文件权限和属组
[root@c7-01 ~]# chmod 640 wuvikr.local.zone
[root@c7-01 ~]# chgrp named wuvikr.local.zone
# 启动 DNS 服务
[root@c7-01 ~]# systemctl start named
2.4.3 定义 zone 区域
[root@c7-01 ~]# vim /etc/named.rfc1912.zones
zone "wuvikr.local" IN {
type master;
file "wuvikr.local.zone";
};
2.5 实现从 DNS 服务
2.5.1 修改主 DNS 配置文件
[root@c7-01 ~]# vim /etc/named.conf
options {
......
allow-transfer { 10.0.0.72;}; // 只允许从DNS服务器进行Zone数据库文件传输。
......
}
# 重新加载配置
rndc reload
2.5.2 主 DNS 域数据库文件添加从 DNS 信息
[root@c7-01 ~]# vim /var/named/wuvikr.local.zone
$TTL 1D
@ IN SOA master wuvikr.qq.com ( 1 1H 10M 1W 1D )
NS master
NS slave ; 域名解析从服务器
master A 10.0.0.71
slave A 10.0.0.72 ; 从服务器A记录
@ A 10.0.0.71
* A 10.0.0.71
www A 1.1.1.1
2.5.3 修改从 DNS 配置文件
[root@c7-02 ~]# vim /etc/named.conf
options {
listen-on port 53 { localhost; }; // 监听本机IP
...
allow-query { any; }; // 允许任何机器查询
allow-transfer { none; }; // 不允许进行Zone数据库文件传输。
......
}
2.5.4 定义从 DNS Zone 区域
[root@c7-02 ~]# vim /etc/named.rfc1912.zones
zone "wuvikr.local" IN {
type slave;
masters { 10.0.0.71; };
file "slaves/wuvikr.local.zone.slave";
};
2.5.5 启动服务
[root@c7-02 ~]# systemctl start named
主从 DNS 配置完成后,每次修改主 DNS 域数据库文件,只需要修改版本号,即可自动将改动推送给从 DNS。
2.6 DNS 转发
利用 DNS 转发,可以将用户的解析请求,转发至指定的 DNS 服务,而非默认的根 DNS 服务器,提高效率。
注意:
全局转发:对非本机所负责解析区域的请求,全部转发给指定的服务器。可以在全局配置文件中配置:
Options { forward first|only; forwarders { ip;}; };特定域转发:仅转发对特定的域请求,比全局转发优先级高。可以在 Zone 域定义文件中配置:
zone "ZONE_NAME" IN { type forward; forward first|only; forwarders { ip;}; };first:先转发至指定 DNS 服务器,如果无法解析查询请求,则本服务器再去根服务器查询。only:转发至指定 DNS 服务器,如果无法解析查询请求,本服务器也不再去根服务器查询。
