今天有时间,我想看下自己建立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服务器:
- 缓冲服务器,用于缓存DNS服务,减少带宽使用;
- 主服务器,用于记录DNS服务信息;
- 从服务器,完整的备份主服务器的内容;
- 混合服务器,多种服务器合并的累心;
- 私用的主从服务器;
主要配置
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 | logging { |
- file: 日志文件的路径;
- versions, size: 用于控制日志文件的版本;
- 如果size设置,versions没有设置,则写满日志文件之后,就会停止写入;
- 如果size,versions设置,则写满日志文件之后,会更新日志文件版本,继续写入;
- 如果size没设置,versions设置了,将会在Bind重启的时候再更新日志文件的版本;
- syslog, stderr, null: 三个参数填写出其中的一个,syslog会将输出的信息输出到系统日志中,详细的配置可以看下syslog,stderr将通道的输出信息重定向到标准错误流中,null则是忽略信息;
- category: 这一部分的信息其实是将特定的输出内容写入指定的通道之中;具体有哪些种类的输出内容可以看下官方的介绍,种类太多也就不想列了。
name.conf zone
在配置文件中,有name.conf.defaul-zones文件,已经默认的添加了部分DNS记录,而自建dns服务器,达到内网解析的关键,也就是配置这部分的文件。
zone的配置模板目下所示:
1 | zone “catchenii.com” in { |
- type: 指DNS服务器的类型,分别为master(主服务器),slave(从服务器),hint(区域服务器);
- file: 区域数据文件;
- master{server-ip-address}: 从服务器配置指定从哪个服务器中获取区域数据文件;
- allow-update{!*;}: 是否允许外部创建DNS数据文件,默认是禁止的。(这一项就决定着有可能可以动态更新内网的DNS信息)
而对应的/etc/bind/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服务器的比较!