首页 > 代码库 > DNS服务器的搭建
DNS服务器的搭建
DNS: Domain Name Service
C/S
S: bind bekerley internet
name domain
C: 共享库
53/udp, 53/tcp
名称解析:主机名解析
把一种名称转换为另一种名称的过程
名称:字串、数字
解析库:某种存储
username <--> uid
某种存储:
文本文件
关系型数据库
LDAP:Lightweight Directory Access Protocol, 389/tcp
解析:根所用户所提供一种名称,去查询解析库,以得到另一种名称
hosts: 文本文件
IANA:
文本文件
ftp:--> DNS(中心服务器)
Unix:
向下授权管理机制
根域:root domain
一级域:top-level domain(顶级域)
二级域:公司、组织、个人使用
主机:www
其中根域和顶级域是有inan直接管理分配的
递归:
A --> B --> C –> D
A问B;B自己不知道,但B知道C有A要的结果,然后B去找C要结果;但C自己也不知道,但C知道D有A要的结果,然后C去找D要结果;得到结果后逐级上报结果,D给C,C给B,B给A
迭代:
A --> B
A --> C
A –> D
互联网上是 递归 + 迭代的方式,
根结点:全球的根节点一共13个
DNS中的名称与对应的主机的真实主机名不要求是一样。这可以实现负载均衡
一个名称可以对应多个IP
一个IP上也可以多个名称
DNS名称解析:
FQDN --> IP正向解析
IP -->
FQDN反向解析。邮件服务器要求必须是反向解析的,负责认为是垃圾邮箱服务器
反向解析的域名后缀 .in-addr.arpa
一级域:
组织域: .com, .org, .net, .mil军事组织,
.edu, .gov政府组织, .info, .cc, .me, .tv
国家域:.cn,
.us, .uk, .jp, .tw, .hk, .iq, .ir
反向域:.in-addr.arpa
域:domain是一个逻辑概念,
区域:zone是一个物理概念,任何一个解析库都叫做一个区域,故一个域有2个区域,但并不是域包含区域,层级不同。
正向解析:FQDN --> IP
正向解析库 从物理概念来讲是个文件
反向解析:IP
--> FQDN
反向解析库 从物理概念来讲也是个文件
区域解析库:
资源记录:rr(resource record) 每一行的条目,用来标记不同的身份
有类型的概念:用于标记此记录解析的属性
SOA:
Start Of Authority, 起始授权记录,一个区域文件只能有一个,标记这个NS服务器区域由谁来管理;
NS:Name Server名称服务器,可以有多个
MX:
Mail eXchange, 邮件交换器,MX记录有优先级属性(0-99);
A:FQDN -->
IP,专用于正向解析库
PTR: IP --> FQDN,专用于反向解析库
AAAA:FQDN --> IPv6,专用于正向解析库
CNAME: Canonical
Name,正式名称
DNS查询:
递归
迭代
hosts --> local dns cache --> dns server (cache) --> 迭代
非权威应答:通过缓存,未必准确
客户端要接入互联网就要给其DNS指向,linux是在/etc/resolv.conf里面用nameserver配置指向DNS服务器的,可以有多个,一般只有第一个生效,在第一个出问题后第二个才生效
DNS服务器类型:
主DNS服务器
从DNS服务器
缓存服务器:只负责一半的任务,不用注册,只管出去迭代,而不给外部解析本地。
解析库文件同步的过程:区域传送 (单方向传送)
zone transfer
完全区域传送:axfr
增量区域传送: ixfr
周期性检查 + 通知
子域授权:
为什么要创建子域呢?比如在一个大公司中申请了一个域名,但公司有上百台主机,而且每个不同的部门要求自我独立互不影响,此时一个域管理起来就很困难了,所以在这个域下划分几个子域来实现更好的管理。
。
正向子域授权:
只需要在父域的区域解析库中添加“胶水记录”, glue record
子域名称 IN NS
子域的名称服务器,注意每个子域可能有主从多台服务器,此时用ns,ns2,ns3,……。
ops IN
NS ns.ops
ns.ops IN A 172.16.100.77
子域和父域不一定在同一网段下,只要2个能够通信即可。例如,这里用父域172.16.249.191;子域是192.168.1.199。
先编辑/var/named/mageedu.com.zone加入我们所需的条目
。
重新载入# rndc reload
。
本地测试# dig -t NS ops.mageedu.com @172.16.249.191
为什么解不到了,本地有记录的啊。
我们做完全区域传送看下# dig -t AXFR mageedu.com @172.16.249.191
其实是因为此时子域服务器还未建立,所以一切都无法响应。
接下来我们建立子域服务器:我们子域的地址是:192.168.1.199
进入我们所在主机,安装bind后 在# vim /etc/named.conf中把不方便我们实验的东西注释掉;然后直接启动named,由于是第一次安装启动bind,所有启动是生成/etc/rndc.key会慢些。完成后,编辑# vim /etc/named.rfc1912.zones文件,定义新的区域:zone “ops.mageedu.com” IN {
type master;
file “ops.mageedu.com.zone”;
};
配置好后,本地测试# dig -t A mail.ops.mageedu.com @192.168.1.199
。
而后去父节点测试# dig -t NS ops.mageedu.com @172.16.249.191
此时OK。
配置转发器:
# vim /etc/named.conf配置
加入允许递归项和转发对象:172.16.249.191就当前而言就是父域的服务器。
# named-checkconf
检测语法是否有误。
# rndc reconfig重读配置文件
。
# dig -t A www.mageedu.com @192.168.1.199解析mageedu.com域
。这里转发的是所有的非本机负责的区域给父级DNS服务器。
也可以转发某个或某些特定的区域给上层DNS服务器;配置转发器:
首先改变/etc/named.conf的配置,然后清空缓存#rndc flush
。
配置#vim /etc/named.rfc1912.zones文件
。
检查
。
此时想解析# dig -t A www.sohu.com就解析不了了
。
编译安装
首先得到所需的bind源代码,此处以bind-9.9.5为例,解压后cd到bind-9.9.5下
确保系统用户named的存在,不存在则添加之。
# ./configure --prefix=/usr/local/bind9.9.5 --sysconfdir=/etc/named/ --enable-threads --disable-chroot --disable-ipv6
。
# make && make install。
# vim /etc/profile.d/bind.sh
。
提供主配置文件/etc/named/named.conf
为根及localhost提供区域解析库
# dig -t NS . @a.root-servers.net > /var/named/named.ca
# named-checkconfig
# named -g -u named -c /etc/named/named.conf
# named -u named
、提供rndc
# rndc-confgen -r /dev/urandom > /etc/named/rndc.conf
# chown root:named /etc/named/rndc.conf
# chmod 440
/etc/named/rndc.conf
把rndc.conf中的后半段复制到named.conf中,并启用之;
提供脚本
#!/bin/bash
#
#
description: named daemon
# chkconfig: - 25 80
#
pidFile=/usr/local/bind9/var/run/named.pid
lockFile=/var/lock/subsys/named
confFile=/etc/named/named.conf
[ -r /etc/rc.d/init.d/functions ] && . /etc/rc.d/init.d/functions
start() {
if [ -e $lockFile ]; then
echo "named is already running..."
exit 0
fi
echo -n "Starting named:"
daemon
--pidfile "$pidFile" /usr/local/bind9/sbin/named -u named -c "$confFile"
RETVAL=$?
echo
if [ $RETVAL -eq 0 ]; then
touch $lockFile
return $RETVAL
else
rm -f $lockFile
$pidFile
return 1
fi
}
stop() {
if [ ! -e $lockFile ]; then
echo "named is stopped."
# exit 0
fi
echo -n "Stopping named:"
killproc named
RETVAL=$?
echo
if [ $RETVAL -eq 0 ];then
rm
-f $lockFile $pidFile
return 0
else
echo "Cannot stop
named."
failure
return 1
fi
}
restart() {
stop
sleep 2
start
}
reload() {
echo -n "Reloading named:
"
killproc named -HUP
#killall
-HUP named
RETVAL=$?
echo
return $RETVAL
}
status() {
if pidof named &>
/dev/null; then
echo -n "named is running..."
success
echo
else
echo -n "named is
stopped..."
success
echo
fi
}
usage() {
echo "Usage: named
{start|stop|restart|status|reload}"
}
case $1 in
start)
start ;;
stop)
stop ;;
restart)
restart ;;
status)
status ;;
reload)
reload ;;
*)
usage
exit 4
;;
esac