1.DNS原理
1.1 简介
DNS(Domain Name Service的缩写)的作用就是根据域名查出IP地址。IP地址是由32位二进制数字组成,人们很难记住这些IP,相反,大家愿意使用比较容易记忆的主机名字。而电脑在处理IP数据报文时,是使用IP地址的,因为它是固定长度。
DNS查询的类型对于客户端来说是递归查询,对于DNS服务器来说,绝大多数是迭代查询的。DNS名称解析中,从名称到IP的查询叫做正向解析,从IP到名称的查询的解析叫反向解析。如果DNS服务器至少解析了一个或一个以上的域叫做DNS主服务器或者DNS辅助服务器,如果不负责任何解析叫做DNS缓存服务器。
现在互联网规模很大,DNS被设计成一个分布式的数据库系统,他分布的功能就是把一个大的数据库切割成很多小的数据库,来分别提供一部分数据的处理。全球一共分布了13台DNS跟服务器,名字为A至M。
1.2 解析域名
- 根域名:隐含的
.
(根域) - 顶级域名(TLD):
cn
- 二级级域名(SLD):
com.cn
- 三级级域名:
qiange.com.cn
- 主机名:
www.qiange.com.cn
(这里www
是子域名或主机名)
1.3 DNS的域名解析过程
1.3.1 用户使用浏览器输入网址时域名解析过程
-
客户访问时,先查自己的hosts文件,有则返回
-
客户hosts中没有就去查自己的缓存,有则返回
-
客户缓存没有就去找dns服务器
-
dns服务器先找根服务器获得顶级域服务器地址
-
dns服务器在找顶级域服务器去获得二级域服务器地址
-
dns服务器从二级域服务器获得最终的IP地址
-
客户端从dns服务器中得到IP地址
1.3.2 解析答案
- 肯定答案:存在对应的查询结果
- 否定答案:请求的条目不存在等原因导致无法返回结果
- 权威答案:直接由存有此查询结果的DNS服务器(权威服务器)返回的答案
- 非权威答案:由其它非权威服务器返回的查询答案
1.3.3 迭代查询和递归查询
1.3.3.1递归查询
1.3.3.2迭代查询
1.3.3.3 迭代查询和递归查询的区别
- 递归查询:由 DNS 服务器负责完成所有查询,最终返回结果给客户端。客户端发出一次请求,服务器承担查询过程。
- 迭代查询:客户端依次与多个 DNS 服务器交互,直到找到最终结果。服务器只提供下一级服务器的信息,不代为查询。
注意:这两种查询方式在实际应用中常常结合使用。通常,客户端发起递归查询,而 DNS 服务器之间执行迭代查询。
1.3.4 DNS区域数据库文件
2.DNS跨地域转发实验
2.1服务器信息
服务器名称 | IP地址 | 角色 | 服务器系统版本 |
---|---|---|---|
dns-master | 172.17.1.200 | 主DNS | Ubuntu 20.04.3 LTS |
dns-salve | 172.17.1.201 | 从DNS | Ubuntu 20.04.3 LTS |
nj-dns | 172.17.1.202 | 南京分部DNS服务 | Ubuntu 20.04.3 LTS |
sz-dns | 172.17.1.203 | 苏州分布DNS服务 | Ubuntu 20.04.3 LTS |
2.2环境初始化
2.2.1 服务器做免密
2.2.2时间同步
2.2.3 安装bind服务
apt -y install bind9
2.3 配置总部主DNS服务
2.3.1 配置文件
root@dns-master:~# tree /etc/bind
/etc/bind
├── bind.keys #用于在 DNS 解析中验证受信任的域名签名
├── db.0
├── db.127
├── db.255
├── db.empty
├── db.local
├── named.conf #配置文件
├── named.conf.default-zones #默认的区域解析文件
├── named.conf.local
├── named.conf.options
├── rndc.key
└── zones.rfc1918
2.3.2 主DNS配置文件(/etc/bind/named.conf)
root@dns-master:~#mkdir /var/named/data -p
root@dns-master:~#chown -R bind.bind /var/named/
root@dns-master:~# cat /etc/bind/named.conf
options {
listen-on port 53 { any; };
directory "/var/named";
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; };
// dnssec-enable no;
dnssec-validation no;
recursion yes;
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
logging {
channel default_debug {
file "/var/named/data/named.log";
severity dynamic;
};
};
include "/etc/bind/named.conf.local";
include "/etc/bind/bind.keys";
include "/etc/bind/named.conf.default-zones";
root@dns-master:/etc/bind# vim /etc/apparmor.d/usr.sbin.named
/var/named/** rwk, #文件的末尾添加此行
root@dns-master:/etc/bind# apparmor_parser -r /etc/apparmor.d/usr.sbin.named
root@dns-master:/etc/bind# systemctl restart bind9.service
root@dns-master:/etc/bind# systemctl status bind9.service
● named.service - BIND Domain Name Server
Loaded: loaded (/lib/systemd/system/named.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2024-10-13 20:21:03 CST; 1h 47min ago
Docs: man:named(8)
Main PID: 231174 (named)
Tasks: 8 (limit: 2244)
Memory: 6.1M
CGroup: /system.slice/named.service
└─231174 /usr/sbin/named -f -u bind
2.3.3 区域解析库文件配置(/etc/bind/named.conf.default-zones)
root@dns-master:~# cat /etc/bind/named.conf.default-zones
// prime the server with knowledge of the root servers
zone "." {
type hint;
file "/usr/share/dns/root.hints";
};
zone "qm.com" IN { //创建qm.com域
type master;
file "/var/named/qm.com.zone";
};
zone "bj.qm.com" IN { //创建子域bj.qm.com
type master;
file "/var/named/bj.qm.com.zone";
};
#这个也可以在配置文件里面配置,如果在配置文件添加以上内容,则配置文件无需再配置/etc/bind/named.conf.default-zones
root@dns-master:~# cat /var/named/qm.com.zone
$TTL 1d
@ IN SOA qm.com. admin.qm.com. ( ;SOA记录
20241013 ;序列号
1H ;刷新时间
5M ;重试时间
1W ;过期时间
1D) ;否定答案的TTL值
IN NS ns1.qm.com. ;主DNS
IN NS ns2.qm.com. ;备DNS
nj IN NS nj.qm.com. ;将南京子域委派给nj.qm.com进行管理
sz IN NS sz.qm.com. ;将苏州子域委派给sz.qm.com进行管理
ns1.qm.com. IN A 172.17.1.200
ns2.qm.com. IN A 172.17.1.201
nj.qm.com. IN A 172.17.1.202
sz.qm.com. IN A 172.17.1.203
oa.qm.com. IN A 172.17.1.100
sql.qm.com. IN A 172.17.1.101
root@dns-master:~# cat /var/named/bj.qm.com.zone
$TTL 1d
@ IN SOA bj.qm.com. admin.bj.qm.com. ( ;SOA记录
20241013 ;序列号
1H ;刷新时间
5M ;重试时间
1W ;过期时间
1D) ;否定答案的TTL值
IN NS ns1.qm.com. ;主DNS
IN NS ns2.qm.com. ;备DNS
ns1.qm.com. IN A 172.17.1.200
ns2.qm.com. IN A 172.17.1.201
oa.bj.qm.com. IN A 172.17.1.80
2.4 配置总部从DNS服务
2.4.1 从dns的配置文件
options {
listen-on port 53 { any; };
directory "/var/named";
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; };
// dnssec-enable no;
dnssec-validation no;
recursion yes;
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
logging {
channel default_debug {
file "/var/named/data/named.log";
severity dynamic;
};
};
include "/etc/bind/named.conf.local";
include "/etc/bind/bind.keys";
include "/etc/bind/named.conf.default-zones";
2.4.2 从dns的区域解析库文件
root@dns-salve:~# cat /etc/bind/named.conf.default-zones
zone "." {
type hint;
file "/usr/share/dns/root.hints";
};
//因为从DNS服务器只是同步主DNS服务的数据,所以不需要解析区域库文件,只需要设定好谁是主服务即可
zone "qm.com" IN {
type slave; //设置服务器的类型
masters { 172.17.1.200 ;}; //设置主DNS服务器的IP地址
file "/var/named/slaves/qm.com.zone";
};
zone "bj.qm.com" IN {
type slave;
masters { 172.17.1.200 ;};
file "/var/named/slaves/bj.qm.com.zone";
};
2.5 配置南京分部DNS配置
2.5.1 配置DNS的配置文件
options {
listen-on port 53 { any; };
directory "/var/named";
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; };
// dnssec-enable no;
dnssec-validation no;
recursion yes;
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
logging {
channel default_debug {
file "/var/named/data/named.log";
severity dynamic;
};
};
include "/etc/bind/named.conf.local";
include "/etc/bind/bind.keys";
include "/etc/bind/named.conf.default-zones";
2.5.2 配置转发域
zone "nj.qm.com" IN {
type master;
file "/var/named/nj.qm.com.zone";
};
zone "qm.com" IN { //设定转发,客户端访问qm.com域时全部转发至指定的服务器
type forward;
forward first;
forwarders { 172.17.1.200; }; //如果访问总部域名则转发至主DNS
};
2.5.3配置区域解析库文件
root@nj-dns:~# cat /var/named/nj.qm.com.zone
$TTL 1d
@ IN SOA nj.qm.com. admin.nj.qm.com. ( ;SOA记录
20241013 ;序列号
1H ;刷新时间
5M ;重试时间
1W ;过期时间
1D) ;否定答案的TTL值
IN NS nj.qm.com.
nj.qm.com. IN A 172.17.1.202
oa.nj.qm.com. IN A 172.17.1.10
ftp.nj.qm.com. IN A 172.17.1.11
2.6 配置苏州分布DNS配置
2.6.1 配置DNS的配置文件
options {
listen-on port 53 { any; };
directory "/var/named";
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; };
// dnssec-enable no;
dnssec-validation no;
recursion yes;
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
logging {
channel default_debug {
file "/var/named/data/named.log";
severity dynamic;
};
};
include "/etc/bind/named.conf.local";
include "/etc/bind/bind.keys";
include "/etc/bind/named.conf.default-zones";
2.6.2 配置转发域
zone "sz.qm.com" IN {
type master;
file "/var/named/sz.qm.com.zone";
};
zone "qm.com" IN { //设定转发,客户端访问qm.com域时全部转发至指定的服务器
type forward;
forward first;
forwarders { 172.17.1.200; }; //如果访问总部域名则转发至主DNS
};
2.6.3 配置区域解析库文件
root@sz-dns:~# cat /var/named/sz.qm.com.zone
$TTL 1d
@ IN SOA sz.qm.com. admin.sz.qm.com. ( ;SOA记录
20241013 ;序列号
1H ;刷新时间
5M ;重试时间
1W ;过期时间
1D) ;否定答案的TTL值
IN NS sz.qm.com. ;将苏州子域委派给sz.qm.com进行管理
sz.qm.com. IN A 172.17.1.203
oa.sz.qm.com. IN A 172.17.1.20
2.7 测试
2.7.1 测试主从DNS功能
1、主DNS正常情况下
2、主DNS挂了
2.7.2 在每个公司地域都可以互相解析对方域名
2.8故障
1、/var/named目录权限不足,导致服务无法启动
- 查看/var/log/syslog日志,看到如下报错,权限拒绝。看到这个报错检测/var/named的所有者所属组是不是bind且/var/named的权限是不是644,没有发现什么不妥,索性给这个目录最高权限777,还是报这个权限不足被拒绝
- 上网查资料,说ubuntu还存在个AppArmor限制,一查果然是这个问题
解决方案如下:
root@dns-master:/etc/bind# vim /etc/apparmor.d/usr.sbin.named
/var/named/** rwk,
root@dns-master:/etc/bind# apparmor_parser -r /etc/apparmor.d/usr.sbin.named
root@dns-master:/etc/bind# named-checkconf /etc/bind/named.conf #检查dns配置文件是否有错误
root@dns-master:/etc/bind# named-checkzone sz.qm.com /var/named/sz.qm.com.zone #检查dns区域解析库文件是否有错误
root@dns-master:/etc/bind# systemctl restart bind9.service
root@dns-master:/etc/bind# systemctl status bind9.service
2、配置的forward转发没有生效
因为没有添加dnssec-validation no;参数
3、区域解析库配置容易出错的地方
注意:1、TTL值的设定
2、跨地域和跨国要网络和时差