DNS服务器搭建
域名系统
域名系统DNS是一个层次命名系统,充当联网主机和资源的目录。目录中的信息将网络名称映射到数据,并且在称为资源记录的逻辑条目中维护。
DNS层次结构的顶部和分支以root域“.”开始,向下直至多个下一级别域
域
域是资源记录的集合,这些资源记录以公用名称结尾并且表示DNS名称空间的整个子树
顶级域
仅有一个组成部分的域。例如:.com、.net、.edu、.us、.cn等等
子域
指作为另一个域的子树的域。aaa.example.com是example.com的子域
区域
指特定名称服务器直接负责或对其具有权威的某个域的组成部分
DNS查询分析
Linux系统需要使用DNS服务器执行名称解析时,它将首先向/etc/resolv.conf中列出的服务器依次发送查询,直到它获得响应或查询了全部列出的服务器
本地权威数据
当查询到达DNS服务器时,服务器首先确定正在查询的信息是否驻留在服务器对其有权威的区域中
如果服务器是所查询名称或地址所属区域的权威,那么服务器将以其本地区域文件中包含的信息来响应客户端
这种类型的响应应称为权威答案(aa),因为提供响应的服务器对提供的数据有权威
来自名称服务器的权威答案在DNS响应的标题中开启了aa标志
本地缓存非权威数据
如果DNS服务器不是相关记录的权威,但是最近又获取了该记录以回答之前的查询,那么它任可能在其缓存中具有一份记录副本
缓存是用于在指定时间内存储查询到的答案,这一时间是由每个资源记录响应中称为生成时间TTL的值来确定的
如果服务器的缓存中存在答案,则会将该答案提供给客户端。此答案将不会设置aa标志,因为服务器对提供的数据没有权威
通过递归获取的远程非权威数据
如果DNS服务器对于正在查询的名称没有权威,则DNS服务器不会再其缓存中占有记录,DNS服务器随后将尝试通过称为递归的迭代过程来检索记录
具有空缓存的DNS服务器将按照从其本地预填充根hints文件中检索的IP地址查询其中一个根名称服务器,从而开启递归过程
根名称服务器随后可能将以引用响应,这表明名称服务器对于包含所查询名称的TLD具有权威
在收到引用后,DNS服务器随后将对作为引用的TLD权威名称服务器执行另一个迭代查询
根据正在查询的名称中是否有更多剩余委派,该权威名称服务器将发送权威答案或者另一个引用。此操作将继续,直到到达权威服务器且权威服务器使用权威答案做出响应
最终答案以及在最终答案之前获取的所有中间答案都将由DNS服务器进行缓存以提高性能
DNS资源记录
资源记录包含以下元素: owner-name 该资源记录的名称 TTL 资源记录的生存时间(秒)。这会指定DNS解析器应缓存此资源记录的时间长度 class 记录的“类”,几乎总是IN(表示Internet) type 类型表示此记录存储的信息的排序 data 此记录存储的数据。确切格式根据记录类型而不同
记录类型解析 A记录 A资源记录将主机名映射到IPv4地址 example.com. IN A 192.168.1.1 AAAA记录 AAAA资源记录将主机名映射到IPv6地址 CNAME记录 将一个记录别名化为另一个记录,其中应具有A或AAAA记录 ftp IN CNAME www PTR记录 将IPv4或IPv6地址映射到主机名。它们用于反向DNS解析 192.168.1.1 IN PTR www.example.com NS记录 将域名映射到DNS名称服务器,而后者对其DNS区域具有权威 @ IN NS dns.example.com. SOA授权起始记录 提供有关DNS区域工作方式的信息 每个区域正好有一个SOA记录 其指定区域的哪个名称服务是主要名称服务器(主)、有关次要(从)名称服务器应如何更新其信息副本的信息以及区域的管理方式 Master nameserver 名称服务器的主机名,该名称服务是域信息的原始来源,并且可能会接受动态DNS更新 RNAME DNS区域负责人的电子邮件地址 Serial number 区域的版本号,随着对区域记录的任何更改而增加 Refresh 从服务器应检查区域更新的频率(单位:s) Retry 从服务器在重试失败的刷新之前应等待的时间(单位:s) Expiry 如果刷新失败,从服务器在停止使用其旧的区域副本响应查询之前应等待的时间(单位:s) Minimum 如果解析器查找某个名称并且该名称不存在(获得不存在的域(NXDOMAIN)响应),解析器应将“记录不存在”这一新兴进行缓存的持续时间(单位:s)
提供域名服务软件
1 bind(以此软件为例) 2 unbound
yum安装
1 yum install -y bind bind-libs bind-utils
编译安装
# 编译安装 # 下载 https://www.isc.org/downloads/ tar -xvzf bind-9.11.3.tar.gz cd bind-9.11.3 groupadd -g 53 -r named useradd -u 53 -g named -r named ./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named --disable-ipv6 --disable-chroot --enable-threads make make install # 添加环境变量bind工具 vim /etc/profile.d/named.sh export PATH=/usr/local/bind9/bin:/usr/local/bind9/sbin:$PATH . /etc/profile.d/named.sh # 导出库文件,让库文件能被调用 vim /etc/ld.so.conf.d/name/conf /usr/local/bind9/lib # 通知系统重读文件,导出bind库文件,并生成库文件 ldconfig -v # 导出头文件 ln -sv /usr/local/bind9/include /usr/include/named # 添加man文件的搜索路径 vim /etc/man.config MANPATH /usr/local/bind9/share/man # 添加主配置文件 vim /etc/named/named.conf options { directory "/var/named"; }; zone "." IN { type hint; file "name.ca"; }; zone "localhost" IN { type master; file "localhost.zone"; allow-update { none; }; }; zone "0.0.127.in-addr.arpa" IN { type master; file "named.local"; allow-update { none; }; }; mkdir /var/named # 创建file文件 cd /var/named dig -t NS . @192.168.198.2 > /var/named/named.ca vim localhost.zone $TTL 1d @ IN SOA localhost. admin.localhost( 20180407 1h 5m 7d 1d ) IN NS localhost. localhost. IN A 127.0.0.1 cp localhost.zone named.local vim named.local # 修改最后一条 1 IN PTR localhost. chmod 640 ./* chown :named ./* chmod 640 /etc/named/named.conf chown :named /etc/named/named.conf # 启动named服务 # 使用named用户运行、打开调试功能、运行级别为3 named -u named -f -g -d 3 # 单纯运行在后台 named -u named # 使用rndc管理配置文件 rndc-confgen -r /dev/urandom > /etc/named/rndc.conf # 编辑named.conf追击rndc指定内容 vim /etc/named/named.conf # Use with the following in named.conf, adjusting the allow list as needed: # key "rndc-key" { # algorithm hmac-md5; # secret "DQgSp/8GM9QPiJIOJ1BIsQ=="; # }; # # controls { # inet 127.0.0.1 port 953 # allow { 127.0.0.1; } keys { "rndc-key"; }; # }; # End of named.conf :.,$-1s@^#@@g # named重读配置文件 killall -SIGHUP named # 使用rndc管理named rndc status rndc reload # bind增强功能 cd /usr/local/src/bind-9.11.3/contrib # 增强功能脚本 cd ./script # 性能测试、压力测试 cd queryperf/ # 使用该功能 ./configure make # 简单使用 cp queryperf /usr/local/bind9/bin/ # 提供测试文件,指明对哪些域名请求解析 vim test www.example.com A exmaple.com NS exmaple.com MX ftp.example.com A imap4.exmaple.com A # 复制多几条记录,来个几万、几十万条都不过分 :1,$y queryperf -d test -s 192.168.198.128 # 开启查询日志 rndc querylog rndc status # 会极大影响性能
主DNS服务器搭建
编辑主配置文件/etc/named.conf
# 将监听本地修改为监听所有 listen-on port 53 { any; }; # 将只运行本地查询修改为允许所有查询 allow-query { any; }; # 追加转发DNS服务,当自己没有请求记录时,转发至指定DNS服务器,可指定也可以不指定 # forwarders { 8.8.8.8 } # 本实验不考虑安全模块相关 recursion no; dnssec-enable no; dnssec-validation no; # 追加域配置信息 zone "example.com" IN { type master; file "example"; }; # 追加反向解析配置信息 zone "198.168.192.in-addr.arpa" IN { type master; file "reverse"; };
编辑域记录文件
cd /var/named
为了方便拷贝配置文件
cp named.localhost example
cp named.localhost reverse
编辑example文件
@ IN SOA dns.example.com. root.example.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ IN NS dns.example.com. dns IN NS 192.168.198.128 @ IN MX 5 mail.example.com. mail IN A 192.168.198.128 www IN A 192.168.198.128 ftp IN CNAME www
编辑reverse文件
@ IN SOA dns.example.com. root.example.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ IN NS dns.example.com. 128 IN PTR dns.example.com. @ IN MX 5 mail.example.com. 128 IN PTR mail.example.com. 128 IN PTR www.example.com.
修改文件权限
chgrp named example reverse
重启服务,并添加开机自启(防火墙配置不在此内容,防火墙配置可以参考本人博客)
1 systemctl enable named.service 2 systemctl restart named.service
测试
vim /etc/resolv.conf # 指定DNS服务器 nameserver 192.168.198.128 netstat -ntlp tcp 0 0 192.168.198.128:53 0.0.0.0:* LISTEN 7316/named nslookup反向解析域名 > 192.168.198.128 Server: 192.168.198.128 Address: 192.168.198.128#53 128.198.168.192.in-addr.arpa name = dns.example.com. 128.198.168.192.in-addr.arpa name = www.example.com. 128.198.168.192.in-addr.arpa name = mail.example.com. host查询域名信息 host www.example.com www.example.com has address 192.168.198.128 dig查询域名详细 dig -x 192.168.198.128 dig -t mx|ns|soa exmaple.com
从DNS服务器搭建
编辑主配置文件
# 与主DNS服务修改差不多 listen-on port 53 { any; }; allow-query { any; }; recursion no; dnssec-enable no; dnssec-validation no; zone "example.com" IN { type slave; file "slaves/example_slave"; masters { 192.168.198.128 }; }; zone "198.168.192-in-addr.arpa" IN { type slave; file "slaves/reverse_slave"; masters { 192.168.198.128 }; };
重启服务即可
子域DNS服务器搭建
编辑主配置文件
# 与主DNS服务修改差不多 listen-on port 53 { any; }; allow-query { any; }; recursion no; dnssec-enable no; dnssec-validation no; zone "sub.example.com" IN { type master; file "example_sub"; }; zone "198.168.192-in-addr.arpa" IN { type master; file "reverse_sub"; };
编辑域记录文件
cd /var/named
为了方便拷贝配置文件
cp named.localhost example_sub
cp named.localhost reverse_sub
编辑example_sub文件
@ IN SOA dns.sub.example.com. root.sub.example.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ IN NS dns.sub.example.com. dns IN NS 192.168.198.129 @ IN MX 5 mail.sub.example.com. mail IN A 192.168.198.129 www IN A 192.168.198.129 ftp IN CNAME www
编辑reverse_sub文件
@ IN SOA dns.sub.example.com. root.sub.example.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ IN NS dns.sub.example.com. 129 IN PTR dns.sub.example.com. @ IN MX 5 mail.sub.example.com. 129 IN PTR mail.sub.example.com. 129 IN PTR www.sub.example.com.
修改文件权限
1 chgrp named example_sub reverse_sub
验证方式同主DNS服务验证方式相同
DNS服务转发
非本DNS域内的解析全部转发
options{ ... recursion yes; forward first; # forward (first|only) forwards { 114.114.114.114 }; }
非本子域DNS内的解析全部转发给父域
子域DNS服务器中新建一个域,专门用于转发
zone "example.com" IN { type forward; forward only; forward { 192.168.180.129; }; }
关闭安全模块
dnssec-enable no;
dnssec-validation no;
DNF服务器的安全配置
acl
把一个或多个地址归并为一个集合,并通过一个统一的名字调用
acl slaves { 192.168.180.130; };
内置acl
none 没有一个主机
any 任意主机
local 本机
localnet 与本机IP同一网段的其它IP
注意
acl只能先定义,后使用,因此,其一般定义在配置文件options的前面
访问控制指令
allow-query {}; # 允许查询的主机:白名单。 一般 any allow-transfer {}; # 允许区域传送的主机:白名单。 一般 slave allow-recursion {}; # 允许递归的主机 。 一般 LAN allow-update {}; # 允许更新区域数据库中的内容。作用:当dhcp分配给服务器的IP地址更改的,DHCP能通知DNS服务更改记录。一般 none
View使用
背景
来自外网的用户我们希望能解析到服务器的外网地址
来自内网的用户我们希望能解析到服务器的内网地址
定义
一个bind服务器可以定义多个view,每个view中可以定义一个或多个zone
每个view用来匹配一组客户端
多个view内可能需要对同一个区域进行解析,但使用了不同的区域解析库文件
注意
客户端请求到到达时,是自上而下检查每个view所服务的客户端列表
一但启用view,所有的zone必须再view中定义
仅有必要在匹配到允许递归请求的客户端所在的view中定义根区域
智能DNS
dnspod
dns.la
简单实例
网络情况
网关有三块网卡
172.16.0.1
192.168.1.254
192.168.0.254
DNS服务器 172.16.x.x
本机 192.168.0.13
目的
来自 172.16.x.x 访问DNS服务器解析到私网地址
来自 192.168.0.x 访问DNS服务器解析到公网地址
# 移动根区域到 named.rfc1912.zones 中 # 配置acl acl mynet { 172.16.0.0/16; 127.0.0.1/8; }; # 配置view vim named.rfc1912.zones view interal { match-clients { mynet; }; allow-recursion { mynet; }; zone ... ... }; view exteral { match-clients { any; }; zone "example.com" IN { type master; file "example.com.exteral"; allow-update { none; }; } } # 编辑example.com.exteral指定专门为外网用户解析的IP地址 ... # 检查语法错误 named-checkconf # 重启服务验证即可