自建DNS服务器

今天有时间,我想看下自己建立DNS服务器,是怎么样的流程。
结果发现是如此的简单。

以下是基于ubuntu的。

DNS

域名管理系统DNS(Domain Name System),是通过域名来解析到IP的一种网络服务,自建DNS服务器,可以在内网中,自己设定特定的域名解析,达到内网机器可以无需配置host,达到访问内网服务的作用。

DNS记录(备忘):

  • A记录: 主机名或者域名 –> 相应的IP地址;
  • NS记录: 记录域名有哪些DNS服务器来解析;
  • CNAME记录: 将域名的解析转到另外一个域名上去;
  • MX记录: 一个网络里面的电子邮件服务引导到特定服务器;
  • TXT记录: 提供了域名的文本信息;

Bind9

bind(berkeley Internet Name Daemon)
建立DNS服务器,在ubuntu下只需要安装bind9就可以了。

1
sudo apt-get install bind9

服务器

bind9可以配置多种DNS服务器:

  1. 缓冲服务器,用于缓存DNS服务,减少带宽使用;
  2. 主服务器,用于记录DNS服务信息;
  3. 从服务器,完整的备份主服务器的内容;
  4. 混合服务器,多种服务器合并的累心;
  5. 私用的主从服务器;

主要配置

cd /etc/bind/

可以看出在目录下面有多个name.conf*的文件,为配置文件;db.*的文件为DNS记录文件;*.keys文件是Bind在交互过程中用于检验的秘钥。

name.conf.options

  • forwarders: 选择现有的DNS提供商,以’;’分割,如果不写的话,这个地方会被默认为root名称服务器来解析,速度会特别慢;
  • directory “filename”: 用于存放该区域数据的文件;
  • forward first: 在尝试通过root服务器解析DNS请求先,对DNS请求进行转发(forward only 不进行转发);
  • listen-on port *port{ ip-address;}: 指定监听哪一些网络接口(默认是127.0.0.1或者localhost)或者哪一个端口(默认是53)来监听客户端的查询;
  • listen-on-v6 *port{any;}: 指定Bind通过哪一个多端口去监听IPv6的客户端请求,any只可以被none代替;
  • query-source[-v6] address port : 服务器在查询解析的域名的时候,是有可能查询不到的而向其他服务器查询,因此,query-source可以设定这类查询采用什么样的地址和端口。这里的port只用于UDP的请求,TCP请求会随机使用一个大于1024的端口;
  • allow_query {ip-address;}: 指定说哪一些IP的网络可以进行普通的查询;
  • allow_transfer: 指定说哪一些IP的网络可以进行域的传输;
  • statistics-interval: 生成统计信息;设置为0,则不生成;
  • cleaning-interval: 缓存时间;
  • interface-interval: 定期检测网络接口中存在的接口,设置为0,则不扫描;
  • notify no: 在区域数据改动或者重启服务时,是否通知其他服务器;
  • dump-file “filename”: 执行rndc dumpdb时,存放的路径;

name.conf logging

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
	logging {
[ channel channel_name {
( file path_name
[ versions ( number | unlimited ) ]
[ size size_spec ]
[ syslog (syslog_facility) | stderr | null)];
[ severity (critical | error | warning | notice | info | debug [ level ] | dynamic ); ]
[ print-category yes | no; ]
[ print-severity yes | no; ]
[ print-time yes | no; ]
}; ]
[ category category_name {
channel_name ; [ channel_name ; ... ]
}; ]
...
};
  • file: 日志文件的路径;
  • versions, size: 用于控制日志文件的版本;
    1. 如果size设置,versions没有设置,则写满日志文件之后,就会停止写入;
    2. 如果size,versions设置,则写满日志文件之后,会更新日志文件版本,继续写入;
    3. 如果size没设置,versions设置了,将会在Bind重启的时候再更新日志文件的版本;
  • syslog, stderr, null: 三个参数填写出其中的一个,syslog会将输出的信息输出到系统日志中,详细的配置可以看下syslog,stderr将通道的输出信息重定向到标准错误流中,null则是忽略信息;
  • category: 这一部分的信息其实是将特定的输出内容写入指定的通道之中;具体有哪些种类的输出内容可以看下官方的介绍,种类太多也就不想列了。

name.conf zone

在配置文件中,有name.conf.defaul-zones文件,已经默认的添加了部分DNS记录,而自建dns服务器,达到内网解析的关键,也就是配置这部分的文件。

zone的配置模板目下所示:

1
2
3
4
zone “catchenii.com” in {
type master;
file "/etc/bind/db.catchenii.com"
}
  • type: 指DNS服务器的类型,分别为master(主服务器),slave(从服务器),hint(区域服务器);
  • file: 区域数据文件;
  • master{server-ip-address}: 从服务器配置指定从哪个服务器中获取区域数据文件;
  • allow-update{!*;}: 是否允许外部创建DNS数据文件,默认是禁止的。(这一项就决定着有可能可以动态更新内网的DNS信息)

而对应的/etc/bind/db.catchenii.com区域数据文件则如图所示:
db.catchenii.com
区域文件有两种,一种是IP->域名,另外一种是域名->IP,上图当然是域名到IP得数据文件,两份记录的格式也是基本一致:

'.'在区域文件中是由重要的含义的,如果域名没有在末尾加入'.',则会追加域名在后面,完整的域名必须在末尾加'.'。
  • $TTL: 默认的存活时间;
  • SOA: Start Of Authority 控制记录开始的位置。IN SOA后面是作为该区域的主服务器的名称。
  • Serial: 每修改一次文件,数字都会添加,用于告诉从服务器改变的通知;
  • Refresh: 下级服务器来校验serial number的时间间隔;
  • Retry: 下级服务器连接主服务器时出现错误的重试时间间隔;
  • Expire: 下级服务器无法联系主服务器时,缓存的超时时间;
  • Negative Cache TTL: 解析失败的记录的缓存时间;

接下来的数据为DNS的解析记录啦!

结果

修改好文件之后,可以重启下服务:

1
sudo /etc/init.d/bind9 restart

效果如图所示:
结果图

嘻嘻。

备记:

各类DNS服务器的比较!