前言
局域网内有很多台主机,IP难以记忆。
而修改hosts文件又难以做到配置共享和统一,需要一台内网的DNS服务器。
效果展示
这里添加了一个域名hello.dog
,将其指向为192.168.1.100。
同时,外网的域名不会受到影响,优先使用内网域名。
注意:添加太多DNS服务器不好。即使靠前的DNS中找到了解析,仍然可能向靠后的DNS服务器发送解析请求,引起不必要的开销。
一、安装
shell
apt install bind9
二、配置文件说明
配置文件位于/etc/bind
有两类文件,一种是:
name.conf
name.conf.default-zones
name.conf.options
name.conf.local
另一类是:
db.127
db.255
- ...
1. named.conf
这个配置文件是最主要的,可以看到它里面其实是引入了其他文件,把实现都转到其他地方了,感兴趣自己挨个看下。
named.conf是最基本的,引入的内容都可以直接写在这个文件里面。
举个例子,一个简单形式的的named.conf如下:
shell
options {
directory "/var/cache/bind";
forwarders {
8.8.8.8;
114.114.114.114;
};
dnssec-validation auto;
listen-on-v6 { any; };
allow-query { any; };
};
zone "dog" {
type master;
file "/etc/bind/db.dog";
};
zone "com" {
type master;
file "/etc/bind/db.com";
};
zone "net" {
type master;
file "/etc/bind/db.net";
};
其中options是配置项,然后是一些自定义的域。
forwarders很重要,它是你的下一级DNS域名,当你的本地中找不到记录时,会委托给它去查找,也就是递归查找。
2. db.XXX
里面定义了实际的域名和IP映射关系。
三、实例
举个例子,这里以为局域网配置一个顶级域名dog,以及一些子域名。
1. 添加dog顶级域名
shell
vim /etc/bind/named.conf
在里面加上dog域名,并指定它的映射文件为/etc/bind/db.dog
(可以用相对路径)。
shell
zone "dog" {
type master;
file "/etc/bind/db.dog";
};
就像下面这样:
2. 配置映射文件db.dog
shell
vim /etc/bind/db.dog
创建db.dog并写入映射条目:
shell
$TTL 1h
@ IN SOA dog. sixqaq.outlook.com. (
2 ;Serial
3h ; Refresh after 3 hours
1h ; Retry after 1hour
100000 ; Expire after 1 week
1h ; Negative caching TTL of 1 hour
)
@ IN NS localhost.
@ IN A 192.168.1.104
hello.dog. IN A 192.168.1.100
world.dog. IN A 192.168.1.104
(注意,域名结尾还有一个点,漏掉解析失败的,日志也会提醒)
这里的h后缀表示小时,也可以不要h后缀,单位是秒。
最需要关注的是TTL,可以改成0。
- 刷新时间(Refresh):这个字段表示其他 DNS 服务器应该多久来重新获取该区域的 SOA 记录。单位是秒。
- 重试时间(Retry):这个字段表示其他 DNS 服务器在刷新失败后应该等待多久来重试。单位是秒。
- 过期时间(Expire):这个字段表示在这个时间之后,其他 DNS 服务器应该停止回答关于该区域的查询。单位是秒。
- 最小 TTL(Minimum TTL):这个字段表示其他 DNS 服务器在缓存该区域的记录时应该使用的最小 TTL 值。单位是秒。
3. 关闭验证
shell
vim /etc/bind/named.conf.options
将dnssec-validation设为no,否则会用不了(因为要验证签名,感觉很麻烦,局域网自己用一下得了不会有问题的)。
内容如下:
shell
options {
directory "/var/cache/bind";
forwarders {
8.8.8.8;
114.114.114.114;
};
c no;
listen-on-v6 { any; };
allow-query { any; };
};
4. 修改DNS
先启动我们的DNS服务器:
shell
service named start
shell
service named status
启动了最好看一下状态,如果有红色报错或黄色警告,说明有问题,用不了。
可以以本机为例验证,或者在用其他主机测试:
shell
vim /etc/resolv.conf
修改DNS服务器:
shell
nameserver XXX.XXX.XXX.XXX
这里XXX是你的DNS所在的主机的IP,本机测试填127.0.0.1就可以。
最后,记得防火墙开放53号端口(TCP和UDP都要)。
NetworkManager会覆盖我们写在resolv.conf中的DNS配置,自己再改回去很麻烦,
解决方案见另一篇博客:解决NetworkManager覆盖/etc/resolv.conf的问题
四、DDNS
- 待办
参考资料
- [美]Cricket Liu.DNS与BIND第五版[M].人民邮电出版社
- [美]W.Richard Stevens.TCP/IP详解 卷1:协议[M].机械工业出版社
- 鸟哥的LInux私房菜-服务器假设篇[M].机械工业出版社
- BIND 9 Administrator Reference Manual