Linux 搭建 DNS 服务器(BIND9)
Linux 搭建 DNS 服务器
基本概念
DNS 是 Domain Name System(域名系统)的简称,用于将域名翻译成 IP 地址。
域名由多个部分构成:主机名.二级域名.顶级域名.(根域)
,每个部分称为一个区(zone),越往后的域范围越大等级越高。
- 主机名:一般代表公司或者组织的主机名或者某个服务名,一般在最左边。
- 二级域名(second-level domains):一般代表公司或者组织的名字。
- 顶级域名(top-level domains,TLDS):一般代表的是该公司或者组织在社会中的某个领域,或者所说的国家。在顶级域名中包含两种:
- 通用顶级域名(generic top-level domains,gTLDs):通用的顶级域名代表的便是在社会中的某个领域,例如 com 表示的是商业,edu 表示的教育机构,gov 表示的政府机构,org 表示的组织机构(例如开源组织什么的)
- 国家代码顶级域名(country code top-level domains,ccTLDs):国家代码顶级域名显然就是代表所属国家了,例如 cn 代表的是中国,jp 代表的是日本,ca 代表的是加拿大等等
- 当然 gTDLS 与 ccTLDs 不是说只能用一个,例如南开大学的域名
www.nankai.edu.cn
。
每个区都有一台主域名服务器,负责解析自己所在域的域名,同时至少应该有一台辅助域名服务器,防止主服务器崩溃。
DNS 解析过程
DNS 查询有两种方式:
- 递归查询:当客户端向域名服务器发送请求后,如果服务器无法解析该域名,会向另一台域名服务器发送请求,直到获取到域名相应的记录后,将记录返回给客户端。
- 迭代查询:当客户端向域名服务器发送请求后,如果服务器无法解析该域名,域名服务器会将推荐的域名服务器 IP 返回给客户端,让客户端自行查询。
DNS 记录
DNS 服务器中存储着 DNS 记录,用于记录域的相关信息,当收到客户端的域名解析请求后,会根据 DNS 记录进行解析。
常用的 DNS 记录类型有:
- A 记录:将域名解析为 IP 地址。
- AAAA 记录:将域名解析为 IPv6 地址。
- CNAME 记录:将域名指向另一个域名(真实域名),返回真实域名的 IP。
- MX 记录:将邮件指向电子邮件服务器。
- TXT 记录:用于存储文本注释,客户端请求 TXT 记录时,返回存储的文本信息。
- NS 记录:存储域名服务器的地址,当客户端请求解析域名时,服务器返回存储的域名服务器地址,让客户端去该域名服务器查询。
- PTR 记录:用于反向查询,将 IP 地址指向域名。
- SOA 记录:用于记录域或区域的相关信息。
- SRV 记录:用于将域名解析到特定服务,也就是“IP + 端口”,而不是 A 记录那样解析到 IP。
其他 DNS 记录类型:https://www.cloudflare.com/zh-cn/learning/dns/dns-records/
BIND 9
BIND 9 是 一个开源 DNS 服务器软件。
相关配置文件
- 系统的 DNS 配置文件:
/etc/resolv.conf
- BIND 配置文件:
/etc/bind/named.conf
- BIND9 全局配置文件:
/etc/bind/named.conf.options
,这个文件包含了 BIND 服务器的全局选项配置,例如服务器的全局参数设置、DNS转发配置、安全选项、日志设置等。通过编辑这个文件,可以配置 BIND 服务器的全局行为和特性。 - 本地域配置文件:
/etc/bind/named.conf.local
,这个文件用于配置本地域名(Local Zone)的区域文件(Zone File)和相关的域名解析设置。在这个文件中,可以指定本地区域的域名、对应的区域文件路径、域名服务器信息等。 - 默认区域配置文件:
/etc/bind/named.conf.default-zones
,这个文件包含了 BIND 服务器的默认区域(Default Zone)配置,例如根区域(Root Zone)和其他默认配置的区域。这些默认区域通常由 BIND 服务器自动管理,但可以通过编辑这个文件来进行自定义配置。
- BIND9 全局配置文件:
语句块
BIND 9 的配置文件由若干语句块构成,语句块格式如下:
声明 {
配置参数;
配置参数 {
子配置项;
子配置项;
}
.......;
.......;
};
例如 options语句块的示例:
options {
directory "/var/cache/bind";
recursion yes; # enables resursive queries
allow-recursion { trusted; }; # allows recursive queries from "trusted" clients
listen-on { 192.168.42.5; }; # ns1 private IP address - listen on private network only
allow-transfer { none; }; # disable zone transfers by default
forwarders {
114.114.114.114; # 当本地的 dns 服务器中找不到记录时向上查询
};
dnssec-validation auto;
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
};
BIND 9 有如下类型语句块:
- acl:定义一个 IP 地址表列名,用语接入控制和其他用法。
- controls:宣告 rnde utility 使用的控制通道(channel)。
- include:包含一个文件。
- key:设置密匙信息,它应用在通过 TSIG 进行授权和认证的配置中。
- logging:设置日志服务器,和日志信息的发送地。
- options:控制服务器的全局配置选项和为其它语句设置默认值。
- server:在一个单服务器基础上设置特定的配置选项。
- trusted-keys:定义信任的 DNSSED 密匙。
- view:定义一个视图。
- zone:定义一个域。
logging 和 options 语句块在每个配置中出现一次。
ACL 语句
acl acl-name {
address_match_list
};
ACL 语句给一个地址匹配列表赋予一个名称,定义了之后,这个名称(表示这个列表)可以用于其他地方。
预定义的 ACL 名称:
- any:匹配所有主机
- none:不匹配任何主机
- localhost:匹配主机上所有 IPv4 的网络接口
- localnets:匹配所有 IPv4 本地网络的主机
地址匹配列表语法
地址匹配列表是由地址匹配列表元素构成,用分号分隔:
address_match_list=address_match_list_element;[address_match_list_element;...]
地址匹配列表元素可以是:
- 一个 IP 地址(IPv4 或 IPv6)
- 一个 IP 网段(CIDR 表示法)
- 已经定义的 ACL 名称
- 用大括号括起来的匿名地址匹配列表
- key 语句中定义的一个 key ID
address_match_list_element=[!](ip_address[/length] | key_id | acl_name | {address_match_list})
每个地址匹配列表元素之前可以添加!
表示非。
地址匹配列表按照顺序匹配,所以小范围定义要在大范围定义之前,如 1.2.3/24;!1.2.3.13;
后面一个元素就没有用了,因为 1.2.3/24
直接允许所有这一网段的 ip 通过了,应该用 !1.2.3.13;1.2.3/24;
。