dns基本工作原理 dns: domain name service dns udp/53 tcp/53 udp 用于解析 tcp 用于区域传送
由域名服务器与域名解析器组成 用于域名和ip的相互转换
dns:分布式 倒置的树状结构
最上方为根域 根域服务器世界一共有13台
根域服务器下有多个组织服务器 如 .com .org .edu .net 等 也有如表示国家的域服务器 .cn .us等等 这些域名称为顶级域 或者为 一级域
一级域下又有诸多二级域
二级域下又可以有诸多三级域 ...
dns服务器的类型
1.主dns服务器
2.从dns服务器
3.唯缓存dns服务器
4.转发器
原理:互联网主机通信都是通过ip,域名只不过是提供一个更易记的渠道
客户端发起dns请求流程:
client --> /etc/hosts --> local cache --> DNS server(recursive 递归查询) --> dns server local cache --> lterative(迭代查询) -->
客户端请求域名解析 首先查看/etc/hosts 文件中是否有解析的内容 若无在查询缓存中时否还有上次解析的记录 若无则去查找 指定的dns服务器 (一般来说指定的dns服务器为唯缓存dns服务器)
指定的dns服务器的缓存中若无相关缓存 则去找其他dns服务器(查找方式为自顶向下) 如 刚开始从根开始查找指定的域名 如查找 www.gaoleng.com
1. 我们指派的dns服务器 去找根 根会告诉我们指派的dns 他不知道我们所说的域名是哪个ip 但是.com他知道 你应该去找.com查找 并告诉我们 .com的地址
2. 我们指派的dns服务器又回去 找.com .com说 “我也不知道 你说的域名的 ip地址到底是多少 但是baidu.com应该知道 我跟你说他的ip是多少把 ”
3. 接着dns服务器又会去找 baidu.com的dns服务器 我们所要查找的域名 确实是在baidu.com域中 baidu.com的dns服务器会说 “你要找的域名 我确实知道他的 ip是.. ”
4. 指派的dns服务器 会缓存这一信息 并且 将该域名对应的ip 返回给客户端 客户端 也会缓存这一信息 这样在缓存未到期之前 再次访问www.baidu.com 就不会再去找dns服务器 而是直接在缓存中取得
客户端 只收取最终结果 其余工作都有指派的dns服务器完成
递归查询:客户端请求一次 就可以得到最终的结果
客户端不支持迭代查询 所以依靠唯缓存服务器来帮助查询
迭代查询:服务器多次发送查找请求 多次返回
dig 命令查看dns搜寻过程
dig www.yahoo.com +trace
~]# dig www.yahoo.com +trace
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.5 <<>> www.yahoo.com +trace
;; global options: +cmd
. 5 IN NS e.root-servers.net.
. 5 IN NS m.root-servers.net.
. 5 IN NS l.root-servers.net.
. 5 IN NS g.root-servers.net.
. 5 IN NS c.root-servers.net.
. 5 IN NS k.root-servers.net.
. 5 IN NS j.root-servers.net.
. 5 IN NS h.root-servers.net.
. 5 IN NS d.root-servers.net.
. 5 IN NS i.root-servers.net.
. 5 IN NS b.root-servers.net.
. 5 IN NS f.root-servers.net.
. 5 IN NS a.root-servers.net.
;; Received 494 bytes from 192.168.117.2#53(192.168.117.2) in 228 ms
com. 172800 IN NS e.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
com. 172800 IN NS j.gtld-servers.net.
com. 172800 IN NS m.gtld-servers.net.
com. 172800 IN NS i.gtld-servers.net.
com. 172800 IN NS f.gtld-servers.net.
com. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS g.gtld-servers.net.
com. 172800 IN NS h.gtld-servers.net.
com. 172800 IN NS l.gtld-servers.net.
com. 172800 IN NS k.gtld-servers.net.
com. 172800 IN NS c.gtld-servers.net.
com. 172800 IN NS d.gtld-servers.net.
;; Received 507 bytes from 198.41.0.4#53(198.41.0.4) in 481 ms
yahoo.com. 172800 IN NS ns1.yahoo.com.
yahoo.com. 172800 IN NS ns5.yahoo.com.
yahoo.com. 172800 IN NS ns2.yahoo.com.
yahoo.com. 172800 IN NS ns3.yahoo.com.
yahoo.com. 172800 IN NS ns4.yahoo.com.
;; Received 285 bytes from 192.31.80.30#53(192.31.80.30) in 304 ms
www.yahoo.com. 1800 IN CNAME atsv2-fp.wg1.b.yahoo.com.
wg1.b.yahoo.com. 172800 IN NS yf2.yahoo.com.
wg1.b.yahoo.com. 172800 IN NS yf4.a1.b.yahoo.net.
wg1.b.yahoo.com. 172800 IN NS yf3.a1.b.yahoo.net.
wg1.b.yahoo.com. 172800 IN NS yf1.yahoo.com.
;; Received 178 bytes from 68.142.255.16#53(68.142.255.16) in 311 ms
dns 解析答案
1.肯定答案 : 肯定 有的域名解析答案
2.否定答案 : 请求不存在等原因导致的 无法返回结果
注意 :(肯定答案和否定答案在dns服务器中都会有缓存 本地没有的答案即为否定答案 这样每次请求不存在的主机就不用让主机所在区域的dns服务器每次都响应 占用资源)
3.权威答案 :由主机所在dns服务器解析出的直接得到的答案
4.非权威答案 : 不是由主机所在dns服务器解析返回的答案 而是从其他dns服务器缓存中获取的答案
区域解析库 资源记录:resource record (RR) 记录类型 SOA NS PTR A AAAA CNAME MX
SOA: 起始授权记录 一个解析库只能有一个 soa记录 并且 soa记录要在第一条
NS:专门表明当前区域的dns服务器
CNAME: 别名记录
MX: 邮件交换器
PTR: 反向解析 IP --> FQDN
A:FQDN --> IP
AAAA: FQDN -->IPv6
注意 :1. TTL可以全局继承
2. @可用于表示当前区域的名字
3. 同一个名字可以通过多个记录 定义不同的值 此时dns服务器会以轮询的方式响应
4. 同一个值也可以定义不同的名字 通过不同的名字指向同一个值 仅表示通过不同的名字可以找到一个主机而已
SOA:
name :当前区域名称如 gaoleng.com
value : 多个部分组成
1.当前区域的dns服务器的FQDN或者当前区域名称 可用@简写
2.当前管理员的邮箱地址,但地址中不可有@符号 一般用. 号代替 如 admin.gaoleng.com
3.主服务器协调属性的定义 以及否定答案的TTL
例:
daniu.com. IN SOA dns.daniu.com. root.daniu.com. (2017120902 1H 15M 1W 1D)
NS:
name : 当前区域名
value : 当前区域名的 dns服务器名称 如 “ns1.gaoleng.com”
例如:
@ IN NS ns1.gaoleng.com
CNAME :
name : 别名FQDN
value : 正式的FQDN
例如:
web.gaoleng.com IN CNAME www.gaoleng.com
PTR :
name:ip 的特定格式 如 1.2.3.4 要写成 4.3.2.1 并且加上后缀.in-addr.arpa.
例:4.3.2.1 IN PTR ns1.gaoleng.com.
A :
name: 某主机的FQDN
value:主机对应的ip
例如:
www.gaoleng.com IN A 192.168.117.131 ---------------------
IN A 192.168.117.130 --------------------- (注意第三条 轮询 )
*.gaoleng.com IN A 192.168.117.131 ----------------------------------------------------(泛域名解析 避免用户写错主机名而给错误答案 )
AAAA :
name: 某主机的FQDN
value:主机对应的ipv6
MX :
name:当前区域名
value:当前区域名的服务器(smtp服务器)的主机名
一个区域内MX记录可有多个,但每个记录前都应该有一个数字(0-99表示其优先级) 数越小表示其优先级越高
例如:
@ IN MX 10 mx1.gaoleng.com
bind
主配置文件 /etc/named.conf /etc.named.rfc1912.zones /etc/rndc.key
解析库文件 /var/named/ZONE_NAME.zone
注意 :
(1). 一台物理服务器 可以同时给多个区域提供解析
(2). 必须要有根区域文件
(3). 应该至少有两个(如果包括ipv6 应该更多) 实现localhost 和本地回环地址 127.0.0.1 的解析库
rndc : 默认与bind 安装在同一主机 只能通过127.0.0.1 连接named进程 监听在 953/tcp端口
主配置文件
全局配置 option{}
日志子系统配置 logging{}
区域定义:本机能为哪些zone进行解析 就要定义哪些zone
zone "ZONE_NAME.ZONE" IN {}
注意 : 任何服务程序 想要能过通过网络与其他主机访问 至少要监听在一个能与外部主机通信的ip上
option中默认指定的监听地址为回环地址
缓存名称服务器
只需要监听在一个外部地址上即可
主dns服务器
1.定义zone区域
zone"ZONE_NAME.zone" IN {
type {master|slave|hind|forword} ;
file "..." ;
};
2.定义解析库
定义内容 如 $TTL $ORIGIN (可加可不加 用于省略当前区域名字 ) 在SOA中一般不省略当前区域名字 或FQDN 在后面省略时要注意 省略后不可有点
如 ns1.gaoleng.com 不可为写 ns1. 应写成 ns1 ;加 oridin时 用法 如 $ORIGIN gaoleng.com
资源记录
注意 : 定义完之后一般 将写的文件的 权限定为 640 其他人不可读 并且设置 named为文件的属组 因为named程序 是由named用户引导 在读取配置文件 时若为其他人 无法读取文件
chmod 640 zone_name chown :named zone_name
测试命令:
dig命令
dig [-t type ] name [@server] [query option]
指定资源类型 域名 指定临时dns服务器 不加则为/etc/resolv.conf定义的dns 后接可加选项
查询选项
+[no] trace :跟踪解析过程
+[no] recurse :进行递归解析
测试反向dns解析
dig -x ip @server
模拟区域传送
区域传送:
1. 全量传送 : 传送整个解析库
2. 增量传送 : 传送解析库变化的部分
dig -t axfr zone_name @server
如
dig -t axfr gaoleng.com @192.168.117.129
host 命令
host [-t type] name server
nslookup 命令
nslookup [-option] [name|-] [sercer]
nslookup
>server 指定dns服务器
>set q=rr_type 设定类型
>NAME 要查询的域名
检查区域文件和解析库文件格式是否正确
检查区域
1. named-checkconf
检查解析库文件
2.named-checkzone "解析库名ZONE_NAME" 解析库文件名
如 named-checkzone "gaoleng.com" gaoleng.com.zone
测试时建议将dnssec设置成no 不然对一些测试实施会有影响
反向区域:
区域名为网络地址的反写 后接.in-addr.arpa.
192.168.117 ---> 117.168.192.in-addr.arpa.
1.定义区域
zone "ZONE_NAME" IN {
type {master|slave|forword};
file"ip.zone";
};
例如
zone "117.168.192.in-addr.arpa" IN {
type master;
file "192.168.117.zone";
};
2.区域解析库文件
注意:反向解析库不需要 MX A AAAA
示例
$TTL 1D
$ORIGIN 117.168.192.in-addr.arpa.
@ IN SOA ns1.gaoleng.com. root.gaoleng.com ( 2018020501 1D 1H 1W 1D )
IN NS ns1.gaoleng.com.
IN NS ns2.gaoleng.com.
131 IN PTR ns1.gaoleng.com.
129 IN PTR ns2.gaoleng.com.
129 IN PTR mx1.gaoleng.com.
131 IN PTR www.gaoleng.com.
IN PTR gaoleng.com.
主从复制: 1.从服务器应该为一台独立的服务器 2.主服务器的区域解析库必须有一条NS记录是指向从服务器 --- IN ns2.gaoleng.com ns2 IN A 192.168.117.131 3.从服务器只需要定义区域 而无需提供 解析库文件 库文件应该放置于/var/named/slaves目录中 4.主服务器允许进行做区域传送 5.主从服务器 时间应该同步 可通过ntp进行 6.bind 程序的版本应该一致 若不一致 应该主服务器版本低 从服务器版本高
从服务器
只需要 定义区域
zone "ZONE_NAME" IN {
type slave;
masters{master_ip ;};
file "slaves/ZONE_NAME.ZONE";
};
rndc:
rndc COMMAND
COMMAND:
reload:重载主配置文件和区域解析库文件
reload zone:重载区域解析库文件
status:查看bind状态信息
retransfer zone:手动启动传送过程,而不管序列号是否增加
notify zone :重新对区域传送发起通知
querylog : 开启或关闭查询日志
trace:传递debug级别
trace LEVEL :设定debug级别
子域授权
1. 在父区域中定义子区域
shuai.gaoleng.com IN NS ns1.shuai.gaoleng.com
IN NS ns2.shuai.gaoleng.com
ns1.shuai.gaoleng.com IN A 192.168.117.131
ns2.shuai.gaoleng.com IN A 192.168.117.132
2. 在相应主机上定义子区域解析库文件
$TTL 1d
$ORIGIN shuai.gaoleng.com.
@ IN SOA ns1.shuai.gaoleng.com. admin.shuai.gaoleng.com. ( 2018020601 1H 5M 1W 1D )
IN NS ns1
IN NS ns2
ns1 IN A 192.168.117.131
ns2 IN A 192.168.117.132
www IN A 192.168.117.129
定义转发服务器
注意:1.被指定的转发服务器需要为请求做递归,否则转发请求不进行
2.forward中 first和only first 表示若转发的服务器 不允许查询时 那自己还会去做查询操作 only表示 若转发的服务器不允许查询时 那自己也就放弃查询
3.在进行子域或转发测试时关闭dnssec 否则有的操作进行不了
1.全局定义
options{
forward first|only;
forwarders {FORWARD_DNS_IP;};
};
2.区域转发
zone "ZONE_NAME" IN {
type forward;
forword first|only;
forwarders {FORWARD_DNS_IP;};
};
bind 的安全相关配置
acl:将一个或多个地址归并为一个集合;并通过统一的一个名字调用
acl ACL_NAME {
ip;
net/per;
};
示例: acl slaves{ 192.168.117.129; 192.168.117.131; 127.0.0.1; }; 以后调用salves相当于调用里面的ip
bind的4个内置acl none:没有一个主机 any:任意主机 local:本机 localnet:本机的ip和掩码运算后的网络地址
注意:acl只能先定义后调用 其一般定义在options前面部分
访问控制指令
allow-query{}:允许查询的主机,白名单
allow-transfer{}:允许区域传送的主机
allow-resursion{}:允许递归的主机 如 allow-resursion{ slaves;}; 在zone中不能定义
allow-update:允许更新区域数据库中的内容,关闭才安全
示例 zone "gaoleng.com" IN { type master; file "gaoleng.com"; allow-transfer{slaves;}; allow-update{none;}; };
view视图
用于将不同地方客户端的请求 解析到其客户端所在区域的服务器上 如 将上海用户访问此域名 将其解析到伤害的服务器上 这样响应的速度快
一个bind服务器可定义多个view 每个view可以定义多个zone
每个view用来匹配一组客户端
多个view内可能需要对同一个区域进行解析,但使用不同的区域解析库文件
格式:
view VIEW_NAME {
match-clients{};
};
注意:
1.一旦启用了view,所有的zone都只能定义在view中
2.仅有必要在匹配到允许递归请求的客户端所在的view定义根区域
3.客户端请求到达时,是自上而下检查每个view所服务的客户端列表
示例:
view localht{
match-clients{mynet;};
zone "localhost.localdomain" IN {
type master;
file "named.localhost";
allow-update { none; };
};
zone "localhost" IN {
type master;
file "named.localhost";
allow-update { none; };
};
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
zone "1.0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
zone "0.in-addr.arpa" IN {
type master;
file "named.empty";
allow-update { none; };
};
zone "gaoleng.com" IN {
type master;
file "gaoleng.com";
};
zone "." IN {
type hint;
file "named.ca";
};
zone "daniu.com" IN {
type master;
file "daniu.com.zone";
};
};
view ext {
match-clients{any;};
zone"gaoleng.com" IN {
type master;
file"gaoleng.com.ex.zone";
};
};