DNS---最让我难以理解的部分,却是最简单的常识!
Dns服务器的工作原理,简单的说,就是pc机在访问网络(如,一个网站)的时候,把网络上的完全合格域名(FQDN)解析成了ip地址,然后,pc机才能访问网络(这个网站)。而他并没有改变这个网络的原有属性,即,这个网站ip地址原本是公有ip,现在还是公有ip。只有公有的ip才能被别人外网访问,私有ip是绝对不可能被外网访问的,这也是为什么一个内网无法去申请域名的原因。它是私有ip,申请了域名,别人也无法访问。除非你去购买一个公网ip。家庭网络是公有ip,属于拨号连接,可以申请域名,别人可以ping通,但自己申请的域名是已经是顶级域之下的二级域。如,你在域名开发商那里申请了一个.com结尾的域名为ttkl.com,而你又在自己的主机上新建了一个dns服务器,想要别人赖你这里注册,没门!首先,要想实现这个功能,必须有相关部门的授权,再有就是已经有了更短的域名可以注册,别人为什么要去你那里玩耍,还是别想那么多了。
要是在一个大型的公司,就另当别论了,你可以为公司的服务器配置dns服务器,然后公司里的各个主机就可以在你这注册。由于公司的各个主机都是内网ip,所以即使在配置好的dns服务器上注册了域名,也只能在内部网络使用,不过这样已经很好了,各个部门之间通信不需要输入繁琐的ip地址,只需要输入注册好的域名即可。
准备工作,配置yum源,安装bind包
一,bind是linux中 配置dns服务器,必不可缺的软件工具。
所以,要配置dns服务器,第一步就是下载安装bind包。
# yum -y install bind
需要注意的是,bind包下载完后,可能有些系统在装的时候选择了最小化安装,因此一些工具没有被装进去而导致一些解析查询命令无法使用。例如,dig命令。
这时,就需要用到查找命令依赖的包。
在dig命令可用的主机上查找
# rpm -qf $(which dig)
bind-utils-9.8.2-0.17.rc1.el6.x86_64
dig只是一个例子,需要查询哪个命令,就输入哪个名利即可。根据查询结果,可安装相应的包。
二,glibc是gnu发布的libc库,即c运行库。glibc是linux系统中最底层的api(Application Programming Interface,应用程序编程接口),几乎其它任何运行库都会依赖于glibc。
Gethostip:通过glibc中的库文件系统调用,查找/etc/hosts中对应的主机,将其解析为对应的ip。实现本地解析。
#gethostip localhost
localhost 127.0.0.1 7F000001
Gethostip获取的是/etc/hosts文件中,对应主机的ip
Ip------主机名 --------主机别名
127.0.0.1 localhost localhost(这两个名字可以随便起)
/etc/hosts文件内容
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4-----ipv4地址
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6-----ipv6地址
192.168.1.1 shenlong tiantang-----自己添加的ipv4地址
注意:在/etc/resolv.conf或/etc/hosts中标识dns服务器的时候,不能直接标识服务器的主机名,因为在标识之前无法解析。所以,格式如下
nameserver 172.16.0.1
如果有dns服务器,gethostip会先访问本地的hosts文件,然后再去请求远程dns服务器进行域名解析。所以,本地的hosts文件的优先级高于远程dns服务器。
如果没有修改/etc/resolv.conf中的服务器ip,在解析的时候又没有指明解析的服务器,解析的信息中,下方的服务器ip会显示本地回环ip,虽然也指的是本地ip,但显示的形式是不同的。如图
没有配置服务器ip时的解析信息,上图
指明了配置服务器ip时的解析信息。上图
Dns服务器工作原理
迭代查询----连续发出n次请求才有结果前几次都是参考性答案---客户机不可以迭代,只有服务器才可以
递归查询----查询者只发出一次请求就得到答案
客户机向服务器发出请求,服务器去一级一级的寻找,前者一次性得到答案,属于递归,后者进行的多级查找则叫迭代。
顶级域:
组织域:.net, .com, .org, .mil, .edu, .gov, .cc, .mobi
国家域:.jp, .tw, .hk, .iq, .ir, .cn, .uk, .us
反向域:FQDN <--> IP
FQDN---完全合格域名(fully qualified domain name)
DNS解析类型:
正向解析:FQDN-->IP
反向解析: IP --> FQDN
DNS: FQDN --> IP---正向域名解析
根:.
IP --> FQDN:--反向域名解析
根:.in-addr.arpa.
名称解析库:/var/named/
文本文件(只能包含资源记录和宏定义): 每一行称作一个资源记录
宏:标识符
资源记录类型:
A 记录 FQDN-->IPv4: (Address)
AAAA 记录 FQDN-->IPv6:
NS (Name Server) Domain-->DNS Server:
SOA (Start Of Authority), 起始授权记录-------------- Domain-->Master DNS:
CNAME (Canonical Name)--正式名称 --前者是别名,后者是正式名字 FQDN-->FQDN:
PTR (pointer)--指针记录,把ip地址解析成主机名 ----- IP-->FQDN
Mail Server: MX (Mail eXchanger), 有优先级:0-99 Domain
域 意义
.comCommercial(商业组织)
.eduEducational(教育机构)
.govGovernment(政府部门)
.milMilitary(军事部门)
.orgNon-Profit organization(非盈利组织)
.netNetwork(主要网络支持中心)
在美国之外,最高层域通常是国家域,例如.cn 代表中国(china)等等。
根服务器的资源记录格式,包括子域授权记录
在解析子域的时候,要注意子域所在主机的防火墙是否关闭
还要注意主配置文件中下列四项是否注释掉,否则,子域解析不了父域。
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
managed-keys-directory "/var/named/dynamic";
1) 重启后生效
开启: chkconfig iptables on
关闭: chkconfig iptables off
2) 即时生效,重启后失效
开启: service iptables start
关闭: service iptables stop
需要说明的是对于Linux下的其它服务都可以用以上命令执行开启和关闭操作。
在开启了防火墙时,做如下设置,开启相关端口,
修改/etc/sysconfig/iptables 文件,添加以下内容:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
bind:
主配置文件:named.conf,每个语句都要使用分号结尾;
定义区域;
定义各区域的全局配置;
定义视图;
定义日志;
程序文件:/usr/sbin/named
dig命令:查找记录
dig -t 资源记录类型 名称 @server-ip
dig -t NS root-servers.net-----通过本机/etc/resolv.conf指向的dns第一个服务器查找一个域root-server.net的NS记录有哪些
dig -t NS root-servers.net @dns主机名-------绕过本地通过@dns主机查找域的NS记录(DNS服务器)
dig -x 1.1.1.1 反向查找FQDN
dig +trace 跟中查找
dig -t axfr zone 完全区域传送
dig -t ixfr zone 增量区域传送
host命令:
host -t 资源记录类型 名称
Host根dig用法相似,只不过host显示的相关信息更简明
# host -t NS net
net name server aa.net.
# host -t A aa.net
aa.net has address 172.16.251.28
ss -uan ---查看udp端口
ss -tan ---查看tcp端口
ss -tuan ---查看udp端口和tcp端口
netstat -tunl ---查看udp和tcp端口
配置dns的主要步骤
一,修改主配置文件
主配置文件/etc/named.conf的修改:注释掉options段中如下选项,也可以修改
//listen-on port 53 { 127.0.0.1; };----表示默认只监听本地ipv4地址
//listen-on-v6 port 53 { ::1; }; ------默认监听ipv6地址
//allow-query { localhost; };-------只允许本机查询
redhat给出只是为了安全
为了方便使用,可以将配置文件中不需要用到的全部注释掉
启动named服务:缓存DNS服务器; 默认1000个本地客户端使用服务
二,在区域文件新建区域
在区域配置文件/etc/named.rfc1912.zones新建一个区域:
zone "区域名称" IN {
type master|slave|forward;(master主,slave从)
file "ZONE_NAME.zone";
};
三,检测主配置文件语法错误:
named-checkconf:
启动服务
#Service named start------------启动服务
四,在/var/named下建立“ZONE_NAME.zone”文件,通常只包含宏定义和资源记录,而第一个记录必须是SOA记录;
五,检测区域文件语法错误:named-checkzone
确保主配置文件和各区域解析库文件的权限为640,属主为root,属组为named;
完了之后
# rndc reload------------重新加载服务,配置好的资源记录就可以被解析到了。
在生产环境中,只能用reload重新加载,而不能使用restart,否则会引起服务器异常。
六,经过上五步,一个简单的dns服务器就算是配置完了。至于反向区域,从域,子域授权、acl、view、安全相关功能、转发域、日志子系统,下面仍会继续深入讲解。
反向区域的区域名称:网络地址反过来.in-addr.arpa.
100.16.172.in-addr.arpa.
反向解析库文件
额外相关知识点
rndc:Remote Name Domain Contoller
远程主机控制
reload 重新装入配置文件和区域
reload zone [class [view]] 重新装入单个区域
refresh zone [class [view]] 安排区域的立即维护
reconfig 仅重新装入配置文件和新区域
stats 将服务器统计信息写入统计文件中
querylog 切换查询日志
dumpdb 将高速缓存转储到转储文件 (named_dump.db)
stop 将暂挂更新保存到主文件并停止服务器
halt 停止服务器,但不保存暂挂更新
trace 将调试级别增加一级
trace level 更改调试级别
notrace 将调试级别设置为 0
flush 刷新服务器的所有高速缓存
flush [view] 为某一视图刷新服务器的高速缓存
status 显示服务器的状态
restart 重新启动服务器(尚未实现)
一般服务不能重启,而要#rndc reload------------重新载入
控制dns服务器的工具,停掉,重新装载,显示各个区域的状态,清空缓存
rndc
读一个配置文件来决定如何联系名字服务器并决定使用哪一个算法和密钥。
选项 ----------------------------------
-b source-address 使用 source-address 作为连接服务器的源地址。允许多个实例设置 IPv4 和 IPv6 源地址。
-c config-file 使用config-file 作为缺省的配置文件/etc/rndc.conf 的替代。
-k key-file 使用 key-file 作为缺省的密钥文件/etc/rndc.key 的替代。如果
config-file 不存在,/etc/rndc.key 中的密钥将用于认证发向服务器的命令。
-s server server 是与 rndc 的配置文件中 server语句匹配的服务器的名字或地址。如果命令行没有提供服务器,会使用 rndc 配置文件中 options 语句中的 default-server子句所命名的 主机。
-p port 发送命令到 TCP端口 port,以取代 BIND 9 的缺省控制通道端口 953。
-V 打开冗余 日志。
-y key_id 使用配置文件中的密钥 key_id。
bind访问控制列表:
访问控制----------给对应函数起的名字------------对应的元素
acl string { address_match_element; ... };
allow-transfer{} 允许区域传送的主机
allow-query{} 允许来查询的主机
allow-recursion{} 允许递归查询的主机
allow-update{} 允许更新
ddns --- 动态dns---一般不允许开启
钓鱼站点: 简单的说就是冒充正宗银行网站或者金融机构的网站,之后在登陆时骗取你的银行帐号和密码
在/etc/namec.conf中添加,完了之后,在/etc/named.rfc1912.zone中对应的区域中添加
allow-transfer { allowxfer ; }即可。
BIND 日志的常用术语
在讲述 logging 语句的语法之前,先要熟悉一些常用术语
术语 含义
channel(通道) 日志输出方式,如:syslog、文本文件、标准错误输出或 /dev/null
category(类别) 日志的消息类别,如:查询消息或动态更新消息等
module(模块) 产生消息的来源模块名称
facility(设备) syslog 设备名
severity(严重性) 消息的严重性等级
channel categroy----------日志系统
categroy: 记录哪个功能产生的日志信息,一共内置有15种category;
general 包括所有未明确分类的BIND消息。
client 处理客户端请求。
config 配置文件分析和处理。
database 同BIND内部数据库相关的消息,用来存储区数据和缓存记录。
dnssec 处理DNSSEC签名的响应。
lame-servers 发现错误授权。
network 网络操作
notify 异步区变动通知。
queries 查询日志
resolver 名字解析,包括对来自解析器的递归查询的处理。
security 认可/非认可的请求。
update 动态更新事件。
xfer-in 从远程名字服务器到本地名字服务器的区传送。
xfer-out 从本地名字服务器到远程名字服务器的区传送。
channel: 日志信息记录到何处,一般有两种形式,一种为file,另一种为syslog;同时,还需要指定日志级别;
一个category产生的日志可以发往多个channel;而一个channel只能为一个category记录日志;
channel CHANNEL_NAME {
file /path/to/somefile|syslog facility;
severity LEVEL;
};
category CATEGORY {CHANNEL_NAME ; };
实例:
转发的前提:接收转发请求的服务器必须能够为请求者做递归查询;
forwarders { IP; };
forward only|first;
forward only-----转发给你,你告诉我没答案,我就不再找
forward first-----转发给你,你告诉我没答案,我还继续找
eg: forward only;
forwarders { 172.16.0.1; };
在实现转发的时候最好把配置文件中多余的项全都注释掉,否则会转发不成功。
我在本地主机上新建了一个子域,在另一台主机上创建的父域,而且父域为跟域,本地dns服务器所管理的域为.com,上图为所有不能解析的地址都转发到172.16.0.1,但是需要注意的是,如果请求解析的地址为.com结尾的地址,即是本地服务器所管理的域,它就无法解析。下面是转发的过程:
承接上图,转发baidu.com.hk
本机dns管理.com域,无法对以.com结尾的主机完成解析,除非自己在资源记录库中添加有其对应的记录,下图为证。
添加了baidu.com的记录后。
对指定区域转发
首先,删除在/etc/named.conf中添加的转发记录,在/etc/named.rfc1912.zone中添加区域。
子域授权,事例图
/var/named/root.zone文件-----作为子域的父域ip:172.16.254.79
在父域的资源记录库中授权两个子域,注意,此时添加的两个子域有所不同哦
看到了吗,为什么子域1我没有为其添加a记录,其实,这里写不写a记录都可以,我们可以看到,它有一个独特之处,就是他的主机名和子域2都是以.com结尾,而子域2它本身又是管理着.com这个域,在配置子域2这台dns服务器的时候,它自己可以解析自己。而子域1是由子域而解析的,因为根在解析子域1的时候,它并不知道net在什么地方,而是先解析.com的,所以,这里必须写上子域2的ip,确保它能被解析到,然后在子域二那台服务器上为子域1添加a记录,就能确保,它可以被别人解析。即,别人可以在子域2那里解析到它。不过,我还是建议大家,在这里写上子域1的ip,确保万无一失。
将两个子域建在同一个ip为172.16.251.28的主机上
区域文件/var/named/com.zone
一定要注意,这里必须为aa.com添加A记录,否则,有可能会出现无法解析的情况。
从域创建
创建好了之后,rndc reload,在/var/named/slaves/下就可以看到主dns服务器的资源记录了。
bind view: 视图----实现智能dns
brain split智能分离,就是将不同类型的客户机分开管理。
如果使用view来管理区域配置文件,所有的区域必须都写在view中。
view "" {
match-clients { 172.16.0.0/16; };----------对172.16.0.0网段内的主机发送的请求,都用这个这
zone "magedu.com" IN { 个域解析
type master;
file "internal"
}
}
view "" {
match-clients { 192.168.0.1/16; };-----------对192.168网段的都用这种解析方法。
zone "magedu.com" IN {
type master;
file "internal"
}
}