DNS服务
您是谁家老小
域名解析原理
DNS:将容易基于的主机名映射到IP地址
计算机命名规范:
- Netbiso名称(微软)
- Hostname
- DNS分布式名称系统(但是不同的dns服务器是有层级关系的,呈树状结构)
DNS服务结构:
- 域名 比如:sina.com.cn
- FQDN(fully qualified domain names ) 比如:www.sina.com.cn 即主机名(www)+域名(sina.com.cn)
DNS记录类型
记录类型 |
作用 |
NS |
域名服务器记录(找a.com与里面的域名对应的ip的话,就要去问域名服务器,问他www的对应的主机的ip地址是多少),一个域可以有多个域名服务器(dig a.com ns ) |
A |
主机记录(域名解析到ip地址) |
CNAME |
别名记录(给域名指向另一个A记录的域名,可以叠加) |
MX |
邮件交换记录 |
PTR |
指针记录(反向查询) |
SOA |
起始授权记录(soa记录对应的域名服务器,才是合法的) |
DNS命名空间
www.ubuntu.com.
严格来说是有点的,但是为了方便,最后面不写点也可以
DNS查询: 逐级委派
由机构LCANN
负责管理, 负责根域.
DNS查询寻结构
三种DNS服务器:
- Master(DNS域里面中,master服务器可以修改DNS记录,在master上做得修改也会自动同步到其他slave等dns服务器) 一般只设置一台
- Slave(数据文件来自master的同步) – 前两者两种服务器都会保存dns记录类型
- Cache (不保存任何记录,一般都是运营商提供的,跟下面的dns查询有关系,意义:本个区域内有缓存了减少dns会话的流量,提高了效率,减轻了带宽占用,超出生命周期之后才会再次查询)
- TTL
4.Forward(转发类型的,比如会去转发给本地运营商的dns服务器(比如家用无线路由器会企业的域控),而不是自己去进行递归查询啥的)
同时是三种角色
安装DNS服务
使用最广的DNS服务的软件包:BIND(Berkley Internet Naming Daemon)
在ubuntu上:
1
2
3
4
5
6
7
|
# 安装bind(即软件包) 9是版本,dnsutils是用来检查的软件包
sudo apt install bind9 dnsutils
# DNS服务区只保存和解析本域各种域名记录
# DNS服务都包含13个根域名服务器地址
cat /etc/bind/db.root # -> ipv4和ipv6地址(AAAA记录)
# 事实分布于世界的数百台根域服务器,不只是13个(国内是有根域服务器的)
|
DNS服务器的DNS服务器配置
自己做迭代
指定递归域名服务器(自建尽量禁用其他地址来连接我们递归查询功能, 除非查询的是域内的域名)
DNS默认服务端口
TCP 53 / UDP 53
这里是以Bind
软件包为例
还有其他软件包:
- Djbdns
- dhamasq
- DNS + DHCP打包的轻量解决方案 –> 经常用于
无线渗透,搭建无线AP
3.PowerDNS
- 模块化开源DNS服务器软件
DNS主备部署
对于dns服务器本身的dns地址可以执行运营商等的地址
正向区域
配置Master
DNS服务器
执行区域文件(正向区域 –> 域名解析为ip)
企业内部自用, 一般一个域中会有两个DNS服务器
1
2
3
4
5
6
7
|
# sudo vim /etc/bind/named.conf.local
# zone定义一个区域, type类型,指定存具体记录的文件
zone "lab.com"{
type master;
file "/etc/bind/db.lab.com"
}
|
2.编辑区域文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# 拷贝一个现有的区域文件模板,进行修改(也可手动创建)
cp db.local db.lab.com
sudo vim db.lab.com
# 文件内容
; BIND data file for lab.com loopback interface
;
$TTL 604800 # 允许缓存DNS服务器的缓存时长,单位s, 1D ->一天,12h -> 12小时
@ IN SOA soa.lab.com. root.localhost. ( # @表示本域的域名, IN ->互联网记录类型, SOA起始授权记录; root.localhost.管理员邮箱地址(点就是@ ->root.lab.com.), 括号多行内容
2 ; Serial # 版本号,如果slave的与master服务器字段值相同则不同步数据,不同则同步数据
604800 ; Refresh # slave向master的更新周期
86400 ; Retry # 重试周期
2419200 ; Expire # 最大重试时间
604800 ) ; Negative Cache TTL
;
@ IN NS ns1 # NS记录,dns域的域名服务器的名称
@ IN A 10.1.8.128 # 给哪个域名创建A记录,访问本机的域名解析到哪里
@ IN AAAA ::1 # ipv6使用的
ns1 IN A 10.1.8.10 # 给域的ns记录域名解析到哪个ip
soa IN A 10.1.8.10
www IN CNAME web # 把www.lab.com解析为web.com.lab
web IN CNAME w3 # 有一个CNAME记录
w3 IN A 10.1.8.128 # 最终解析为A记录的ip
@ IN MX 10 mx1 # 优先级,数字越小优先级越高
@ IN MX 10 mx2
mx1 IN A 10.1.8.1 # 再把mx的域名解析到ip
mx2 IN A 10.1.8.2
ftp IN A 10.1.8.128
ftp IN A 10.1.8.129 # 同一个a记录命名指向不同的ip,不区分优先级,而是轮询
|
3.重启服务
1
2
|
sudo systemctl restart bind9
sudo systemctl status bind9
|
4.服务器配置检查
1
2
3
4
5
|
sudo named-checkconf # 检查语法错误
sudo named-checkzone lab.com /etc/bind/db.lab.com # 正向区域检查
sudo named-checkzone lab.com /etc/bind/db.lab.com # 反向区域检查
|
5.客户端解析验证
1
2
3
4
5
6
7
8
9
10
|
# dig在win上没有
ping lab.com
dig lab.com ns @10.1.8.10 # 解析ns记录,@dns服务器
dig www.com @10.1.8.10
dig com a @10.1.8.100 # 不指定的话,默认就是a记录
dig lab.com mx @10.1.8.100
|
客户端解析验证
1
2
3
4
5
6
7
8
9
10
11
|
# nslookup在linux和win都有
nslookup
# 设置参数
server 10.1.8.100 # dns服务器
set q=ns # 查询记录类型
lab.com # 查询目标
## Windows本机hi进行dns本地缓存, 而Linux本地是不做缓存的
ipconfig /displaydns # 显示本地缓存的dns记录
ipconfig /flushdns # 清空本地缓存的dns记录
|
配置Cache
DNS服务器
主配置文件/etc/bind/named.conf
1
2
3
4
|
# 只是一个入口文件
include "/etc/bind/named.conf.options"; # 规范: 【分号结尾】
include "/etc/bind/named.conf.local"; #
include "/etc/bind/named.conf.default-zones";
|
全局转发DNS服务器
对于不属于我们域的解析转发给其他dns服务器 (我们内部的nds服务器不知道怎么解析之后要去找谁)
配置转发器的文件: vim /etc/bind/named.conf.options
1.全局转发:
1
2
3
4
5
6
7
8
9
10
11
12
|
acl "local"{ # options 块之前
10.1.8.0/24; # 本地网段(为公司内部的地址提供服务)
};
options {
recursion yes; # recursion即递归查询(公网上的dns服务器一般是禁止递归查询的)
allow-recursion { local; }; # 允许对我发起递归查询的地址范围
listen-on { 10.0.2.53; }; # 指定侦听的地址
forwarders {
9.9.9.9; # 全局性的转发器,转发给谁
8.8.8.8;
};
};
|
sudo systemctl restart bind9.service
2.局部转发
1
2
3
4
5
6
7
|
zone "sina.com.cn" { # 创建一个域名
type forward;
forwarders {
202.99.96.68; #局部转发,针对某个域名转发给某一个ip
202.106.0.20;
};
};
|
sudo systemctl restart bind9.service
解析过之后,就有了缓存,在一定时间内就不会转发再进行请求了
反向区域
配置Master DNS
服务器
(i反向区域: ip解析为域名 –> 反垃圾邮件)
反垃圾邮件:攻击者伪造域内邮件发送恶意文件;检查外部的邮件是否是从真正的邮件服务器发送过来的
1.
1
2
3
4
5
6
7
|
# sudo vim /etc/bind/named.conf.local
# zone定义一个区域, type类型,指定存具体记录的文件
zone "8.1.10.in-addr-arpa"{ # 反着写,这里一个网段的地址10.1.8就写为8.1.10
type master;
file "/etc/bind/db.10.1.8";
}
|
1
2
3
4
5
6
|
# 拷贝一个模板文件
sudo cp /etc/bind/db.127 /etc/bind/db.10.1.8
# 重启服务
sudo systemctl restart bind9
sudo systemctl status bind9
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# 编辑反向区域配置文件
vim /etc/bind/db.10.1.8
# 文件内容
;
; BIND reverse data file for local loopback interface
;
$TTL 604800
@ IN SOA ns.lab.com. root.lab.com. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns.lab.com. # 本地的ns记录
10 IN PTR ns.lab.com. # PTR 反向指针记录
145 IN PTR mx1.lab.com #145即10.1.8.145
2 IN PTR mx2.lab.com
2 IN PTR w3.lab.com # 一个ip也可以解析为多个域名
|
4.检测一下反向解析是否正常
1
|
dig -x 10.1.8.2@10.1.8.2
|
配置Slave
DNS服务器
- 为例实现冗余容错(防止某台dns服务器宕机),通常会为每个与安装多个Slave DNS服务器
- 修改记录只能在Master DNS服务器(
一个域内只允许有一个
)上操作,通过版本号
(Serial)通知Slave服务器同步 (所以。作为master的管理员,配置更新之后需要手动修改版本号的值)
- 安全考虑
- 服务器全局
禁止区域传输
(同步本域所有DNS记录)
- 只允许指定IP,指定区域的Slave服务器进行区域传输
- 区域数据同步使用TCP 53端口
1
2
3
4
5
6
7
8
9
10
11
12
|
# dig进行区域传输获取信息 axfr(黑客最喜欢拿的)
dig @10.1.8.10 lab.com axfr
## 禁止区域传输:
# 全局配置文件
# sudo vim named.conf.options
# 在option中添加:
allow-transfer { none; };
# 重启
# 禁用之后,不影响dig来查询某记录,只是拒绝一次性把记录拿走
|
2.继续修改master服务器配置
1
2
3
|
# sudo vim /etc/bind/named.conf.local
# 在正向/反向zone字段里面都要添加
allow-transfer { 10.0.2.54; }; # 允许10.0.2.54 -> 就是slave服务器
|
3.继续修改master服务器配置
1
2
3
4
5
6
7
8
9
10
11
12
|
# vim /etc/bind/db.lab.com
# 增加一条NS记录和A记录
@ IN NS ns2
ns2 IN A 10.1.8.20
# 编辑反向的域名解析记录
# vim db.10.1.8
20 IN PTR ns2.lab.com.
# 重启服务
|
4.安装slave dns服务器并配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
sudo vim /etc/bind/named.conf.options
# 内容
acl "local"{ #
10.1.8.0/24;
};
options {
recursion yes;
allow-recursion { local; };
listen-on { 10.0.8.20; }; # 侦听自己的
allow-transfer { none; };
forwarders {
9.9.9.9;
8.8.8.8;
};
............
};
# 重启服务
|
5.slave dns服务器上创建区域
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# sudo vim /etc/bind/named.conf.local
# 正向zone区域(和master上的对应好)
zone "lab.com"{
type slave;
file "db.lab.com"; # 不能使用绝对路径(区域文件不用手动创建)
masters { 10.1.8.10; };
}
# 反向区域
zone "8.1.10.in-addr.arpa"{
type slave;
file "db.lab.com"; # 不能使用绝对路径
masters { 10.1.8.10; };
}
# 重启服务
#区域文件db.lab.com不用手动创建
# 会自动从master上同步下来
# 位置在 /var/cache/bind/ 而且文件是加了密的
# 查看slave dns服务器的情况
grep bind /var/log/syslog
|
记录更新通知
Slave服务器到达更新周期
客户端数据加密保存(不能直接修改)
Master服务器通知版本号
master服务器的dns配置更新之后,一定要手动修改版本号,然后重启
在区域配置文件配置(master服务器的dns配置更新之后会通知slave服务器):
1
2
3
|
# sudo vim /etc/bind/named.conf.local
# 正反向zone都要配置
also-notify { 10.1.8.20; };
|