经历过博客被关闭的风波,思绪不是那么清晰了,昨天研究了一下DNS服务,发现还挺好玩的。
声明:本文借鉴了下面两位博主的博客:
http://redking.blog.51cto.com/27212/146708
http://evolution.blog.51cto.com/3343305/643520
一、DNS的基本工作原理:
DNS是域名解析服务:domain name service
正向解析:从域名到IP的解析
反向解析:从IP到域名的解析
一次域名解析过程:
主机发出解析www.mm.com 的请求---->查找主机hosts文件的缓存记录---->查找管理本域的DNS服务器---->查找根服务器---->遍历查找----->找到www.mm.com的ip地址---->根DNS服务器把结果反馈给发出请求的下级DNS服务器---->DNS服务器将结果缓存并返回给主机---->主机把结果缓存并开始链接
世界上的十三个根DNS服务器:
一个位于荷兰负责欧洲的域名解析
一个位于日本负责亚太地区域名解析
其余的都位于美国,负责全球其他地方的域名解析
DNS服务器的多层级域名分类
DNS记录的类型:
A:Address 域名向ip地址转换的记录;
PTR:Printer ip地址向域名转换的记录;
NS:代表域内的dns服务器;
MX:代表域内的邮件服务器;
CNAME:域名的别名;
SOA:start of authority用于标示域内主DNS服务器。
配置文件:etc/hosts #当前主机上缓存下来的一些域名对应ip的记录
etc/named.conf #主配置文件,定义了所有文件存放的位置
var/named #工作目录
etc/resolv.conf #DNS服务器的缓存记录
etc/nsswitch.conf #定义了先读取hosts缓存,还是先读取resolv缓存
DNS类型:type
master主DNS
slave从DNS
forward转发DNS用于子域转发
二、搭建主DNS服务器步骤
1. 首先将主机名称修改为符合FQDN格式的名字
(1)hostname NAME
(2)echo "NAME" > /proc/sysconfig/hostname
(3)修改/etc/sysconfig/network文件
(4)修改/etc/hosts文件
2.安装named服务的rpm包bind,或者编译安装bind
3.配置主DNS的主配置文件etc/named.conf;
使用ss -tunl | grep "53" 查看53端口是不是在tcp和udp上监听
使用named-checkconf 检查主配置文件有没有语法错误
4.在/etc/named.rfc1912.zones中定义正向解析区域和反向解析区域;
5.在/var/named/目录下创建正向解析区域文件,反向解析区域文件;
使用named-checkzone "区域" /var/named/*zone检查区域文件有没有语法错误
6.启动named服务 service named start
三、主DNS配置文件:
1.主配置文件的定义
listen-on port 53 { 172.16.13.100; };主DNS服务器IP地址53端口
directory "/var/named"; 定义zone的工作目录
recursion yes; 定义允许递归查询
allow-query { any; }; 定义白名单(谁可以通过此DNS解析)
logging file "data/named.run"; 日志文件
zone "." IN {
type hint; 定义根DNS,必须定义
file "named.ca";
};
include "/etc/named.rfc1912.zones"; 将所有的zone集中在此文件配置
2./etc/named.rfc1912.zones的定义
在此文件里我们只需定义两个解析区域即可
(1)正向解析区域 wuhf.com
(2)方向解析区域 13.16.172.in-addr.apra (此为方向解析区域的固定格式)
3.创建并编辑正向解析区域文件/var/named/wuhf.com.zone
这里我们要注意文件的格式 $TTL 1200 宏定义1200秒更新一次
$ORIGIN 定义wuhf.com.字段,下面可以省略以此结尾的名字
2015042404是版本号,日过此号增加一位,就会通知从服务器过来更新版本
30M 定义从服务器30分钟过来同步一次数据
10M 定义如果从服务器同步失败后,多久过来再次尝试连接主服务器
1W 定义从服务器如果1周内都没有接连到主服务器的话就宣布自己的数据作废
3H 定义如果解析失败的话,这个失败的结果放在缓存中,3小时候缓存失效
4.创建并编辑反向解析记录区域文件/var/named/172.16.zone
5.检查这些文件有没有语法错误
6.开启named的服务 service named start
重读配置文件 rndc reload
7.使用dig工具测试正方向解析成不成功
正向解析
反向解析
三、搭建从DNS服务器,实现主从同步
1.在主服务器的解析区域里添加从服务器的名字和A记录(ip)
2.在新的虚拟机里装bind工具
3.新虚拟机,ip地址为172.16.13.101,在此主机上编辑配置文件/etc/named.conf
4.编辑区域文件/etc/named.rfc1912.zones
5.使用named-checkconf检查配置文件语法错误
6.使用service named start,开启named服务
7.使用rndc reload从主服务器上更新正反向解析文件到本地/var/named/slaves/
四 、搭建子DNS服务器,实现子域查询
1.在主服务器的解析区域里添加子服务器的名字和A记录(ip)
2.在新的虚拟机里装bind工具
yum install bind
3.新虚拟机,ip地址为172.16.12.20,在此主机上编辑配置文件/etc/named.conf
4.编辑区域文件/etc/named.rfc1912.zones
5.创建/var/named/目录下的正反向解析文件
6.使用named-checkconf检查配置文件语法错误
使用named-checkzone命令 检查正反向解析文件有没有语法错误
7.使用service named start,开启named服务
8.使用dig命令尝试子域解析父域,父域解析子域
说明:子DNS服务器搭建与父DNS服务器搭建是一样的步骤,只不过要在/etc/named.conf下的option选项定义全局转发,或者在/etc/named.rfc1912.zones中添加一个转发区域实现区域转发,这样就可以实现在子域中解析父域的地址不用去寻找根了。
完全转发:只要DNS server无法解析的请求就统统转发到option中定义的forwarders上
option { forward first|only;
forwarders { 父域地址;}; };
部分转发:只转发已经在声明type forward; 所对应域的解析请求,对于其他域的解析请求按常规方法处理
zone "wuhf.com" IN {
type forward;
forward first|only;
forwarders { 父域地址; }; };
first:先请求递归,若没有予以响应,使用迭代去找根
only:如果想forwarders转发的请求没有的得到相应,就放弃解析并返回错误结果。
五、视图VIEW
将内网与外网分隔开,实现内网用户访问域名www.bai.com 将引导至内网的主机地址,外网用户要访 问 www.bai.com 将被引导至不一样的外网地址
实现内网用户与外网用户访问同样的域名,被视图解析到不同的地址上。
在国内,像某宝的网站,每个省得用户访问的域名就是被解析到用户所在省份的服务器上,可能还会细分到联通、电信网段的用户,根据省份网段不同,被分配到不一样的服务器上。如:河南省联通用户输入某宝的域名后,会被解析到河南省联通机房的某宝服务器上。
实现步骤:
1.创建具有视图功能的主配置文件
在/etc/named.conf中定义内外网的区域,使用 val 访问控制定义
定义内网段 acl internal {
192.168.0.0/24;
127.0.0.1/8;
};
定义外网段 acl external {
172.16.0.0/16;
};
定义工作目录 options {
directory "/var/named";
recursion yes;
};
在/etc/named.rfc1912zones中创建view视图
定义内网view view "inter" {
match-clients { internal; };
recursion yes;
zone "." IN {
type hint;
file "named.ca";
};
zone "wuhf.com" IN {
type master;
file "wuhf.inter.zone";
};
};
定义外网view
view "exter" {
match-clients { external; };
recursion yes;
zone "." IN {
type hint;
file "named.ca";
};
zone "wuhf.com" IN {
type master;
file "wuhf.exter.zone";
};
};
2.在每个视图中定义相同的区域,在相同的区域中创建不同的区域文件,区域文件中相同的域名,解析 成不同的地址
vim /var/named/wuhf.inter.zone
$TTL 1200
$ORIGIN wuhf.com.
@ IN SOA ns1.wuhf.com. admin.wuhf.com. (
2015042701
30M
10M
7D
1H )
IN NS ns1
ns1 IN A 192.168.0.103
www IN A 192.168.0.123
vim /var/named/wuhf.exter.zone
$TTL 1200
$ORIGIN wuhf.com.
@ IN SOA ns1.wuhf.com. admin.wuhf.com. (
2015042701
30M
10M
7D
1H )
IN NS ns1
ns1 IN A 172.16.12.12
www IN A 172.16.12.123
3.测试,在一台属于内网的主机和一台属于外网的主机上使用dig测试能不能正向解析
还有另一个测试办法,一台虚拟机配置两块网卡,一个设置为192.168.0.0/24网段地址,一个设置为172.16.0.0/16网段地址
先在虚拟机上添加一块网卡,然后再/etc/sysconfig/network-scripts/目录下,cp ifcfg-eth0 ifcfg-eth1,修改eth1里面的配置文件,设定eth0地址为172.16.12.20,设定eth1地址为192.168.13.13
(1)使用ip link set eth1 down,关闭eth1,使用dig www.wuhf.com @172.16.12.12测试,结果被视图解析到外网网段172.16.0.0
(2)使用ip link set eth0 down,关闭eth1,使用ip link set eth1 up,开启eth1;使用dig www.wuhf.com @172.16.12.12测试,结果被视图解析到内网网段192.168.0.0
注意:这里测试内网的dig命令却指向172.16.12.12,没有使用 dig www.wuhf.com @192.168.0.103,是因为我们的测试服务器没有陪双网卡,只有一个外网的地址,所以......将就一下吧。
六、DNS配置所需其他知识
关于DNS的安全访问控制指令:
将它们写在配置文件的options中实现访问控制:
allow-query {}: 允许查询的主机;白名单;
allow-transfer {}:允许区域传送的主机;白名单;
allow-recursion {}: 允许递归的主机;
allow-update {}: 允许更新区域数据库中的内容;
关于测试命令dig、nslookup、host:
(1)dig命令
dig [-t type] name [@SERVER] [query options]
dig用于测试dns系统,因此,不会查询hosts文件进行解析;
查询选项:
+[no]trace:跟踪解析过程
+[no]recurse:进行递归解析
测试反向解析:
dig -x IP @SERVER
模拟区域传送:
dig -t axfr ZONE_NAME @SERVER
例如:dig -t axfr magedu.com @172.16.100.11
(2)host命令:
host [-t type] name [SERVER]
(3)nslookup命令:
nslookup [-option] [name | -] [server]
交互式模式:
nslookup>
server IP: 指明使用哪个DNS server进行查询;
set q=RR_TYPE: 指明查询的资源记录类型;
NAME: 要查询的名称;
关于数据同步命令rndc
rndc:
rndc --> rndc (953/tcp)
rndc COMMAND
COMMAND:
reload: 重载主配置文件和区域解析库文件
reload zone: 重载区域解析库文件
retransfer zone: 手动启动区域传送过程,而不管序列号是否增加;
notify zone: 重新对区域传送发通知;
reconfig: 重载主配置文件
querylog: 开启或关闭查询日志;
trace: 递增debug级别;
trace LEVEL: 指定使用的级别;
转载于:https://blog.51cto.com/wuhf2015/1639437