Linux下搭建DNS服务器
注:本文主要侧重DNS的配置,原理的话会另发一篇文章~
一、DNS(域名系统)作用和原理
1、 DNS的作用:
正向解析:根据域名查找对应的IP地址
反向解析:根据IP地址找对应的域名
2、 DNS的工作模式:
递归查询
迭代查询
3、 域名结构
分层式的结构,且上层只管理下层域名,便于管理维护。
二、BIND服务简介
1、Linux下常用的DNS服务是BIND(BerkeleyInternet Name Domain)
官方站点:
软件包:bind-9.8.2-0.17.rc1.el6.x86_64 (还有更新的版本)
服务名:named
端口号:udp 53 (少数情况会用到tcp53)
主配置文件:/etc/named.conf
默认的区域文件:/etc/named.rfc1912.zones
保存DNS解析记录的数据文件位于:/var/named/
2、主域名服务器和从域名服务器
主域名服务器:
特定DNS区域的权威域名服务器,具有唯一性
负责维护该区域内所有域名->IP地址的映射记录
从域名服务器:
也称为辅助域名服务器
其维护的域名->IP地址记录来源于主域名服务器
*实验环境的Linux发行版本是:RHEL6.4
三、搭建主DNS服务器
1、 修改DNS主配置文件/etc/named.conf
options {
listen-on port 53 { 172.16.100.111; }; #指定哪个IP和端口对外提供DNS服务(ipv4)
listen-on-v6 port 53 { ::1; }; #指定哪个IP和端口对外提供DNS服务(ipv6)
directory "/var/named"; #数据文件存放目录
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; }; #指定对哪些地址提供地址解析服务
recursion yes; #是否开启递归功能
dnssec-enable yes; #安全选项,防止dns劫持
dnssec-validation yes;
dnssec-lookaside auto;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
};
logging {
channel default_debug {
file"data/named.run"; #日志文件存放位置。file后面跟的是相对路径,相对/var/named/
severity dynamic;
};
};
zone"." IN {
type hint;
file "named.ca"; #指定根域文件,该文件有全球13台根DNS的记录
};
include"/etc/named.rfc1912.zones"; #该文件为默认的区域文件
include "/etc/named.root.key";
2、配置区域文件
zone "wsh.com" IN { #wsh.com的正向区域
type master; #指定该DNS的类型(master or slave)
file"wsh.com.localhost"; #指定该区域的正向解析数据文件,需要在/var/named/目 录下自己创建这个文件,一般复制named.localhost模板,之后 进行修改。
allow-update { none; };
};
zone "1.16.172.in-addr.arpa" IN { #wsh.com的反向区域
type master; #指定该DNS的类型(master or slave)
file"wsh.com.empty"; #指定该区域的反向解析数据文件,需要在/var/named/目录 下自己创建这个文件,一般复制named.empty模板,之后进 行修改。
allow-update { none; };
};
3、配置正向数据文件
SOA:起始授权机构。这个记录表明了谁是这个域的所有者。也表明了DNS服务器之间的关系,比如主从DNS之间配置同步的时间间隔等。
NS记录:表明谁对这个区域有解释权,即谁是该区域的权威DNS。大家都知道电信和网通都有很多的DNS服务器。这些服务器为我们上公网做域名解析提供了很多方便。但是这些DNS服务器有一个有意思的地方是这些DNS不存放任何区域,它们被称为缓存DNS服务器。它们会缓存大量的解析地址,这样就会让你解析的时候选择它们会觉得很快。它们在查询的时候就会查询NS记录,通过这个记录就知道谁在负责。还有一种情况来说明NS记录的作用,比如你先在万网申请了一个域名ABC.COM。一般情况是万网的域名服务器替你来解析如WWW.ABC.COM这样的主机记录,如果你想自己架设一个DNS服务器,让这台服务器从今往后替代万网的DNS服务器解析,那么你就需要在你的DNS上设置NS记录,然后将万网域名管理系统中的NS记录改成你的DNS IP。这样以后就是你自己的DNS服务器负责提供解析了。即使万网的DNS服务器出现故障,别人仍然可以找到你。
MX记录:邮件交换记录。后面的数字表明邮件服务器的优先级,数字越小,优先级越高(网络中可能存在多台邮件服务器)。
A记录:域名所对应的IP地址。域名部分只需写为www、mail等形式,实际表示的域名需加上SQA指定的域,即www表示的域名为www.wsh.com.
4、配置反向数据文件
PTR:反向解析记录。IP部分只写主机位(因为区域文件中定义了反向解析的网络位)
5、启动服务
service named start
四、搭建从DNS服务器
1、 修改主DNS的主配置文件
options {
listen-on port 53 { 172.16.100.111; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };
allow-transfer { 172.16.1.102; }; #指定从DNS
recursion yes;
2、 配置从DNS的主配置文件
options {
listen-on port 53 {172.16.1.102; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };
recursion yes;
3、 配置DNS区域文件
zone "wsh.com" IN {
type slave; #类型设为slave
file "slaves/wsh.com.localhost"; #指定从主DNS同步的正向数据文件
allow-update { none; };
masters { 172.16.1.101; }; #指定主DNS
};
zone "1.16.172.in-addr.arpa" IN {
type slave; #类型设为slave
file "slaves/wsh.com.empty"; #指定从主DNS同步的正向数据文件
allow-update { none; };
masters { 172.16.1.101; }; #指定主DNS
};
4、 重启从DNS的named服务
service named restart
#重启完后发现/var/named/slaves目录有了主DNS上的正向数据文件和反向数据文件,即成功同步。
#主从DNS的同步周期由SOA记录的参数决定,到达更新周期,会自动更新。或者重启服务器完成手动更新。
五、分离解析DNS服务器
1、应用场景如下图:
需求:
现在内网有一台WEB服务器和DNS服务器对外提供服务,要求内网PC访问www.wsh.com的时候域名能解析成内网IP,而公网PC访问www.wsh.com时解析成公网IP。
解决方法:
对于以上的场景解决方法可以在DNS上做分离解析。
2、 DNS分离解析配置步骤
1) 修改主配置文件/etc/named.conf
options {
listen-on port 53 { any; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };
recursion yes;
……
#zone "." IN {
# type hint;
# file"named.ca";
#};
#include "/etc/named.rfc1912.zones";
#include "/etc/named.root.key";
#注释掉以上几行
view lan {
match-clients{ 172.16.1.0/24; }; #如果客户端的源IP匹配的话,则会调取以下参数 (根 域文件、区域文件),如不匹配继续匹配下 个view
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.lan.zones";
};
view wan {
match-clients { any; }; #如果客户端的源IP匹配的话,则会调取以下参数(根 域文件、区域文件)
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.wan.zones";
};
2) 配置区域文件
[root@localhost ~ ]# vim /etc/named.lan.zones
zone "wsh.com" IN {
type master;
file "wsh.lan.local";
allow-update { none; };
};
zone "1.16.172.in-addr.arpa" IN {
type master;
file "wsh.lan.empty";
allow-update { none; };
};
[root@localhost ~ ]# vim /etc/named.wan.zones
zone "wsh.com" IN {
type master;
file "wsh.wan.local";
allow-update { none; };
};
zone "200.200.200.in-addr.arpa"IN {
type master;
file "wsh.wan.empty";
allow-update { none; };
};
3) 配置正向数据文件和反向数据文件
内网解析的正向数据文件和反向数据文件:
[root@localhost named]# vim wsh.lan.local
[root@localhost named]# vim wsh.lan.empty
外网解析的正向数据文件和反向数据文件:
[root@localhost named]# vim wsh.wan.local
[root@localhost named]# vim wsh.wan.empty
*至此,分离解析DNS配置完毕,可进行测试。
六、常见报错
1、客户端解析时,在DNS上用tcpdump抓包,发现serfail的报错
原因:发现数据文件的所有者和所属组都是root,导致其他用户没有读权限
解决方法:把数据文件的所属组改为named!