DNS原理
dns架构
一次DNS查询的过程
Client --> hosts文件 --> DNS Service Local Cache --> DNS Server (recursion)
--> Server Cache --> iteration(迭代) --> 根 --> 顶级域名DNS --> 二级域名DNS…
资源记录
- 语法:name [TTL] IN rr_type value
- name: 域名
- TTL:缓存存活时间
- IN:保留
- rr_type
- value: IP
资源记录类型
rr_type | comments |
---|---|
SOA | 起始授权记录;一个区域解析库有且仅有一个SOA记录,必须位于解析库第一条记录 |
A | Internet address,FQDN --> IP |
AAAA | FQDN --> IPv6 |
PTR | PointTeR, IP -->FQDN |
NS | Name Server, 专用于标明当前区域的DNS服务器 |
CNAME | Canonical Name, 别名记录 |
MX | Mail eXchanger, 邮件交换器 |
TXT | 对域名进行标识和说明的一种方式,一般做验证记录时使用,如SPF(反垃圾邮件)记录,https验证等 |
$TTL 1D #解析记录在缓存中保存的时间
@ IN SOA master admin.coding.com. (
# @ 表示本域名即coding.com.
# IN 保留字段
# SOA:ttr_type
# master.coding.com 主dns名称
# admin.coding.com.: 主dns管理员邮箱
0 ; serial # 当前dns数据版本号,在主从复制时参照
1D ; refresh # 主从复制时同步间隔时间
1H ; retry # 主从复制同步失败时,重试时间
1W ; expire # 同步失败多长时间,记录失效
3H ) ; minimum # 失败的dns记录保存在缓存时间
NS master # 标明当前区域内dns
master A 192.168.80.11
@ MX 10 mailsrv # 邮件交换
mailsrv A 192.168.37.123
ftp A 1.1.1.1
db A 2.2.2.2
www CNAME websrv # 别名
websrv A 192.168.80.13
websrv A 192.168.80.14
coding.com CNAME websrv
@ A 3.3.3.3 # 匹配 coding.com
* A 4.4.4.4 # 匹配wwwwww.coding.com
$GENERATE 1-254 HOST$ A 1.2.3.$
DNS测试工具
- host
- dig
dig [-t type] name [@SERVER] [query options]
查询选项 | comments |
---|---|
+ trace | 跟踪解析过程:dig +trace coding.com |
+ recurse | 进行递归解析 |
-x IP | 测试反向解析 dig -x 192.168.80.11 |
dig -t axfr zone_name @server | 查询区域数据记录 |
dig -t ns qq.com | 查询qq的dns服务器 |
dig -t soa qq.com | 查询qq的soa记录 |
- rndc
command | comments |
---|---|
reload | 重载主配置文件和区域解析库文件 |
reload zonename | 重载区域解析库文件 |
retransfer zonename | 手动启动区域传送,不管序列号是否增加 |
notify zonename | 重新对区域传送发通知 |
reconfig | 重载主配置文件 |
querylog | 开启或关闭查询日志文件/var/log/message |
flush | 清空dns缓存记录 |
端口作用
tcp 53 -- 实现主从同步
udp 53 -- 实现查询和主从同步
搭建只缓存dns服务器
- 安装dns软件包bind机器工具
yum install bind* -y
- 编辑bind配置文件
# vim /etc/named.conf
listen-on port 53 { localhost; };
allow-query { any; };
- 启动服务
rndc reload
or
systemctl restart named
# 查看dns监听端口和ip
ss -nltu
- 测试
# 将机器dns指向刚刚配置dns
dig www.baidu.com
host www.baidu.com
搭建主DNS服务器
- 创建区域解析数据库
- 复制区域解析数据库模板
cd /var/named
cp -p named.localhost coding.com.zone # note保留named权限
- 编辑数据库文件
# vim coding.com.zone
$TTL 1D
@ IN SOA master.coding.com admin.coding.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS master
master A 192.168.80.11
ftp A 1.1.1.1
db A 2.2.2.2
www CNAME websrv
websrv A 192.168.80.13
websrv A 192.168.80.14
- 将 区域解析数据库记录加入到bind配置文件
#vim /etc/named.rfc1912.zones
zone "coding.com"{
type master;
file "coding.com.zone"
};
- 检查配置文件
named-checkconf
- 检查解析数据库记录
named-checkzone coding.com /var/named/coding.com.zone
- 重启DNS服务
rndc reload
实现反向解析区域 PTR记录
- 创建数据解析记录
vim /etc/named.rfc1912.zones
zone "80.168.192.in-addr.arpa" IN {
type master;
file "192.168.80.zone";
}
- 编辑/var/named/192.168.80.zone
vim /var/named/192.168.80.zone
$TTL 1D
@ IN SOA ns1.coding.com. admin ( 1 1D 1H 1W 2D )
NS ns1
ns1 A 192.168.80.11
12 PTR ftp.coding.com.
15 PTR db.coding.com.
13 PTR websrv.coding.com
14 PTR websrv.coding.com
# 配置所有组和权限
chown :named /var/named/192.168.80.zone
chmod 640 /var/named/192.168.80.zone
- 重启服务
rndc reload
- 测试配置
dig -x 192.168.80.12
host 192.168.80.12
12.80.168.192.in-addr.arpa domain name pointer ftp.coding.com.
DNS 主从复制
192.168.80.11 --- 主服务器
192.168.80.13 --- 从服务器
- 搭建从DNS服务器(192.168.80.13)
# 安装
yum install bind
# 编辑配置文件
vim /etc/named.conf
listen-on port 53 { localhost; };
allow-query { any; };
vim /etc/named.rfc1912.zones
zone "coding.com" {
type slave;
masters {192.168.80.11;};
file "slaves/coding.com.zone.slave";
};
systemctl start named
- 增加一条记录在主DNS(192.168.80.11)上面, 更新版本号, 添加从dns
vim /var/named/coding.com.zone
NS master
NS slave
master A 192.168.80.11
slave A 192.168.80.13
@ MX 10 mailsrv
mailsrv A 1.1.1.1
rndc reload
- 测试从DNS
dig -t mx coding.com @192.168.80.13
4 安全加固
在主dns
vim /etc/named.conf
allow-query { any; };
allow-transfer {192.168.80.13;}; # 仅允许从服务器同步数据
在从dns
vim /etc/named.conf
allow-query { any; };
allow-transfer { none; }; # 禁止所有机器同步
子域
同一机器同一区域实现子域 bejing.coding.com
添加一个A记录
vim /var/named/coding.com.zone
www.beijing A 22.22.22.22
同一机器不同区域实现子域beijing.coding.com
# 创建子域的区域
cp /var/named/coding.com.zone /var/named/beijing.coding.com.zone -p
vim /var/named/beijing.coding.com.zone
$TTL 1D
@ IN SOA master admin.coding.com. (
3 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS master
master A 192.168.80.11
www CNAME websrv
websrv A 5.5.5.5
# 添加子域配置文件
vim /etc/named.rfc1912.zones
zone "beijing.coding.com"{
type master;
file "beijing.coding.com.zone";
};
不同机器上实现子域委派
在192.168.80.14上实现子域shanghai.coding.com
- 在主dns上添加一条NS和A记录
vim /var/named/coding.com
shanghai NS ns3
ns3 A 192.168.80.14
1.1 关掉dns安全相关选项
dnssec-enable no;
ndssec-validation no;
- 在192.168.80.14上配置主DNS服务
- 测试
dig www.shanghai.coding.com
转发
192.168.80.11:主缓存服务器
192.168.80.12:dns转发服务器
配置成只缓存服务器,并将转发发送到192.168.80.11
vim /etc/named.conf
forward first|only
forwarders {192.168.80.11;};
CDN
GSLB :Global Server Load Balance全局负载均衡
智能DNS,类CDN服务
1.
vim /etc/named.conf
acl beijingnet {
192.168.80.0/24;
192.168.90.0/24;
};
acl shanghainet {
172.16.0.0/16;
172.17.0.0/16;
};
acl othernet {
any;
};
view view_beijing {
match-clients { beijingnet;};
include "/etc/named.rfc1912.zones.bj";
};
view view_shanghai {
match-clients { shanghainet;};
include "/etc/named.rfc1912.zones.sh";
};
view view_other {
match-clients { othernet;};
include "/etc/named.rfc1912.zones";
};
2.
vim /etc/named.rfc1912.zones.bj"
zone "coding.com" {
type master;
file "coding.com.zone.bj";
};
vim /etc/named.rfc1912.zones.sh
zone "coding.com" {
type master;
file "coding.com.zone.sh";
};
vim /etc/named.rfc1912.zones
zone "coding.com" {
type master;
file "coding.com.zone.other";
};
3.
vim coding.com.zone.bj
$TTL 1D
@ IN SOA ns1 admin ( 1 1H 1H 1D 3H )
NS ns1
ns1 A 192.168.37.7
www A 192.168.37.100
vim coding.com.zone.sh
$TTL 1D
@ IN SOA ns1 admin ( 1 1H 1H 1D 3H )
NS ns1
ns1 A 192.168.37.7
www A 172.168.16.100
vim coding.com.zone.other
$TTL 1D
@ IN SOA ns1 admin ( 1 1H 1H 1D 3H )
NS ns1
ns1 A 192.168.37.7
www A 10.10.10.100