写在前面:
博客书写牢记5W1H法则:What,Why,When,Where,Who,How。
本篇主要内容:
● tcp/ip回顾
● DNS协议/DNS服务相关概念
● bind安装配置
正向解析区域
反向解析区域
主从服务器
子域配置
转发配置
● bind安全设置
acl访问控制列表
● bind view智能DNS
相关概念回顾:
tcp/ip
通信子网--->内核中实现
传输层:
添加源端口与目标端口等信息。
由于发送方与接收方的速率可能不同,这样可能会导致数据丢失,所以在传输层的tcp首部信息中设置有“window”(窗口)大小设置。
裸套接字:
应用层进程的报文自己有控制功能,不通过TCP和UDP支撑,直接调用互联网层的IP报文,这类报文称为裸套接字报文。
TCP:Transmission Control Protocol
面向连接的协议,双方通信之前需要实现建立虚连接。
UDP:User Datagram Protocol
用户数据报协议,双方通信之前无需建立虚连接。
sctp等其他协议
互联网层
添加IP等信息,完成网络通讯
物理层
添加MAC地址等信息,万层本地通讯,转发、中继
应用层
请求信息数据,包或包组
应用程序来实现各种协议
如:http/ftp/邮件发送smtp/邮件接收pop3/
tcp/ip协议中基于sockets的通讯一般为C/S结构的。
Server端需要时刻监听(listen)在IP:Port上,Client同样需要一组IP:Port信息与Server通信。
DNS:Domain Name Service,应用层协议
相关概念:
将域名与IP地址进行相互转换的协议。
C/S结构
默认端口为:53/udp、53/tcp
域名:FQDN(Full Qualified Domain Name)
层级结构:
根域:.
记录顶级域服务器信息,全球目前有13个根
顶级域:top level domain(tld)
记录二级域服务器信息
组织域:
.com商业机构 .net网络组织 .org非盈利组织 .gov政府部门 .edu教育机构 .mil军工部门
国家/行政区域:
.cn中国 .iq伊拉克 .tw台湾 .hk香港 .jp日本
二级域:
记录三级域服务器信息以及本地域主机信息
baidu.com域 magedu.com域 com.cn域等
...
DNS查询方式:
(1)递归查询
客户端向本地DNS查询记录,当本地DNS中没有对应条目时,DNS服务器去网络中查询,并将结果返回给客户端。
客户端-->本地DNS
|-->根域
|-->顶级域 tld
|-->二级域
|...
(2)迭代查询
客户端向本地DNS查询记录,当本地DNS中没有对应条目时,DNS返回根域地址给客户端,客户端依次去查询。
客户端-->本地DNS
|-->根域
|-->顶级域 tld
|-->二级域
|...
DNS名称解析方式:
以下两种解析方式,不是同一个名称空间、不是同一个目录树、也不是同一个解析库。
正向解析:FQDN-->IP
反向解析:IP-->FQDN
域名注册方式:
万网(国内,需备案)、godaddy(国外站点,无需备案)等代理注册站点。
注意,一般注册的是二级域名,如baidu.com,而www.baidu.com只是域中的一台主机。
DNS服务器类型:
不负责解析域名:
缓存名称服务器
负责解析至少一个域(也会缓存条目)
主域名解析服务器
从域名解析服务器
服务器返回的解析答案类型:
肯定答案:
否定答案:
不存在查询的键,因此,不存在预期查询的键对应的值。
权威答案:
返回本DNS服务器直接维护的条目,使用dig命令会有"aa"标识。
非权威答案:
非本机维护的条目(缓存或转发)
主-辅DNS服务器:
主DNS服务器:维护所负责解析的域数据库的那台服务器;读写操作均可进行;
从DNS服务器:从主DNS服务器或其它从DNS服务器那里“复制”一份解析库;但只能进行读操作;(注意“复制”操作是以区域zone为单位的)
主从服务器协调属性:
序列号:serial
也即是数据库的版本号;主服务器数据库内容发生变化时,手动设置其版本号递增;
刷新时间间隔:refresh
从服务器每多久到主服务器检查序列号更新状况;
重试时间间隔:retry
从服务器从主服务器请求同步解析库失败时,再次发起尝试请求的时间间隔;
过期时长:expire
从服务器始终联系不到主服务器时,多久之后放弃从主服务器同步数据;停止提供服务;
否定答案的缓存时长:
注意:时长对应的单位可以是M、H、D、W,对应分钟、小时、天、星期
另外,当主服务器数据变动时,主服务器会"主动通知"从服务器更新数据;
区域传送:
全量传送:axfr, 传送整个数据库;一般第一次同步时使用。
增量传送:ixfr, 仅传送变动的数据;
区域(zone)和域(domain):
区域:
正向解析或反向解析的功能与数据库的集合。
域:
如baidu.com这个二级域,包含了正向解析和反向解析区域。
区域数据库文件zone格式:
资源记录Resource Record(rr)
语法:
name [TTL] IN RR_TYPE value
记录类型(RR_TYPE):
SOA
起始授权记录,必须为第一条,有且只能有一条。
name:当前区域名称
如“fredme.com.”或“4.3.2.in-addr.arpa.”
value:
(1)当前区域名称(也可以使用主DNS服务器名称)
(2)当前区域管理员邮箱,其中"@"用"."代替
(3)主从服务器协调属性定义,放入()内
(4)“;”后为注释信息
例:
magedu.com. 86400 IN SOA magedu.com. admin.magedu.com. ( 2017010801 ; serial 2H ; refresh 10M ; retry 1W ; expire 1D ; negative answer ttl )
NS
域名服务器条目
name:当前区域名称
value:当前区域某DNS服务器FQDN名,如ns1.fredme.com
例:
fredme.com. 86400 IN NS ns1.fredme.com.
MX
邮件服务器条目
name:当前区域名称
优先级:0-99,数字越小,优先级越高,即使只有一个mx服务器,也需要设置优先级
value:当前区域某邮件交换器的FQDN名
例:
fredme.com. IN MX 10 mx1.fredme.com.
A
IPv4-->FQDN条目
name:FQDN
value:IPv4地址
例:
www.fredme.com. IN A 1.1.1.1
AAAA
IPv6地址条目
name:FQDN
value:IPv6
CNAME
FQDN别名
name:FQDN格式的别名
value:FQDN正式名称
例:
web.fredme.com. IN CNAME www.fredme.com.
PTR
FQDN-->IPv4条目
仅反向区域文件中配置
例:
23 IN PTR www.gredme.com.
注意:
(1)TTL可以全局继承。如头部定义$TTL 3600
(2)@表示当前区域名称
(3)相邻两条记录name相同时,后者可以省略name项
(4)正向解析区域文件中,各MX、NS记录中的FQDN应该有对应的A记录
bind安装配置:
BIND:
Berkeley Internet Name Domain,ISC.org
是DNS协议的一种实现软件程序,其主程序名称为named。
程序包:
bind-libs:被bind和bind-utils包中的程序共同用到的库文件;
bind-utils:bind客户端程序集,例如dig, host, nslookup等;
bind:提供的dns server程序、以及几个常用的测试程序;
bind-chroot:选装,让named运行于jail模式下;
配置文件:
主配置文件:/etc/named.conf
或包含进来其它文件;
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key
文件格式:
全局配置段:
options { ... };
日志配置段:
logging { ... };
区域配置段:
zone { ... };
定义那些由本机负责解析的区域,或转发的区域;
注意:每个配置语句必须以分号结尾;
解析库文件:
/var/named/目录下;
一般名字为:ZONE_NAME.zone
注意:
(1) 一台DNS服务器可同时为多个区域提供解析;
(2) 必须要有根区域解析库文件: named.ca;
(3) 还应该有两个区域解析库文件:localhost和127.0.0.1的正反向解析库;
正向:named.localhost
反向:named.loopback
rndc:remote name domain contoller
远程管理bind程序的软件
953/tcp,但默认监听于127.0.0.1地址,因此默认仅允许本地使用;
命令:
用于named服务控制
rndc status
查看named服务状态
rndc stats
查看统计信息
rndc reload/stop/restart
重读配置文件/停止服务/重启服务
rndc flush
清空named缓存
缓存名称服务器的配置:
bind程序安装完成之后,默认即可做缓存名称服务器使用,即没有专门负责解析的区域,直接启动服务;
监听地址配置:
修改为外卡IP,以供能够访问此IP的客户端访问DNS服务。
listen-on port 53;
listen-on port 53 { 172.16.100.67; };
关闭dnssec
初学者建议关闭dnssec
dnssec-enable no;
dnssec-validation no;
dnssec-lookaside no;
关闭仅允许本地查询:
//allow-query { localhost; };
注意:
(1)"{}"左右有空格
(2)C语言格式的注释信息,单行注释//,多行注释/* */
检查配置文件语法错误:
named-checkconf [/etc/named.conf]
测试工具:
dig
用来测试DNS系统,所以不会查询hosts文件中的记录。
正向解析测试:
dig [-t RR_TYPE] name [@NS_IP] [query options]
query options:
+[no]trace:跟踪解析过程;
+[no]recurse:进行递归解析;
反向解析测试:
dig -x IP [@server]
模拟完全区域传送:
dig -t axfr DOMAIN [@server]
host
host [-t RR_TYPE] name SERVER_IP
nslookup
nslookup [-options] [name] [server]
交互式模式:
nslookup>
server IP:以指定的IP为DNS服务器进行查询;
set q=RR_TYPE:要查询的资源记录类型;
name:要查询的FQDN;
正向解析区域配置:
(1)修改主配置文件/etc/named.conf
options部分:
listen-on
修改监听IP地址,此地址为客户端能够访问的地址
allow-query
设定允许查询的主机。注释掉,不做限制
dnssec-enable
dnssec-validation
dnssec相关配置,关闭,设置为no
(2)根据主配置文件的include项,修改/etc/named.rfc1912.zones
一般自定义zone配置都写入到此文件
新建自定义zone条目:
zone "ZONE_NAME" IN {
type {master|slave|hint|forward};
file "ZONE_NAME.zone";
};
注意:区域名字即为域名;
(3)根据上步骤,新建zone文件
根据上步配置,假设指明的zone文件为grub2.com.zone,在/var/named/目录新建此文件,内容为:
$TTL 3600 ;单位为秒
$ORIGIN grub2.com. ;设定域名
@ IN SOA ns1.grub2.com. admin.grub2.com. (
2016041001 ;标识符
10M ;同步时间
1H ;重试时间
1D ;过期时间
1D ;否定回答的过期时间
)
IN NS ns1
IN MX 10 mx1 ;注意MX记录有优先级值
ns1 IN A 192.18.31.7
mx1 IN A 192.18.31.6
www IN A 192.168.31.7
IN A 192.168.31.6 ;定义多个相同FQDN条目时,客户端每次访问显示顺序不同,相当于进行了负载均衡。省略FQDN表示与上一条目相同。
web IN CNAME www
注意:需要修改权限信息以保证数据安全:
chgrp named grub2.com.zone
chmod o= grub2.com.zone
(4)检查配置文件与zone文件,重读配置文件
named-checkconf
named-checkzone grub2.com. /var/named/grub2.com.zone
rndc reload
反向解析区域配置:
(1)修改/etc/named.rfc1912.zones文件
自定义zone条目:
zone "ZONE_NAME" IN {
type master|slave|hint|forward;
file "FILE.zone";
};
补充:
ZONE_NAME:
反写的网段地址.in-addr.arpa
31.18.172.in-addr.arpa
FILE.zone:
网段.zone即可
172.18.31.zone
(2)定义zone文件
假设为:172.18.31.zone
内容为:
$TTL 36000
$ORIGIN 31.18.172.in-addr-arpa
@ IN SOA ns1.grub2.com. admin.grub2.com. (
2016041001
10M
1H
1D
1D
)
IN NS ns1.grub2.com.
7 IN PTR ns1.grub2.com.
6 IN PTR mx1.grub2.com.
7 IN PTR www.grub2.com.
6 IN PTR www.grub2.com.
补充:
反向解析区域zone文件也可以设置CNAME条目,但与正向解析zone不同,应该填写IP
主从服务器:
从服务器是区域(zone)级别的同步。
其他从服务器仍然可以从从服务器同步,即级联。
负载均衡:
即多台DNS服务器都发挥作用为客户端提供服务的实现。
(1)将本地客户端的DNS顺序修改一下,一部分将主服务器设置为主DNS,一部分将从服务器设置为主DNS
(2)由上级完成,告知上级DNS服务器有多台服务器,由上级分发到不同服务器上。
服务器原则:
(1)只给本地客户端递归查询
(2)非本地客户端只提供本地管理的域名的查询
从DNS配置方法:
(1)定义区域
指名类型为从服务器(slave)
zone "ZONE_NAME" IN {
type slave;
file "slave/ZONE_NAME.zone";
masters { MASTER_IP; };
};
注意:之所以将zone文件指定到salve目录下,是为了安全,默认/var/named/目录对named组没有写权限,而修改权限势必会有安全隐患,所以选择在salve子目录是非常明智的。
(2)检查配置文件,重载配置或重启服务
named-checkconf
rndc reload
注意:
a.需要确保主服务器的区域数据文件中为此从服务器配置了NS记录以及对应的A或PTR记录,修改区域文件后记得序列号修改一下。
b.主服务器应该设置访问控制,只允许从DNS进行区域传送。
c.需要注意系统时间需要同步,这样才能保证后续同步操作。
ntpdate命令。
子域配置:
(1)正向解析区域授权子域:
只需要在上级域中添加子域的NS记录以及对应的A记录即可。
子域名称 IN NS 子域域名服务器的FQDN
子域服务器FQDN IN A NS_IP
例:
ops.grub2.com. IN NS ns1.ops.grub2.com.
ns1.ops.grub2.com. IN A 172.18.31.9
注意:如果子域有主从等多台服务器,需要在上级域中记录多条。
(2)子域服务器配置
正常配置属于此子域的主机或其子域即可。
定义转发:
当客户端从子域DNS服务器查询父域中定义的域名条目时,由于子域中没有相关记录,所以子域DNS默认会去根域服务器递归查询,而这样做显然没有必要。比如,客户端向ops.grub2.com的域服务器请求"www.grub2.com"域名对应IP地址。
当本地查询不到条目时,设置转发到其他特定服务器。
注意!只有允许递归查询的客户端请求才会被转发。参照下面访问控制指令。
区域转发
仅转发某特定区域的解析请求
zone "ZONE_NAME" IN {
type forward;
forward first|only;
forwarders { SEREVER_IP; ... };
};
first:首先转发。服务器不响应时,再去迭代查询
only:只转发。
全局转发
凡本地未定义区域,全部转发给其他服务器。
在/etc/named.conf配置文件的开头options {}中添加
forward only|first;
forwarders { SERVER_IP; ... };
bind安全相关配置:
acl:
访问控制列表
将1个或多个地址归并为一个集合,通过集合对集合中所有地址进行统一调用。
由于acl只能先定义再使用,所以建议放到配置文件最前端。
在主配置文件/etc/named.conf最前端定义:
acl ACL_NAME {
IP;
NET/PRELEN;
};
注意:网段只支持"/数字"的格式
如:
acl localnet {
172.18.31.0/24;
127.0.0.0/8;
172.18.30.7;
};
内置acl:
none:空
any:任意
local:本机
localnet:本机IP所属的网路
访问控制指令:
在主配置文件中options { };中进行配置。
allow-query { };
允许查询的主机,白名单
allow-transfer { };
允许向哪些主机做区域传送,默认为所有主机,建议设置为仅允许从DNS服务器。
allow-recursion { };
允许哪些主机可以向当前DNS服务器发起递归查询请求,默认允许所有主机。
使用时记得先注销掉options{};中"recursion yes;"条目,此条目表示为所有主机发起递归查询。
allow-update { };
DDNS,允许动态更新区域数据库文件内容。
bind view
智能DNS。对不同来源的客户端解析为不同的IP地址。CDN就是利用这种原理。
view VIEW_NAME {
zone
zone
...
};
如:
view internal {
match-clients { 172.18.0.0/8; };
zone "grub2.com" IN {
type master;
file "grub2.com/internal";
};
};
view external {
match-clients { any; };
zone "grub2.com" IN {
type master;
file grub2.com/external";
};
};
注意:view条目是从上到下匹配的,所以,应该将小范围view放到前面。