0x01 前言
局域网最好能有一个dns 缓存,尤其是一个大家庭或者是企业网络。dns 缓存能有效降低对外网的依赖程度,同时也能配置用于企业内部域名的解析。
我在家里用bind 建立dns 缓存的同时也将t.com 这个域名划为局域网内使用,例如:
- server.t.com 这域名通过A 记录指向主服务器
- base.t.com 这个域名通过A 记录指向运行主要服务的虚拟服务器
- dlna.t.com这个域名通过A 记录指向plex 虚拟媒体服务器
- web.t.com 这个域名通过A 记录指向虚拟网站服务器
- wp1.t.com 这个域名通过CNAME 记录指向web.t.com 用于测试
- … …
0x02 安装
安装很简单,通过一行命令即可安装完成:
yum install bind -y
0x03 配置named.conf
options { #IPv4 监听的端口,默认为53 listen-on port 53 { any; }; #IPv6 监听的端口,默认为53 ,我网络并不支持IPv6 ,所以我把它注释掉 // listen-on-v6 port 53 { ::1; }; #工作文件夹 directory "/var/named"; #通过rndc dumpdb 导出数据时的文件保存路径 dump-file "/var/named/data/cache_dump.db"; #使用rndc stats 时文件保存的路径 statistics-file "/var/named/data/named_stats.txt"; #这个文件记录着内存使用值 memstatistics-file "/var/named/data/named_mem_stats.txt"; #允许查询DNS 记录的ip 地址,请根据需要修改ip ,例如: ##10.0.0.0/8 ,10.1.1.0/24 等 allow-query { any; }; #指定允许那些主机能从缓存中获取DNS 记录 allow-query-cache { any; }; #转发,只在存在转发器forwarders 信息时有效: ##only 仅会查询转发器forwarders 里的DNS服务器,如果都没有返回有效值则给用户返还无DNS 记录; ##first 则先查询转发器forwarders 内的DNS 服务器,如果都没返还有效值,则查询根服务器 forward only; #转发器,定义DNS 服务器 forwarders { #DNSpod 119.29.29.29; #CNNIC SDNS ,平常我回把这个注释掉 1.2.4.8; #阿里DNS 223.5.5.5; #阿里DNS 223.6.6.6 #百度 BaiduDNS ,平常我回把这个注释掉 180.76.76.76; #114 DNS 114.114.114.114; #114 DNS 114.114.115.115; }; #如果你在建立已注册的权威DNS 服务器,请将recursion 设为no ;如果作为缓存服务器,请设为yes recursion yes; #dnssec-enable 的默认值为yes ,因为国内的DNS 服务器目前都不支持dnssec 所以关闭它 dnssec-enable no; #dnssec-enable 的默认值为yes ,因为国内的DNS 服务器目前都不支持dnssec 所以关闭它 dnssec-validation no; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
当设置完forward 和forwarders 就已经可以使用这个DNS 缓存服务器了。DNS 信息的保存时间会根据实际域名的TTL 来保存,例如:
; <<>> DiG 9.8.3-P1 <<>> proj.org.cn ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14045 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;proj.org.cn. IN A ;; ANSWER SECTION: proj.org.cn. 3600 IN CNAME hk1.odin.org.cn. hk1.odin.org.cn. 811 IN A 103.231.253.45 ;; Query time: 111 msec ;; SERVER: 192.168.199.1#53(192.168.199.1) ;; WHEN: Sat Jun 25 16:23:01 2016 ;; MSG SIZE rcvd: 68
我的域名proj.org.cn 的TTL 是3600,那么在有效期内,局域网无论有多少个人访问我的域名都会从DNS 服务器的缓存中获取DNS 记录;
如果我域名的TTL 到期了,那么到期后第一个访问我域名的人(A)向DNS 服务器请求DNS 记录的同时,DNS 服务器回将请求转发到转发器forwarders 内设定的DNS服务器,转发器返还纪录后DNS 服务器会将记录在本地保存着并将记录返还给A 。
0x03.1 启动
#启动bind 服务器 systemctl start named #将bind 服务器设为开机启动 systemctl enable named
如果你还需要在局域网内设定DNS 记录,请继续往下看。
0x04 设定区域
请在named.conf 的最后增加以下内容:
#增加此行 include "/etc/named/named.conf.local";
我局域网的网段是10.1.1.0/24 并且我在局域网内使用的域名是t.com
新建并修改/etc/named/named.conf.local
#这个区域记录着t.com 的DNS 信息 #zone 区域 #"t.com" 域名 #IN 查询类别,IN for internet #type 区域类型,这里是master ,意味着这台服务器可以为其他服务器提供这个域名的权威应答 #file 定义纪录文件的路径 zone "t.com" IN { type master; file "/etc/named/zones/db.t.com"; }; #这个区域记录着10.1.0.0/16 这个网段的PTR(反向解析) 信息 zone "1.10.in-addr.arpa" IN { type master; file "/etc/named/zones/db.1.10"; };
0x05 添加DNS 记录
新建并修改文件:/etc/named/zones/db.t.com
#因为这是局域网内使用的,所以我将TTL 都设置为60,以便随时更新DNS 记录与快速生效 ######以下内容请更格式添加###### $TTL 60 @ IN SOA ns1.t.com. admin.t.com. ( 1 ; Serial 60 ; Refresh 60 ; Retry 60 ; Expire 60 ; Negative Cache TTL ) ;name servers - NS records @ IN NS ns1.t.com. ;name servers - A records ns1 IN A 10.1.1.2 ######以上内容请更格式添加###### ;10.1.1.0/24 - A records hiwifi IN A 10.1.1.1 base IN A 10.1.1.2 ilo IN A 10.1.1.10 server IN A 10.1.1.11 nas IN A 10.1.1.12 codex IN A 10.1.1.13 2012 IN A 10.1.1.14 netcam IN A 10.1.1.30 dlna IN A 10.1.1.31 sql IN CNAME codex.t.com. ftp IN CNAME base.t.com. radius IN A 10.1.1.3 ;; wp1 IN CNAME codex.t.com. wp2 IN CNAME codex.t.com. wp3 IN CNAME codex.t.com.
如果纪录文件中存在完整的域名,例如上面的CNAME 记录,需要在域名最后加上一个半格字符”.” ,以此来声明这是个根域。
0x06 添加PTR 记录
$TTL 60 @ IN SOA ns1.t.com. admin.t.com. ( 1 ; Serial 60 ; Refresh 60 ; Retry 60 ; Expire 6 ; Negative Cache TTL ) ;name servers @ IN NS ns1.t.com. @ IN PTR dns.t.com. ;PRT records 1.1 IN PTR hiwifi.t.com. 2.1 IN PTR base.t.com. 10.1 IN PTR ilo.t.com. 11.1 IN PTR server.t.com. 12.1 IN PTR nas.t.com. 13.1 IN PTR codex.t.com. 14.1 IN PTR 2012.t.com. 30.1 IN PTR netcam.t.com. 31.1 IN PTR dlna.t.com. 3.1 IN PTR radius.t.com.
这里有点特殊的是,ip 地址需要倒过来。
0x06.1 启动
#启动bind 服务器 systemctl start named #将bind 服务器设为开机启动 systemctl enable named
0x07 结语
bind 还有许多有趣的特性和功能,有时间我会多写几篇关于bind 的文章。
如果你想搭建在公网环境下使用的DNS 服务器,请做好防护工作。有问题可以给我留言或给我发邮件。