12. SELinux 加固 Linux 安全
控制端口 SELinux 上下文
端口 SELinux 上下文
**SELinux还可以对端口标记。**当某个进程希望侦听端口时, SELinux将检查是否允许与该进程相关联的标签绑定该端口标签。 这可以阻止恶意服务控制本应由其他网络服务使用的端口。
在 targeted 策略中:
- 端口 22/TCP ,具有标签 ssh_port_t。
- 端口 80/TCP 和 443/TCP ,具有标签 http_port_t。
# 查看端口标记
[root@server ~ 09:36:24]# semanage port -l | grep http_port_t
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
# 添加端口标记
[root@server ~ 09:43:08]# semanage port -a -t http_port_t -p tcp 18020
[root@server ~ 09:45:23]# semanage port -l|grep 18020
http_port_t tcp 18020, 80, 81, 443, 488, 8008, 8009, 8443, 9000
# 修改网络端口标记
[root@server ~ 09:45:40]# semanage port -m -t ssh_port_t -p tcp 18020
[root@server ~ 09:46:13]# semanage port -l | grep 18020
ssh_port_t tcp 18020, 22
# 删除端口标记
[root@server ~ 09:46:32]# semanage port -d -t ssh_port_t -p tcp 18020
[root@server ~ 09:47:10]# semanage port -l | grep 108020
示例:配置 web 站点监听端口
[root@server ~ 09:52:39]# vim /etc/httpd/conf/httpd.conf
# 修改原先的 Listen 80 为 Listen 18020
Listen 18020
# 重启服务
root@server ~ 09:54:21]# systemctl restart httpd
Job for httpd.service failed because the control process exited with error code.
See "systemctl status httpd.service" and "journalctl -xe" for details
[root@server ~ 09:54:34]# systemctl status httpd.service |cat |grep Per
......
Nov 29 11:55:26 rocky.laoma.cloud httpd[3939]: (13)Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:18020
......
# 配置端口
[root@server ~ 09:55:53]# semanage port -a -t http_port_t -p tcp 18020
[root@server ~ 09:56:05]# semanage port -l | grep 18020
http_port_t tcp 18020, 80, 81, 443, 488, 8008, 8009, 8443, 9000
# 只查看改动标签
[root@server ~ 09:57:44]# semanage port -lC
SELinux 端口类型 协议 端口号
http_port_t tcp 18020
# 重启服务并访问
[root@server ~ 09:58:34]# systemctl restart httpd
# 访问验证
[root@server ~ 09:58:58]# curl http://server.zzh.cloud:18020/
Hello World
控制 SELinux 布尔值
SELinux 布尔值
SELinux 布尔值是可更改SELinux策略行为的开关,可以启用和禁用。
# 查看SELinux布尔值
[root@server ~ 10:27:33]# getsebool -a |grep httpd_enable_homedirs
httpd_enable_homedirs --> off
[root@server ~ 10:27:48]# getsebool httpd_enable_homedirs
httpd_enable_homedirs --> off
# 设置SELinux布尔值
[root@server ~ 10:27:55]# setsebool
Usage: setsebool [ -NPV ] boolean value | bool1=val1 bool2=val2...
# 启用value为1或者on或者true
# 禁用value为0或者off或者false
[root@server ~ 10:28:07]# setsebool httpd_enable_homedirs=1或者on或者true
[root@server ~ 10:28:36]# setsebool httpd_enable_homedirs=0或者off或者false
# 持久化设置布尔值,使用-P选项修改将写入SELinux数据库。
[root@server ~ 10:28:41]# setsebool httpd_enable_homedirs=1
[root@server ~ 10:28:54]# setsebool -P httpd_enable_homedirs=1
还可以semanage boolean 命令管理 SELinux 布尔值。
[root@server ~ 10:29:04]# semanage boolean
Usage: semanage boolean [-h] [-n] [-N] [-S STORE] [ --extract | --deleteall | --list -C | --modify ( --on | --off ) boolean ]
# 查看 SELinux 布尔值
[root@server ~ 10:29:45]# semanage boolean -l
SELinux 布尔值 状态 默认 描述
privoxy_connect_any (开 , 开) Allow privoxy to connect any
smartmon_3ware (关 , 关) Allow smartmon to 3ware
mpd_enable_homedirs (关 , 关) Allow mpd to enable homedirs
... ...
# 只查看非默认的 SELinux 布尔值
[root@server ~ 10:29:55]# semanage boolean -l -C
SELinux 布尔值 状态 默认 描述
httpd_enable_homedirs (开 , 开) Allow httpd to enable homedirs
# 设置 SELinux 布尔值
[root@server ~ 10:30:04]# semanage boolean -m -1|--on use_nfs_home_dirs
[root@server ~ 10:31:05]# semanage boolean -m -0|--off use_nfs_home_dirs
# 相当于setsebool -P
# 删除原先自定义的 SELinux 布尔值
[root@server ~ 10:31:19]# semanage boolean -D
调查和解决 SELinux 问题
SELinux 文档
selinux-policy-doc 软件包附带SELinux man page,介绍了 SELinux 使用方法。
[root@server ~ 17:13:12]# yum install -y selinux-policy-doc
[root@server ~ 18:59:50]# mandb
[root@server ~ 18:59:59]# man -k '_selinux'
......
httpd_selinux (8) - Security Enhanced Linux Policy for the httpd processes
......
[root@server ~ 19:00:20]# man httpd_selinux
setroubleshoot-server 软件包
setroubleshoot-server 软件包中的 setroubleshoot 服务提供了诊断 SELinux 问题的⼯具。当 SELinux 拒绝某一操作时,会在 /var/log/audit/audit.log 安全⽇志文件中记录一条Access Vector Cache (AVC) 消息。SELinux 故障排除服务会监控 AVC 事件,并将事件摘要发送到 /var/log/messages 文件。
示例:基于上述实验环境模拟。
# 安装软件包
[root@server ~ 19:01:05]# yum install -y httpd setroubleshoot-server
# 关闭 httpd_enable_homedirs布尔值
[root@server ~ 19:01:17]# setsebool httpd_enable_homedirs=0
# 监控日志 /var/log/messages
[root@server ~ 19:01:27]# tail -f /var/log/messages
# 访问站点
[root@server ~ 19:02:03]# curl http://server.zzh.cloud:18020/~zzh/
Welcome to laoma home
# 此时日志显示
[root@server ~ 19:02:16]# tail -f /var/log/messages
......
Nov 30 10:39:34 server setroubleshoot[4035]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /home/laoma/public_html/index.html. For complete SELinux messages run: sealert -l bb10b03c-bed2-4853-85cb-92c1824fd75d
......
# 根据提示进一步查看 SELinux 消息
[root@centos7 ~]# sealert -l bb10b03c-bed2-4853-85cb-92c1824fd75d
SELinux is preventing /usr/sbin/httpd from getattr access on the file /home/laoma/public_html/index.html.
***** Plugin public_content (32.5 confidence) suggests ********************
If you want to treat index.html as public content
Then you need to change the label on index.html to public_content_t or public_content_rw_t.
Do
# semanage fcontext -a -t public_content_t '/home/laoma/public_html/index.html'
# restorecon -v '/home/laoma/public_html/index.html'
***** Plugin catchall_boolean (32.5 confidence) suggests ******************
If you want to allow httpd to enable homedirs
Then you must tell SELinux about this by enabling the 'httpd_enable_homedirs' boolean.
Do
setsebool -P httpd_enable_homedirs 1
***** Plugin catchall_boolean (32.5 confidence) suggests ******************
If you want to allow httpd to unified
Then you must tell SELinux about this by enabling the 'httpd_unified' boolean.
Do
setsebool -P httpd_unified 1
***** Plugin catchall (4.5 confidence) suggests ***************************
If you believe that httpd should be allowed getattr access on the index.html file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'httpd' --raw | audit2allow -M my-httpd
# semodule -X 300 -i my-httpd.pp
......
提示给出了多种解决方法:
- 修改文件上下文。
- 设置布尔值。
SELinux 问题处理思路
- 确定是否是 SELinux 引起的。
- 在做调整前,首先考虑 SELinux 是否正确的阻止了访问。例如web服务器尝试访问/home目录,如果web的内容不是用户发布的,那么发生阻止信号是正确的阻止。如果这个访问是被允许的,参考下面步骤。
- 最常见的 SELinux 问题是不正确的文件上下文。当文件是另外一个地方创建的,然后移动到新的地方,而新的地方需要新的上下文。在大多数情况,执行restorecon可以修复这个问题。这种修复问题方式对系统其他部分安全影响非常小。
- 另外一个问题可能是布尔值设置不当导致拒绝访问。例如ftpd_anon_write布尔值控制匿名ftp用户是否可以上传文件。如果如需匿名用户上传文件,需要打开这个布尔值。调整布尔值需要小心,因为对系统影响范围比较大。
- 还有可能是 端口上下文不匹配。
- 还有可能是 SELinux bug。
DHCP 服务器
DHCP 服务介绍
在大型网络中,系统静态分配IP地址面临问题:
- 确保不要同时在多个系统上使用同一个地址。
- 部署新系统通常需要手动分配其IP地址。在云环境中,实例的网络是自动化配置的。
动态主机配置协议(DHCP-Dynamic Host Configuration Protocol)提供了一种自动配置网络参数的方法,例如IP地址,默认网关,DNS服务器和域或NTP服务器。在网络中部署DHCP服务器,您可以集中控制这些参数。
DHCP有两种协议:
- 用于IPv4网络的 DHCPv4。
- 用于IPv6网络的 DHCPv6。
本课程只介绍DHCPv4。
DHCP 通信过程
- 客户端使用DHCPv4配置网络接口时,网卡将 DHCPDISCOVER 数据包发送到 255.255.255.255 广播目标。因为路由器通常不转发该广播地址,所以必须将DHCP服务器与客户端安装在同一物理网络上,以便它可以接收DHCPDISCOVER数据包。您也可以将路由器配置为DHCP中继代理,转发DHCP消息到其他网络。
- DHCP服务器收到 DHCPDISCOVER 数据包后,响应 DHCPOFFER 数据包,该数据包包含其自己的IP地址和客户端应使用的IP地址。该数据包还包括一个租用期限,以指示所提供的IP地址有效的时间,以及其他网络参数,例如默认网关和DNS服务器。
- 客户端收到DHCP服务器 DHCPOFFER 数据包后,发送 DHCPREQUEST 广播数据包,请求DHCP服务器提供的IP地址。这似乎很多余,但是网络上可能有多个DHCP服务器,或者路由器可能会将DHCPOFFER转发到多个网络。因此,客户端可能会从不同的DHCP服务器收到响应。客户端的DHCPREQUEST数据包包括接受请求的DHCP服务器的IP地址。
- DHCP服务器收到DHCPREQUEST数据包后,会发送 DHCPACK 数据包,确认客户端对客户端IP地址具有独占权限,直到租约到期为止。
- 租约到期后,重新向DHCP服务器续约。
- DHCP服务器,同意客户端续约。
在DHCP服务器上,可以使用journalctl --unit= dhcpd.service
命令来访问客户端与服务端通信消息。 以下摘录显示了客户端通过DHCP请求IP地址。
DHCPDISCOVER from 00:0c:29:26:13:b5 via eth0
DHCPOFFER on 10.1.8.101 to 00:0c:29:26:13:b5 (hosta) via eth0
DHCPREQUEST for 10.1.8.101 (10.1.8.2) from 00:0c:29:26:13:b5 (hosta) via
eth0
DHCPACK on 10.1.8.101 to 00:0c:29:26:13:b5 (hosta) via eth0
在租约到期之前,客户端会定期向服务器发送 DHCPREQUEST 数据包,以确保服务器不会收回IP地址。
多个 DHCP 服务器
尽管DHCP支持在物理网络上运行多个DHCP服务器,但不建议这么做。正常情况下,同一个物理网络中只需要一台DHCP服务器应回答客户端的请求即可。
在同一网络上运行多个服务器的情况下,当新客户端发送 DHCPDISCOVER 数据包以获取地址时,它可能会收到多个 DHCPOFFER 数据包。客户端仅接受其中一台服务器提供的配置,并广播包含该服务器IP地址的 DHCPREQUEST 数据包。其他DHCP服务器释放它们为客户端准备的IP地址。
但是,当客户端使用 DHCPREQUEST 数据包更新其IP地址时,服务器行为取决于服务器是否具有权威性。 ==非权威的DHCP服务器会忽略DHCPREQUEST数据包中不知道的地址。==当客户端发送的IP地址在权威DHCP服务器管理的地址范围内,但服务器以前不知道该IP地址时,它将拒绝该请求并发回DHCPNAK数据包。这可能意味着客户端最初是从网络上的另一台非权威的DHCP服务器获得其地址的。任何收到DHCPNAK数据包的客户端都不能再使用该地址,而必须请求一个新的地址。
使用默认配置启动DHCP服务器时,服务器不是权威服务器, 这样可以防止非权威DHCP服务器接管权威服务器提供的地址。
部署 DHCP 服务器
要配置DHCPv4服务器,请首先使用ip addr
命令确认您的网络接口配置是否指定了BROADCAST地址。
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e5:be:0f brd ff:ff:ff:ff:ff:ff
inet 10.1.8.10/24 brd 10.1.8.255 scope global ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fee5:be0f/64 scope link
valid_lft forever preferred_lft forever
服务器必须具有静态IP地址。
安装 DHCP 软件
# 安装软件包
[root@server ~ 10:34:24]# yum install -y dhcp
# 配置防火墙,放行dhcp服务
[root@server ~ 10:45:24]# firewall-cmd --add-service=dhcp
success
[root@server ~ 10:45:30]# firewall-cmd --add-service=dhcp --permanent
success
配置 DHCP 服务器
dhcpd服务使用/etc/dhcp/dhcpd.conf
配置文件。 dhcp软件包提供/usr/share/doc/dhcp-*/dhcpd.conf.example 配置文件示例。
[root@server ~ 10:45:41]# /bin/cp /usr/share/doc/dhcp-*/dhcpd.conf.example /etc/dhcp/dhcpd.conf
[root@server ~ 10:45:58]# vim /etc/dhcp/dhcpd.conf
典型的DHCP配置示例:
subnet 10.1.8.0 netmask 255.255.255.0 {
range 10.1.8.101 10.1.8.200;
option domain-name-servers 223.5.5.5, 223.6.6.6;
option domain-name "zzh.cloud";
option routers 10.1.8.2;
option broadcast-address 10.1.8.255;
default-lease-time 600;
max-lease-time 7200;
}
(只留这两段)
配置说明:
- authoritative,指示服务器对其所管理的子网具有权威性。
- subnet,提供的子网详。
- range,指定服务器在该范围内分配IP地址。
- option routers,指定服务器提供默认网关地址。
- option domain-name-servers,指定服务器提供DNS名称服务器。
- option domain-search,指定服务器提供DNS域搜索列表。
- default-lease-time,提供网络信息默认租期,如果客户端不要求任何特定的租期。单位秒。
- max-lease-time,指示服务器可以从客户端请求接受的最大租期。单位秒。
客户端系统上的NetworkManager使用domain-name-servers和domain-search更新resolv.conf文件中的nameserver和search参数。
验证 DHCP 配置
# 验证配置文件语法
[root@server ~ 11:35:01]# dhcpd -t
Internet Systems Consortium DHCP Server 4.2.5
Copyright 2004-2013 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file
启用并启动服务
# 启用并启动服务
[root@server ~ 11:35:13]# systemctl enable dhcpd --now
# 查看服务状态
[root@server ~ 11:35:25]# systemctl status dhcpd
配置 DHCP 客户端
# 添加一个自动获取ip连接,假设网卡设备名为ens192
[root@client ~ 11:47:03]# nmcli connection add con-name dynamic type ethernet ifname ens37
[root@client ~ 11:49:19]# nmcli connection up dynamic
# 验证
[root@client ~ 11:49:33]# ip addr show ens37
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:be:1f:78 brd ff:ff:ff:ff:ff:ff
inet 10.1.8.101/24 brd 10.1.8.255 scope global noprefixroute dynamic ens37
valid_lft 592sec preferred_lft 592sec
inet6 fe80::6b45:27d5:26c0:e8ac/64 scope link noprefixroute
valid_lft forever preferred_lft forever
基于 MAC 地址预留IP地址
在配置文件中,host声明可以将MAC地址绑定到IP地址。 此配置对于始终为特定系统的网络接口提供相同的IP地址特别有用,尤其是Web或数据库系统之类的服务器。
客户端MAC地址查看
[root@client ~]# ip link show ens192
3: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 00:0c:29:26:13:b5 brd ff:ff:ff:ff:ff:ff
altname enp11s0
在以下示例中,服务器始终为MAC地址是00:0c:29:26:13:b5
的系统分配10.1.8.20地址。
在/etc/dhcp/dhcpd.conf
最后添加如下内容:
host client.linux.fun {
hardware ethernet 00:0c:29:26:13:b5;
fixed-address 10.1.8.30;
}
重启服务
[root@server ~]# systemctl restart dhcpd
客户端验证
# 激活连接
[root@client ~]# nmcli connection up dynamic
# 验证
[root@client ~]# ip addr show ens192
3: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:26:13:b5 brd ff:ff:ff:ff:ff:ff
altname enp11s0
inet 10.1.8.30/24 brd 10.1.8.255 scope global dynamic noprefixroute ens192
valid_lft 245sec preferred_lft 245sec
inet6 fe80::95db:2216:1a36:615/64 scope link noprefixroute
valid_lft forever preferred_lft forever
DNS 服务器
DNS 服务介绍
DNS 服务介绍
DNS(Domain Name System,域名系统)服务是一种用于将域名转换为IP地址的分布式数据库服务。它是互联网的核心服务之一,使得用户能够通过易于记忆的域名来访问网站和其他网络服务,而无需记住复杂的IP地址。
DNS 也是一个存储网络主机和资源目录的分层命名系统。 目录中的信息将网络名称映射到不同资源记录。
- 根域:DNS层次结构最顶层,使用独立的"."表示。
- 顶级域:DNS层次结构第二层,例如**.com**,.net和**.org**等域。
- 二级域:DNS层次结构第三层,例如**laoma.cloud **和 redhat.com等域。由各个组织使用。
- 以此类推。
学习DNS层次结构前,首先要搞清楚DNS层次结构中一些术语,例如domain,subdomain和zone等。
Domain
domain 是 resource records 的集合,该集合以通⽤名结尾,表示 DNS 命名空间的整个⼦树,如 laoma.cloud。
top-level domain(TLD- 顶级域)由 Internet Assigned Numbers Authority(IANA-互联网号码分配机构)管理,并负责委派顶级域。
常见的TLD类型:
- Generic TLDs(gTLD-通用顶级域名),最初是按主题组织的,包括.com,.edu和.net等。
- Country code TLDs(ccTLD-国家代码顶级域名),根据ISO 3166-1标准在国家范围上组织的,并包括.us,.uk,.cn和.ru之类的域。
其他顶级域参考顶级域名参考[根域数据库][https://www.iana.org/domains/root/db]。
Subdomain
Subdomain 是另一个域的完整子树的域。 在讨论两个域之间的关系时使用此术语。 例如,lab.laoma.cloud是laoma.cloud的子域,而laoma.cloud是**.com的子域。 我们也可以将laoma.cloud称为第二级域,并将lab.laoma.cloud**称为第三级域。
Zone
Zone是特定名称服务器直接负责的域。 它可能是整个域,也可能只是域的一部分。Zone可以将部分或全部子域都委派给另一个名称服务器或多个名称服务器。
例如,root名称服务器对root zone具有权威性,但它们将.com域的职责委派给其他名称服务器,这些名称服务器为.com区域提供权威性应答。 这些服务器还可以继续将责任委派给其他名称服务器。
DNS 查询
主机的 DNS 查询主要有两种方式:递归查询和迭代查询。
DNS 查询时,DNS 请求报头部
的 RD 字段
决定了查询类型:
- RD 为
1
=> 递归查询,默认查询方式。 - RD 为
0
=> 迭代查询。
递归查询:以本地名称服务器为中心,DNS 客户端只是发出原始的域名查询请求报文,然后就一直处于等待状态,直到本地名称服务器发来了最终的查询结果。此时的本地名称服务器就相当于中介代理 的作用。
迭代查询:以DNS客户端自己为中心。所有查询工作全部是 DNS 客户端自己进行。DNS客户
会按照顺序向本地名称服务器 、一级名称服务器、二级名称服务器、权威名称服务器发出查询 DNS 的 请求查询报文,这个过程中每一级服务器就会返回一个能解答这个查询的下一个名称服务器列表 A,获取到下个查询列表信息 A 后 DNS 客户 会再向返回的列表 A 中发出请求,直到找到最终负责所查域名的名称服务器,从它得到最终结果。
有些DNS服务器,为了减轻自己的负载,则会配置禁止使用递归查询,则客户端只能使用递归查询。
两者主要区别:
- 递归查询 以 本地名称服务器 为中心进行查询
- 迭代查询 以
DNS客户端自己
为中心查询。
DNS 迭代查询
**迭代查询,也叫迭代解析。**使用迭代解析方式时,**所有的查询工作都是由 DNS 客户自己进行的。**如果它所配置的主名称服务器(如 Windows 系统中的 首选 DNS 服务器)不能解析的话,客户端还会继续向所配置的其它名称服务器(如 Windows 系统中的 备用 DNS 服务器)查询。
如果考虑了本地名称服务器的缓存技术(在 DNS 服务器上对一定数量查询过的记录保存一定时间,这样后面查询同样的域名信息时就可直接从缓存中调出来,以加速查询效率)的话,迭代名称解析的基本流程如下(在此仅以首先 DNS 服务器作为本地名称服务器为例,与其它备用 DNS 服务器的解析流程完全一样):
- DNS 客户端向本机配置的本地名称服务器发出 DNS 域名查询请求。
- 本地名称服务器收到请求后,先查询本地的缓存。
- 如果有该域名的记录项,则本地名称服务器就直接把查询的结果返回给客户端。
- 如果本地缓存中没有该域名的记录,则向 DNS 客户端返回一条 DNS 应答报文,报文中会给出一些参考信息,如本地名称服务器上的根名称服务器地址等。
- DNS 客户端在收到本地名称服务器的应答报文后,会根据其中的根名称服务器地址信息,向对应的根名称服务器再次发出与前面一样的 DNS 查询请求报文。
- 根名称服务器在收到 DNS 查询请求报文后,通过查询自己的 DNS 数据库得到请求 DNS 域名中顶级域名所对应的顶级名称服务器信息,然后以一条 DNS 应答报文返回给 DNS 客户端。
- DNS 客户端根据来自根名称服务器应答报文中的对应顶级名称服务器地址信息,向该顶级名称服务器发出与前面一样的 DNS 查询请求报文。
- 顶级名称服务器在收到 DNS 查询请求后,先查询本地的缓存:
- 如果有所请求的 DNS 域名的记录项,则直接把对应的记录项返回给 DNS 客户端。
- 否则,通过查询后把对应域名中二级域名所对应的二级名称服务器地址信息以一条 DNS 应答报文返回给 DNS 客户端。
- DNS 客户端继续按照步骤 5 与步骤 6 的方法分别向三级、四级名称服务器查询,直到查到最终的权威名称服务器返回到最终的记录。
如果在上述步骤中对应域名的权威名称服务器都说找不到对应的域名记录,则会向 DNS 客户端返回一条查询失败的 DNS 应答报文,称为负响应。当然,如果这个权威名称服务器上配置了指向其它名称服务器的转发器,则权威名称服务器还会在转发器指向的名称服务器上进一步重复上述步骤查询。另外,如果 DNS 客户端上配置了多个 DNS 服务器,则还会继续向其它 DNS 服务器查询的。
DNS 查找到这里就基本来可以获取域名对应的 IP 了,除非需要查找的域名没有配置 IP 则查询失败。
DNS 迭代查询-示例
假设客户端访问站点www.example.com
,那么 DNS 客服端的查询路径如下:
- DNS 客户端向所配置的本地名称服务器发出解析
www.example.com
域名的 DNS 请求报文。 - 本地名称服务器收到 客户端的 DNS 查询请求报文后,先查询本地缓存。假设没有查到该域名对应记录,则本地名称服务器把所配置的根名称服务器
a.rootserver.net
地址信息以 DNS 应答报文返回给 DNS 客户端。 - DNS 客户端在收到本地名称服务器的 DNS 应答报文后,根据其中给出的根名称服务器地址信息,向对应的根名称服务器再次发送解析
www.example.com
域名的 DNS 请求报文)。 - 根名称服务器在收到 DNS 查询请求后,通过查询得到
.com
顶级域名所对应的顶级名称服务器,然后把查询到的对应顶级域名信息以一条 DNS 应答报文返回给 DNS 客户端。 - DNS 客户端在收到根名称服务器的 DNS 应答报文,得到
.com
顶级域名所对应的顶级名称服务器地址后,再次向对应的顶级名称服务器发送一条解析www.example.com
域名的的 DNS 请求报文。 .com
顶级名称服务器在收到 DNS 客户端的 DNS 查询请求报文后,先查询本地的缓存,假设也没有该域名的记录项,则查询example.com
所对应的二级名称服务器,然后把查询到的对应二级域名信息以一条 DNS 应答报文返回给 DNS 客户端。- DNS 客户端在收到
.com
顶级名称服务器的 DNS 应答报文,得到example.com
二级域名所对应的二级名称服务器地址后,再次向对应的二级名称服务器发送一条解析www.example.com
域名的 DNS 请求报文。 example.com
二级名称服务器在收到 DNS 客户端的 DNS 查询请求报文后,也先查询本地的缓存。假设也没有该域名的记录项,则查询www.example.com
所对应的权威名称服务器(因为这个名称服务器已包括了整个域名www.example.com
所在区域),然后把查询到的对应权威域名信息以一条 DNS 应答报文返回给 DNS 客户端。- DNS 客户端在收到
example.com
二级名称服务器的 DNS 应答报文,得到www.example.com
三级域名所对应的权威名称服务器地址后,再次向对应的权威名称服务器发送解析www.example.com
域名的 DNS 请求报文。 - 权威名称服务器
www.example.com
在收到 DNS 客户端的 DNS 查询请求报文后,在它的 DNS 区域数据库中查找,最终得出了www.example.com
域名所对应的IP 地址
。然后向 DNS 客户端返回一条 DNS 应答报文。这样 DNS 客户端获取 IP 地址后就可以正常访问这个网站了。
DNS 递归查询
递归查询是默认的 DNS 解析方式。在这种解析方式中,如果客户端配置的本地名称服务器遇到不能解析的,则后面的查询全由本地名称服务器代替DNS 客户端进行查询,直到本地名称服务器从权威名称服务器得到了正确的解析结果,然后由本地名称服务器告诉 DNS 客户端查询的结果。
在递归查询过程中,一直是以本地名称服务器为中心的,DNS 客户端只是发出原始的域名查询请求报文,然后就一直处于等待状态,直到本地名称服务器返回最终的查询结果。此时的本地名称服务器就相当于中介代理的作用。
如果考虑了本地名称服务器的缓存技术(在 DNS 服务器上对一定数量查询过的记录保存一定时间,这样后面查询同样的域名信息时就可直接从缓存中调出来,以加速查询效率),则递归解析的基本流程如下(在此仅以首先 DNS 服务器作为本地名称服务器为例,与其它备用 DNS 服务器的解析流程完全一样):
- 客户端向本机配置的本地名称服务器发出 DNS 域名查询请求。
- 本地名称服务器收到请求后,先查询本地的缓存,如果有该域名的记录项,则本地名称服务器就直接把查询的结果返回给客户端;如果本地缓存中没有该域名的记录,则本地名称服务器再以 DNS 客户端的角色发送与前面一样的 DNS 域名查询请求发给根名称服务器。
- 根名称服务器收到 DNS 请求后,把所查询得到的所请求的 DNS 域名中顶级域名所对应的顶级名称服务器地址返回给本地名称服务器。
- 本地名称服务器根据根名称服务器所返回的顶级名称服务器地址,向对应的顶级名称服务器发送与前面一样的 DNS 域名查询请求。
- 顶级名称服务器在收到 DNS 查询请求后,也是先查询本地的缓存,如果有所请求的 DNS 域名的记录项,则直接把对应的记录项返回给本地名称服务器,然后再由本地名称服务器返回给 DNS 客户端,否则向本地名称服务器返回所请求的 DNS 域名中的二级域名所对应的二级名称服务器地址。
- 本地名称服务器根据根名称服务器所返回的二级名称服务器地址,向对应的二级名称服务器发送与前面一样的 DNS 域名查询请求。
- 二级名称服务器在收到 DNS 查询请求后,也是先查询本地的缓存,如果有所请求的 DNS 域名的记录项,则直接把对应的记录项返回给本地名称服务器,然后再由本地名称服务器返回给 DNS 客户端,否则向本地名称服务器返回所请求的 DNS 域名中的三级域名所对应的三级名称服务器地址。
- 就这样本地名称服务器重复步骤 6 和步骤 7 的方法一次次地向三级、四级名称服务器等查询,直到最终的对应域名所在区域的权威名称服务器返回到最终的记录给本地名称服务器。
- 然后再由本地名称服务器返回给 DNS 客户,同时本地名称服务器会缓存本次查询得到的记录项。
如果在上述步骤中对应域名的权威名称服务器都说找不到对应的域名记录,则会向 DNS 客户端返回一条查询失败的 DNS 应答报文。当然,如果这个权威名称服务器上配置了指向其它名称服务器的转发器,则权威名称服务器还会在转发器指向的名称服务器上进一步重复上述步骤查询。另外,如果 DNS 客户端上配置了多个 DNS 服务器,则还会继续向其它 DNS 服务器查询的。
简单的讲,递归查询步骤;
客户端
向本机配置的本地名称服务器发出 DNS 域名查询请求,发出请求后客户端
一直处于等待状态,等待本地名称服务器返回查询结果。- 本地名称服务器收到 DNS 请求后,先查询本地的缓存,查到存在该域名记录项立即返回结果,否则本地名称服务器不断向 DNS 名称服务器发送 DNS 请求查询,直到查到改域名对应的权威名称服务器并获得记录结果。
- 本地名称服务器 解析到结果后将结果返回给
客户端
。
DNS 递归查询-示例
假设客户端访问站点www.example.com
,那么 DNS 客服端的查询路径如下:
- DNS 客户端 向所配置的本地名称服务器
dns.example.com
发出解析www.example.com
域名的 DNS 请求报文。 - 本地名称服务器收到请求后,先查询本地缓存。假设没有查到该域名对应记录,则本地名称服务器向所配置的根名称服务器
a.rootserver.net
发出解析请求解析www.example.com
域名的 DNS 请求报文(相当于对本地名称服务器说:“请给我www.example.com
所对应的 IP 地址”)。 - 根名称服务器收到 客户端的 DNS 查询请求报文后,通过查询得到
.com
顶级域名所对应的顶级名称服务器,然后向本地名称服务器返回一条应答报文(相当说“我不知道www.example.com
域名所对应的 IP 地址,但我现在告诉你.com
域名所对应的顶级名称服务器地址”)。 - 本地名称服务器在收到根名称服务器的 DNS 应答报文,得到
.com
顶级域名所对应的顶级名称服务器地址后,再次向对应的顶级名称服务器发送一条请求解析www.example.com
域名的 DNS 请求报文。 .com
顶级名称服务器在收到 DNS 请求报文后,先查询本地的缓存,假设也没有该域名的记录项,则查询example.com
所对应的二级名称服务器,然后也向本地名称服务返回一条 DNS 应答报文(相当于对本地名称服务器说:“我不知道www.example.com
域名所对应的 IP 地址,但我现在告诉你example.com
域名所对应的二级名称服务器地址”。- 本地名称服务器在收到
.com
顶级名称服务器的 DNS 应答报文,得到example.com
二级域名所对应的二级名称服务器地址后,再次向对应的二级名称服务器发送一条请求解析www.example.com
域名的 DNS 请求报文。 example.com
二级名称服务器在收到 DNS 请求报文后,也先查询本地的缓存,假设也没有该域名的记录项,则查询www.example.com
所对应的权威名称服务器,然后也向本地名称服务器返回一条 DNS 应答报文(相当于本地名称服务器说:“我不知道www.example.com
域名所对应的 IP 地址,但我现在告诉你www.example.com
域名所对应的权威名称服务器地址”)。- 本地名称服务器在收到
example.com
二级名称服务器的 DNS 应答报文,得到www.example.com
三级域名所对应的权威名称服务器地址后,再次向对应的权威名称服务器发送一条请求解析www.example.com
域名的 DNS 请求报文。 www.example.com
权威名称服务器在收到 DNS 请求后,在它的 DNS 区域数据库中查找,最终得出了www.example.com
域名所对应的 IP 地址。然后向本地名称服务器返回到条 DNS 应答报文(相当于对本地名称服务器说:“www.example.com
域名的 IP 地址为 xxx.xxx.xxx.xxx”)。- 本地名称服务器在收到权威名称服务器的应答报文后,向 DNS 客户端返回一条 DNS
应答报文
,告诉 DNS 客户端所得到的www.example.com
域名的IP 地址
。这样 DNS 客户端就可以正常访问这个网站了。
DNS 资源记录
DNS区域中的DNS resource record (RR-DNS资源记录)条目指定有关区域中特定名称或对象的信息。 资源记录格式如下:
owner-name TTL class type data
server.zzh.cloud. 300 IN A 192.168.1.10
记录说明:
Field name | Content |
---|---|
owner-name | The name for this resource record. |
TTL | The Time To Live of the resource record in seconds. This specifies how long this resource record should be cached by DNS resolvers. |
class | The “class” of the record, almost always IN (“internet”). |
type | The type of information stored by this record. For example, an A record maps a host name to an IPv4 address. |
data | The data stored by this record. The exact format varies by record type. |
A 资源记录
A资源记录将主机名映射到IPv4地址。
server.laoma.cloud. 86400 IN A 172.25.254.254
AAAA 资源记录
AAAA资源记录(4A记录)将主机名映射到IPv6地址。
a.root-servers.net. 604800 IN AAAA 2001:503:ba3e::2:30
CNAME 资源记录
CNAME资源记录将一个名称别名为另一个名称(规范名称),该名称应具有A或AAAA记录。
当DNS解析程序收到对查询的CNAME记录时,它将使用规范名称而不是原始名称重新发出查询。
CNAME记录的数据字段可以指向DNS中任何区域的名称,无论该区域是内部的还是外部的: CNAME记录可能指向具有CNAME的名称,但CNAME记录链最终必须解析为A或AAAA记录的名称。
- 通常,避免将CNAME记录指向其他CNAME记录。 CNAME会使查找效率降低,更脆弱,并且我们可能会意外地创建一个指向彼此的CNAME记录循环。
- CNAME记录链有合法用途。 例如,它们与Content Delivery Network(CDN)结合使用。 NS和MX记录不得指向带有CNAME记录的名称,而是使用带有A和/或AAAA资源记录的名称。
PTR 资源记录
PTR或pointer资源记录将IPv4或IPv6地址映射到主机名。 它们用于反向DNS解析。
PTR记录以一种类似于主机名的特殊格式对IP地址进行编码。
- 对于IPv4地址,该地址被颠倒,以最具体的部分开始,然后视为in-addr.arpa域的子域中的主机。
- 对于IPv6地址,该地址在半字节边界(每个十六进制数字)上划分为子域,并设置为ip6.arpa域的子域。
4.0.41.198.in-addr.arpa. 785 IN PTR a.root-servers.net.
0.3.0.0.2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.e.3.a.b.3.0.5.0.1.0.0.2.ip6.arpa. 86400 IN PTR a.root-servers.net.
该语法可能看起来很奇怪,但是它简化了将地址范围的责任委托给其他DNS管理员的情况。
NS 资源记录
NS或名称服务器资源记录将域名映射到对其DNS区域具有权威性的DNS名称服务器。 该区域的每个公共权威名称服务器都必须具有NS记录。
说明:
- 其中两个NS记录用于10.1.8.0/16网络和fde2:6484:1e09::/48网络的反向查找。
- classroom.laoma.cloud上的区域可能包含NS记录,以将对192.168.254.0/24和fde2:6484:1e09::1:: /64的反向查找委托给另一个名称服务器。
NS记录映射的名称必须有A或4A记录。
SOA 资源记录
SOA资源记录,也叫做起始授权机构记录,提供有关DNS区域如何运行的信息。 每个区域必须有一个SOA记录。
- 指定了一个序列号
- 指定其他权威性名称服务器用来确定何时从主要名称服务器传输区域资源记录的各种超时时间。
记录值说明:
值 | 示例 | 含义 |
---|---|---|
MNAME | classroom.laoma.cloud. | 该名称服务器是这个区域的主要名称服务器,负责维护区域资源记录。 |
RNAME | root.classroom.laoma.cloud. | 该区域中负责人邮件地址,@用.代替,例如root@classroom.laoma.cloud. |
SERIAL | 2015071700 | 该区域版本号,随着区域中记录更改而增加。 |
REFRESH | 3600 | 从名称服务器向主名称服务器更新数据频率。单位秒。 |
RETRY | 300 | 在重试失败的刷新前,应当等待的时间间隔。单位秒。 |
EXPIRE | 604800 | 如果刷新失败,从服务器在停止其旧的区域副本响应查询之前等待的时间。单位秒。 |
MINIMUM | 60 | 如果解析器查找某个名称,并且该名称不存在,解析器应将“记录不存在”这一信息缓存的时间。单位秒。 |
MX 资源记录
MX资源记录将域名映射到接受该域的电子邮件的邮件交换(mail exchange)。邮件服务器故障时,提供负载平衡和冗余的邮件服务器帮助路由电子邮件。
该记录类型的数据是用于确定在多个MX记录之间选择的优先级(首选最低),以及用于该名称的邮件交换的主机名。
laoma.cloud. 86400 IN MX 10 classroom.laoma.cloud.
laoma.cloud. 86400 IN MX 10 mail.laoma.cloud.
laoma.cloud. 86400 IN MX 100 mailbackup.laoma.cloud.
TXT 资源记录
TXT 资源记录将名称映射到编码为可打印ASCII字符的任意文本。 它们通常用于提供用于各种电子邮件身份验证方案(例如SPF,DKIM和DMARC)的数据,以验证域所有权(例如,用于Google和Facebook),以及用于其他目的。
lwn.net. 27272 IN TXT "google-site-verification: sVlx-S_z1es5DfNSUNXrqr3n9Y4F7tOr7HNVMKUGs"
lwn.net. 27272 IN TXT "v=spf1 a:mail.lwn.net a:prod.lwn.net a:git.lwn.neta:ms.lwn.net -all"
SRV 资源记录
SRV 资源记录可帮助客户端找到域中支持特定服务的主机。
示例:表明存在一个可以使用TCP传输协议(_tcp
)与LDAP连接的LDAP服务器(_ldap
),该主机属于域laoma.cloud。 LDAP服务器是server.laoma.cloud,正在侦听端口389,优先级为0,权重为100(如果客户端接收到多个SRV记录,则控制选择哪个服务器)。
_ldap._tcp.laoma.cloud. 86400 IN SRV 0 100 389 server0.laoma.cloud.
主机和资源记录
⼀个主机,无论是客户端还是服务器,都具有以下 DNS 资源记录:
- ⼀个或多个A或AAAA记录
- 用于将其IP地址反向映射到名称的PTR记录
- ⼀个或多个CNAME记录(可选)
DNS zone 还具有以下资源记录:
- 唯一的 SOA 记录
- 每个权威名称服务器的 NS 记录
- ⼀个或多个MX记录(可选)
- 用于在域中查找服务的⼀个或多个SRV记录(可选)
配置权威名称服务器
权威名称服务器架构
权威名称服务器存储 DNS 资源记录,并为其管理的区域提供权威答案。
Linux中的Berkeley Internet Name Domain(BIND)软件可以实现权威的名称服务器。 BIND允许我们将权威服务器配置为区域的主要服务器或辅助服务器。区域中只有一台主服务器,但可具有多台辅助服务器。 辅助服务器通过请求区域传输,定期从主服务器下载区域信息的最新版本。 它们执行区域传输的频率以及如何知道其数据是否过时由区域的SOA资源记录控制。
名称服务器可以是某些区域的主要服务器,同时也可以其他区域的辅助服务器。
当前BIND服务器角色为master和slave,以后会变更为primary和secondary(例如,BIND 9.16 ESV版本)。
注册新的DNS域时,必须提供该域的所有公共权威名称服务器的名称和IP地址。我们的注册服务商将该信息放在父域的区域文件中(如NS,A和AAAA记录),以便DNS解析器可以找到我们的名称服务器。为了帮助确保可靠性,我们应该至少有两个公共DNS服务器,并且它们应位于不同的站点,以避免由于网络故障而造成的中断。
并非所有权威服务器都必须是公共的。例如,使用primary服务器来管理区域文件,并将区域信息发布到权威的secondary服务器。primary服务器是私有的,而secondary服务器是面向公众的,从而为外部客户端提供权威性的答案,保护我们的primary服务器免受攻击。
架构示例1:外部客户端查找laoma.cloud
**查找过程:**客户的仅缓存名称服务器首先查询其中一个根名称服务器。 它定向到负责.com域的名称服务器池。 这些服务器之一使用laoma.cloud域的NS记录进行响应,因此仅缓存名称服务器会查询其中一个面向公众的辅助名称服务器。
架构示例2:内部客户端查找laoma.cloud
更好的方法是提供内部slave权威服务器。 查询本地域的记录时,消除了外部查询,而且更加安全。
安装 BIND
通过安装bind软件包来安装BIND。 名称服务器本身作为named服务运行。 bind包将HTML和PDF格式的BIND文档在安装在/usr/share/doc/bind/目录。
[root@server ~ 14:33:01]# yum install -y bind bind-utils
软件包说明:
- bind,服务器软件包。
- bind-utils,客户端软件包。
bind软件包默认将服务配置为基本的递归缓存名称服务器。 它被配置为localhost、相关域和地址的primary服务器,以减轻根名称服务器的负担。 此默认配置还限制了对本地主机上程序的访问。 它侦听IPv4和IPv6环回接口的端口53 UDP/TCP(127.0.0.1和:: 1)上的连接。
配置 BIND
named主要配置文件是**/etc/named.conf**。 该文件控制BIND的基本操作,由root用户(named组)拥有,具有八进制权限0640,并且具有named_conf_t SELinux类型。
配置文件还指定了每个区域的配置文件位置,这些文件通常保存在**/var/named**中。
配置DNS服务器需要执行以下步骤:
- 配置地址匹配列表。
- 配置named侦听的IP地址。
- 配置客户端的访问控制。
- 配置zone。
- 编写区域文件。
定义地址匹配列表
在/etc/named.conf文件的开头,可以使用acl指令定义地址匹配列表。 acl指令不是用于控制客户端对服务器的访问,而是使用它们来定义IP地址和网络列表。
它们提供别名,可以与访问控制指令和其他配置选项一起使用,并使更新配置文件更加容易。
条目可以是完整的IP地址或网络,用尾点(10.1.8.)或CIDR表示法(192.168.0/24或2001:db8::/32)表示,也可以使用先前定义的地址匹配列表的名称。
请考虑以下ACL定义:
[root@server ~]# vim /etc/named.conf
acl trusted-nets { 192.168.10.0/24; 192.168.20.0/24; };
acl classroom { 10.1.8.0/24; };
在其值中使用classroom的任何指令都将与10.1.8.0/24网络和192.168.1.21中的主机匹配。acl语句定义的地址集可以被多个指令引用。
named中内置了四个预定义的ACL:
ACL | Description |
---|---|
none | Matches no hosts. |
any | Matches all hosts. |
localhost | Matches all IP addresses of the DNS server. |
localnets | Matches all hosts from the DNS server’s local subnets. |
配置 named 侦听的IP地址
我们可以在/etc/named.conf文件options块中指定许多全局设置。listen-on和listen-on-v6指令,指定了命名监听的接口和端口。
- listen-on选项采用以分号分隔的IPv4地址列表。
- listen-on-v6使用IPv6地址。
示例1:将BIND配置为侦听10.1.8.10 IPv4地址和默认的IPv4回送地址。
[root@server ~]# vim /etc/named.conf
options {
listen-on port 53 { 127.0.0.1; 10.1.8.10; };
......
};
示例2:结合acl指令配置。
acl interfaces { 127.0.0.1; 10.1.8.10; };
acl interfacesv6 { ::1; 2001:db8:2020::5300; };
options {
listen-on port 53 { interfaces; };
listen-on-v6 port 53 { interfacesv6; };
...output omitted...
};
配置客户端的访问控制
我们可以在/etc/named.conf文件options块中使用以下三个指令配置控制访问:
-
allow-query,控制所有查询。 默认情况下,allow-query设置为localhost,对于公开权威服务器必须定义
allow-query { any; };
允许互联网托管者从他们那里获取信息。 -
allow-recursion,控制递归查询。 权威服务器不应允许递归查询, 防止服务器被用于DNS放大分布式拒绝服务攻击,并更好地保护其免受缓存中毒攻击。
配置此功能最简单的方法是完全关闭递归:
options { ...... recursion no; ...... };
如果必须允许受信任的客户端执行递归,则可以打开递归并为这些特定主机或网络设置allow-recursion:
options { ...... recursion yes; allow-recursion { trusted-nets; }; ...... };
-
allow-transfer,控制区域转移(Zone Transfer)。 区域转移允许客户端获取我们区域中所有数据的转储。 区域转移应该受到限制,否则攻击者很容易快速获取我们区域中的所有资源记录。
我们的主服务器必须配置允许转移,以允许我们的辅助服务器执行区域转移。 我们应该禁止其他主机执行区域传输,允许localhost执行区域传输以帮助进行故障排除。
可以使用dig命令查询该区域的AXFR(Zone Transfer)记录:
[user@host ~]$ dig axfr @classroom.laoma.cloud laoma.cloud
实验环境采用如下配置:
[root@server named 16:07:53]# vim /etc/named.conf
......
options {
# 修改listen-on
listen-on port 53 { 127.0.0.1; 10.1.8.10; };
......
# 修改allow-query
allow-query { any; };
};
......
(此处zzhpersonal.com为域名)
配置 zone
示例:以下named.conf块将服务器配置为承载laoma.cloud及其相应的反向查找区域8.1.10.in-addr.arpa的主要区域文件。 它使用从ACL标识example.net服务器中检索到的区域文件,充当example.net域的辅助服务器。
[root@server ~]# vim /etc/named.conf
......
# 最后添加如下内容
zone "zzhpersonal.com" IN {
type master;
file "zzhpersonal.com.zone";
};
zone "8.1.10.in-addr.arpa" IN {
type master;
file "10.1.8.zone";
};
配置说明:
- type,指定服务器角色。
- file,指定相对路径名。 相对路径由 options 块中的 directory 指令设置。
创建区域文件
辅助区域文件应保存在/var/named/slaves中。辅助服务器启动时,会将其缓存的区域版本与主服务器上的当前版本进行比较:如果区域文件版本是最新的,则使用该区域文件; 如果区域文件版本不是最新的或文件不存在,则named执行区域传输并将结果缓存在该文件中。
BIND 应该能够读取这些区域文件,但不能写入它们。 这些文件应归root用户和named组所有,以便守护程序在某种程度上受到损害时不能更改它们。
[root@server ~ 14:58:14]# touch /var/named/zzh.cloud.zone /var/named/10.1.8.zone
[root@server ~ 14:58:54]# chmod 640 /var/named/*.zone
[root@server ~ 14:59:15]# chown root:named /var/named/*.zone
# 如果系统开启了selinux功能,执行下面命令设置文件标签
[root@server ~ 14:59:37]# chcon -t named_zone_t /var/named/*.zone
编辑区域文件格式
BIND区域文件是一个文本文件:
- 每行包含一个指令或资源记录。
- 如果资源记录的数据中包含括号,则它可以跨越多行。
- 在同一物理行上的分号(;)右侧的所有内容均被注释掉。
区域文件可以以**$TTL**指令开头,该指令为任何未列出的资源记录设置默认的TTL。 这使我们可以一次为许多资源记录调整TTL。 无需编辑整个文件。 如果TTL是数字,则以秒为单位。
$TTL 3600
在数字后面可以跟单个字母指定其他时间单位:
- M表示分钟(1M为60)
- H小时(1H是3600)
- D天(1D为86400)
- W数周(1W是604800)
每个区域文件仅包含一个SOA(授权开始)资源记录。
示例:example.com域SOA资源记录
- 定义区域的名称(在此示例中为example.com),后跟
IN SOA
,标识记录的类别和类型(互联网SOA记录)。 - 此区域的主要名称服务器
primary.example.com
的名称。 - 该区域负责方的联系电子邮件地址。地址中的第一个点(.)被视为@,
root.example.com.
代表root@example.com.
。 - 代表文件修订的序列号。 每次文件更改时,必须手动增加序列号值。
- 辅助服务器应多久查询一次主服务器,以查看是否需要刷新区域。
- 如果辅助务器刷新失败,则应尝试尝试重新连接的频率。
- 在放弃之前,辅助服务器应尝试重新连接到无响应的主要服务器的时间。 发生这种情况时,辅助服务器将假定该区域不再存在,并停止回答该区域的查询。
- 其他名称服务器缓存来自该区域的NXDOMAIN记录的时间。
添加记录
正向记录,将名称映射到IP地址和其他记录。该区域文件必须具有:
- SOA记录。
- 每个公用名称服务器的NS记录。
- 该区域的其他A,AAAA,CNAME,MX,SRV和TXT记录。
示例:laoma.cloud域
[root@server ~ 15:05:27]# vim /var/named/zzhpersonal.com.zone
$TTL 3600
@ IN SOA dns.zzhpersonal.com. root.zzhpersonal.com. (
42 ; serial
3H ; secondary refresh
15M ; secondary retry
1W ; secondary timeout
15M ; minimum cache TTL for negative answers
)
IN NS dns.zzhpersonal.com.
dns IN A 10.1.8.10
server IN A 10.1.8.10
student IN CNAME client.zzhpersonal.com.
client IN A 10.1.8.11
www 30 IN A 10.1.8.200
@ IN MX 10 mail.zzhpersonal.com.
mail IN A 10.1.8.253
示例说明:
- @字符代表区域的名称,避免重复键入,并且在某些情况下允许重复使用。
- 区域文件中的SOA记录与前面的示例中的SOA记录是等效的。
- 如果记录的名称为空,则其值与前面的记录相同。
因此,在前面的示例中:
- 第一个记录是laoma.cloud.的SOA记录
- 接下来的记录是laoma.cloud.的NS记录
- 然后有一个dns的A记录。
- 然后有一个server的A记录。
- 然后有一个student的CNAME记录。
- 然后有一个client的A记录。
- 然后有一个域的MX记录。
- 然后有一个mail的A记录。
任何不以点号结尾的名称均被视为部分主机名,应将区域名称添加为完全合格的域名。 换句话说,server等效于server.laoma.cloud.
。
反向记录,将IP地址映射到主机名。该区域文件必须具有:
- SOA记录
- NS记录
- PTR记录。
示例:8.1.10.inaddr.arpa区域
[root@server ~ 15:14:26]# vim /var/named/10.1.8.zone
$TTL 3600
@ IN SOA dns.zzhpersonal.com. root.zzhpersonal.com. (
42 ; serial
3H ; secondary refresh
15M ; secondary retry
1W ; secondary timeout
15M ; minimum cache TTL for negative answers
)
IN NS dns.zzhpersonal.com.
10 IN PTR server.zzhpersonal.com.
10 IN PTR dns.zzhpersonal.com.
11 IN PTR client.zzhpersonal.com.
11 IN PTR student.zzhpersonal.com.
200 IN PTR www.zzhpersonal.com.
253 IN PTR mail.zzhpersonal.com.
IP地址的“名称”不需要包括其余的域名,1代替1.8.1.10.in-addr.arpa.。
委派子域
-
将子域条目配置在父域中。
servera.lab IN A 10.1.8.150 serverb.lab IN A 10.1.8.151
-
委派子域给其他名称服务器。
示例:将support.laoma.cloud.子域委派给
ns1.support.laoma.cloud.
和ns2.support.laoma.cloud.
。support IN NS ns1.support.laoma.cloud. IN NS ns2.support.laoma.cloud.
如果这些名称服务器的名称本身不在support.laoma.cloud域中,必须在父域laoma.cloud中为每个子域的名称服务器添加glue (粘合)记录(A或AAAA资源记录):
ns1.support.laoma.cloud. IN A 192.100.100.10 ns2.support.laoma.cloud. IN A 192.100.100.11
验证配置
在重新加载或重新启动named之前,应该验证/etc/named.conf文件和区域文件的语法。
-
named-checkconf,验证 /etc/named.conf。
[root@server ~]# named-checkconf # 如果配置文件不在默认位置,使用一下命令命令验证 [root@server ~]# named-checkconf /media/backups/named.conf
-
named-checkzone zone zone-file,通过zone-file验证zone。
[root@server ~]# named-checkzone zzhpersonal.com /var/named/laoma.cloud.zone zone zzhpersonal.com/IN: loaded serial 42 OK
启动服务器时,应监视系统日志中是否有错误。 单个错误也可能会导致整个区域无法加载,但是无法加载区域不会阻止后台驻留程序启动。因此除非我们在启动过程中监视系统日志,否则很难弄清楚哪里错了。
例如,我们可以查看与named.service单位文件有关的systemd的日志输出:
[root@server ~]# journalctl -f _SYSTEMD_UNIT=named.service
注意区域行,每个区域代表服务器加载的权威区域。 如果无法加载区域,请注意显示的错误消息。
确认区域正确加载后,请验证区域内容是否正确。使用host -l DOMAIN
或dig -t AXFR DOMAIN
命令启动区域传输,生成所有区域记录的列表。 请记住,这必须在服务器的allow-transfer
指令中列出的主机上完成。