翼度科技»论坛 云主机 LINUX 查看内容

Linux 搭建DNS服务

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
bind介绍

在局域网环境中,一般我们要搭建DNS服务,使用的是BIND(Berkeley Internet Name Domain)软件来实现,BIND提供了一个名为named(也叫named daemon)的服务程序,用于处理DNS查询。
BIND 由 Internet Systems Consortium (ISC) 开发和维护,所以可以访问ISC 的官方网站来获取关于 BIND的相关信息。
除了BIND外,还有其它的软件也可以用来搭建DNS服务,例如powerdns,dnsmasq,unbound,coredns(主要用在k8s环境中)等。
ISC官网:https://www.isc.org/
搭建正向解析DNS服务


  • 正向解析:将域名转换为与之关联的IP地址的过程
  • 反向解析:一个查找与特定IP地址关联的域名的过程
1、安装bind

一般通过Linux发行版提供的软件包管理工具(例如yum、apt)进行安装即可,如果需要进行编译安装,可以去官网或者github下载源码,参考管理员手册进行编译安装。
使用包管理工具进行安装:
例如:ubuntu2004安装bind9
  1. # ubuntu
  2. apt install bind9
  3. # centos
  4. yum install bind
复制代码
[img=50%,50%]https://img2023.cnblogs.com/blog/1519088/202310/1519088-20231028211252630-336438182.png[/img]
2、修改配置

通过软件包管理工具安装了bind9服务后,配置文件一般放在 /etc/bind/ 目录下,主配置文件一般是 named.conf
例如:在ubuntu2004中使用apt进行安装后,默认带的配置文件有这些
[img=50%,50%]https://img2023.cnblogs.com/blog/1519088/202310/1519088-20231028234652713-746723874.png[/img]

在主配置文件中,使用include  指令来引入了其它的配置文件。
[img=50%,50%]http://bbs.itdo.tech/[/img]

[img=50%,50%]https://img2023.cnblogs.com/blog/1519088/202310/1519088-20231028234742042-678416013.png[/img]

有一个叫作named.conf.options的配置文件,包含了一个 options配置块,options块用于指定全局服务器选项。这些选项会影响BIND服务器的整体行为。
例如:端口指定、工作目录指定、上层DNS、查询权限等。
端口配置

bind默认监听UDP和TCP的53端口,如果要修改端口可以在这个配置文件中进行修改。(一般情况下这个端口不用改)
  1. # any 表示any 允许所有的机器访问本机这个dns服务器
  2. # ipv6端口指定
  3. listen-on-v6 port 5353 { any; };
  4. # ipv4端口指定
  5. listen-on port 5353 { any; };
复制代码
[img=50%,50%]https://img2023.cnblogs.com/blog/1519088/202310/1519088-20231028235906503-913601316.png[/img]
说明:
当使用 ss -ntl | grep 53 查看端口监听时,有一个 127.0.0.53%lo:53 。这个是 systemd-resolved 服务默认监听的地址和端口,在ubuntu1804及其以上的版本中默认启用 systemd-resolved服务。
[img=50%,50%]https://img2023.cnblogs.com/blog/1519088/202310/1519088-20231029000041508-1510774113.png[/img]

日志配置

默认情况下,BIND把日志消息写到系统日志里面的,例如centos是/var/log/messages文件,ubuntu则是/var/log/syslog。如果我们想要自定义bind的日志存放位置话,可以通过loging配置块来实现。(如果没需求可以不改)
loging配置块定义如何记录服务器的活动。您可以指定记录哪些类别的消息、它们的严重性以及它们应该记录到哪里。
(1)一般是/etc/bind目录下单独创建一个文件,叫作 named.conf.logging,通过在这个配置文件里面添加日志的相关配置。
  1. sudo vim /etc/bind/named.conf.logging
  2. logging {
  3.     channel query_log {
  4.         file "/var/log/namd/query.log";
  5.         severity info;
  6.         print-time yes;
  7.     };
  8.     channel other_log {
  9.         file "/var/log/named/other.log";
  10.         severity info;
  11.         print-time yes;
  12.     };
  13.     category queries {
  14.         query_log;
  15.     };
  16.     category default {
  17.         other_log;
  18.     };
  19. };
复制代码
[img=50%,50%]https://img2023.cnblogs.com/blog/1519088/202310/1519088-20231029205054370-215535162.png[/img]
说明:

  • 需要保证文件的所属组是bind(chown bind:bind /etc/bind/named.conf.logging)
  • 需要保证bind对存放日志的目录具有读写权限(chown bind:bind /var/log/named)
(2)编写好配置文件后,将配置文件通过在主配置文件中通过include指令来引入。
  1. include "/etc/bind/named.conf.logging";
复制代码
[img=50%,50%]https://img2023.cnblogs.com/blog/1519088/202310/1519088-20231029205205957-1721462737.png[/img]
logging的指令说明:

  • channel: 定义日志输出通道
  • category: 指定某个日志类别应记录到哪个通道
  • file: 指定日志文件的路径
  • severity: 设置日志级别
(3)重启服务后即可生效
[img=50%,50%]https://img2023.cnblogs.com/blog/1519088/202310/1519088-20231029002323668-1458377426.png[/img]
区域配置

这是配置DNS正向解析的第一步。bind的区域配置是通过 zones 配置块来实现的。区域配置就是配置域名解析的规则。
例如:自带的 named.conf.default-zones 这个文件中,就配置了一些默认的解析规则。
[img=50%,50%]https://img2023.cnblogs.com/blog/1519088/202310/1519088-20231029002836682-1180796874.png[/img]
例如:我需要将www.yongshen.com这个FQDN解析为ipv4地址10.0.0.66,可以这样做:
(1)先创建区域配置文件,命名方式一般是 域名.zones。 一般单独创建一个目录来存放,方便后期管理
  1. mkdir /etc/bind/yongshen
  2. chown bind:bind /etc/bind/yongshen
复制代码
[img=50%,50%]https://img2023.cnblogs.com/blog/1519088/202310/1519088-20231029210446970-1184886751.png[/img]
然后在这个目录下编辑区域配置文件:
  1. sudo vim /etc/bin/yongshen/yongshen.zones
  2. zone "yongshen.com." {
  3.         type master;
  4.         file "/etc/bind/yongshen/db.yongshe.com";
  5. };
复制代码
[img=50%,50%]https://img2023.cnblogs.com/blog/1519088/202310/1519088-20231029203018356-1726334121.png[/img]
区域配置文件说明

zone配置块,大致的格式就是:
  1. zone "要解析的域名" {
  2.         type master; # master表示这个是权威区域,该服务器为该区域内的所有域名提供权威答案
  3.         file xxxx;   # 指定的文件包含了这个区域的所有资源记录
  4. };
复制代码
type指令说明
type用于指定定义区域的类型,常见的类型有以下这些:

  • master:当有请求来时,可以根据file指定的文件中的信息返回权威答案
  • slave:当有请求来时,它可以响应请求,但它是一个从属或备份区域。它从指定的主服务器复制区域数据,自身不能直接修改区域内容。任何修改都需要在主服务器上进行,并随后同步到从服务器
  • hint:此区域用于配置根DNS服务器的信息
file指令说明
file指令用于指定 区域文件 , 也叫 区域数据文件。这个文件包含了若干条资源记录,通过这个文件可以为域名提供详细的解析信息。
这个文件的作用就是告诉BIND:“当有人查询某个FQDN时,请给他这个IP地址作为答案”。
(2)编辑区域数据文件
区域配置文件搞定后,需要创建zone配置块中file指定的区域数据文件,一个区域数据文件由若干条区域数据记录组成。
  1. sudo vim /etc/bind/yongshen/db.yongshe.com
  2. $TTL    86400
  3. @       IN      SOA     master.yongshe.com. admin.yongshe.com. (
  4.                             2023102401  ; Serial
  5.                             3600        ; Refresh
  6.                             1800        ; Retry
  7.                             604800      ; Expire
  8.                             86400       ; Minimum TTL
  9.                             )
  10. @          IN      NS      master.yongshen.com.
  11. master     IN      A    10.0.0.66
  12. www        IN      A    10.0.0.66
复制代码
[img=50%,50%]https://img2023.cnblogs.com/blog/1519088/202310/1519088-20231029203116393-1206006825.png[/img]
区域数据文件说明

一个区域数据文件由若干条区域数据记录组成,每条区域记录由 5 部分组成:
  1. NAME   [TTL]   IN   type   value
复制代码
NAME
NAME:指定当前负责解析的域名,可以使用 @ 符号来表示当前解析的域名就是 区域配置里面改zone配置块指定的域名
例如:
  1. www   IN      A    10.0.0.66 表示要解析的FQDN就是 www.yongshen.com
复制代码
TTL
TTL:表示缓存过期的时间,当一个客户端(或者递归DNS服务器)向权威DNS服务器查询一个域名并得到答案后,这个答案(DNS记录)会被缓存在客户端或递归服务器上。TTL值就是告诉这些客户端或服务器应该缓存这条记录多长时间。在这个缓存时间内,如果再次有对同一条DNS记录的查询,客户端或递归服务器可以直接从自己的缓存中获取答案,超过TTL指定的时间了记录就会从缓存中被移除,相同的查询请求就需要重新请求。
IN
IN:指的就是这个记录属于Internet类,其他类基本上都没用了
type
type用于指定区域记录的类型,不同类型的区域记录有不同的作用。并且不同的类型,对应的value值也不同。

  • A:  表示这条资源记录类型是 IPv4地址记录,用于将一个域名映射为IPv4地址,所以value对应的值就是一个IPv4地址。
例如:
  1. www        IN      A    10.0.0.66
复制代码

  • AAAA: 表示这条资源记录类型是 IPv4地址记录,用于将一个域名映射为IPv6地址,value对应的值就是一个IPv6地址
例如:
  1. mail IN AAAA 2001:db8::1
复制代码

  • NS: 这种记录类型用于指定哪些DNS服务器是权威服务器,对应的value值是权威DNS服务器的域名(末尾的点不能省略)
例如:
  1. @          IN      NS      master.yongshen.com. 表明权威服务器是  master.yongshen.com.
复制代码
具体过程如下:
1、当客户端(或其他DNS服务器)想要解析一个特定的域名,例如 www.yongshen.com, 它首先会查询其本地缓存或前置DNS服务器。如果没有找到答案,它可能会进一步查询根服务器或其他已知的上级服务器来寻找关于yongshen.com域的权威服务器信息。
2、在此情境中,权威服务器的标识为 master.yongshen.com,这是通过NS记录 @ IN NS master.yongshen.com. 指定的。这告诉询问者,如果想要解析属于yongshen.com域的任何主机名,它应该联系master.yongshen.com。
3、 但这还不够,因为询问者需要知道master.yongshen.com的实际IP地址才能与之联系。为了提供这一信息,还有一条A记录:master IN A 10.0.0.66,告诉询问者master.yongshen.com的IPv4地址是10.0.0.66。
4、当查询请求到达IP地址10.0.0.66的服务器时,因为该服务器已经配置为yongshen.com域的权威服务器并拥有该域的完整区域文件(通过zone配置块的type和file实现的),它会查找关于www.yongshen.com的记录。在此例中,它找到了记录www IN A 10.0.0.66,所以它会将10.0.0.66这个地址返回给询问者。


  • SOA:这种类型的资源记录在每个区域数据文件中有且只有一个,且是第一条记录。用来设置这个区域的一些属性信息的。对应的value就是这个区域的相关属性信息。
  1. # 邮箱只起到说明作用,不起实质的作用
  2. @ IN SOA <主域名服务器名> <负责人邮箱> (
  3.     <序列号>   ; Serial Number
  4.     <刷新时间> ; Refresh Interval
  5.     <重试时间> ; Retry Interval
  6.     <过期时间> ; Expire Time
  7.     <最小TTL>  ; Minimum TTL
  8. )
复制代码
字段说明:

  • 主域名服务器名称:权威的名称服务器,负责该DNS区域(通常为完全限定的域名),用于告诉其他服务器或者客户端:“如果你有关于这个区域的问题,你应该来问我。” (在SOA记录中指定的主域名服务器名称通常就是该区域的权威名称服务器,这与NS记录中列出的名称服务器一致。)
  • 负责人邮箱:负责这个区域的管理员的电子邮件地址,一般使用“.”替代“@”。
  • 序列号:表示区域文件的版本的数字,更改区域文件时应该增加这个数字。这样如果搭建了主从架构,从属或备份的DNS服务器知道主服务器的数据已经更改,从而触发更新。
  • 刷新时间:搭建主从架构时,告诉从属服务器多久检查主服务器的序列号一次
  • 重试时间:从属服务器在刷新时间结束后尝试联系主服务器但失败,它会在这个“重试时间”结束后再次尝试。
  • 过期时间:从属服务器在多长时间内无法与主服务器通信后,将停止回答关于这个区域的查询。例如向从服务器请求:www.tom.com的ip地址是多少, 但是604800秒后都没法和主服务器通信,所以它就不会回答这个请求了。
  • 最小TTL:其他服务器应该缓存此区域中任何记录的最短时间。
(3)将区域文件加入主配置文件
区域文件和区域数据文件都创建和配置后,需要将区域文件加入主配置文件中。
  1. sudo vim /etc/bind/named.conf
  2. include "/etc/bind/yongshen/yongshen.zones";
复制代码
[img=50%,50%]https://img2023.cnblogs.com/blog/1519088/202310/1519088-20231029203221203-775100982.png[/img]
3、重启服务

重启bind服务后测试是否生效,我在ubuntu2004中使用apt安装bind后,发现有bind9和named这两个服务。
查看named的service文件时,发现使用Alias=bind9.service指定了一个叫作bind9.service的别名。
所以在使用ssytemctl enable named后,/lib/systemd/system/named.service在 /etc/systemd/system/下创建了两个service文件, /etc/systemd/system/bind9.service和/etc/systemd/system/multi-user.target.wants/named.service。
bind9 是在 Debian 及其衍生版本(如 Ubuntu)上的软件包名称和服务名称。在这些发行版中,通常将 named 的服务文件设置为 bind9.service,以与软件包的名称保持一致。所以使用named或者bind9来管理bind进程都是一样的。
[img=50%,50%]https://img2023.cnblogs.com/blog/1519088/202310/1519088-20231030001327594-1705135314.png[/img]

  1. sudo systemctl restart bind9.service
复制代码
4、测试

(5)可以通过dig工具来测试,dig默认使用的是53端口,如果修改了bind服务器的端口,需要使用 -p 参数来指定端口号
  1. # dig通过 @ 来指定DNS服务器地址
  2. dig www.yongshen.com @10.0.0.66 -p 5353
复制代码
[img=50%,50%]https://img2023.cnblogs.com/blog/1519088/202310/1519088-20231029203438229-139988513.png[/img]
除了使用dig来测试dns是否可用外,还可以使用以下工具进行测试:

  • host:如果需要指定DNS服务器地址,直接在后面写地址就行了。例如:host www.baidu.com 192.168.13.66
  • nslookup:和host使用一样,例如:nslookup  www.baidu.com 192.168.13.66
说明: 如果DNS服务器的端口不是默认的53,只有dig提供了 -p参数来指定,host和nslookup都是不指定手动指定端口的,
注意事项

BIND中FQDN说明:

在DNS和bind中,完全限定域名的表现形式为由一个点(.)结尾的域名。这个点代表DNS层级结构的根,所以FQDN实际上是从某个节点一直到DNS的根的完整表示。末尾不带点就是一个相对于名。
在zone配置块中:  定义了一个区域,这个zone配置块负责处理关于yongshen.com的DNS请求,在指定区域名称的时候,如果最后加了点(.)表示这是一个完全限定域名(不加点BIND也通常将其视为FQDN),但是可能会出现在不带点的情况下,把他当作一个相对域,从而给它加上后缀。
例如:特定的网络(企业或大学网络)里面会自动加上后缀,不带点可能就给加上后缀了
在区域数据文件中

  • 资源记录的NAME部分指定了需要处理的域名,很多时候使用的都是相对域名。例如:www    IN A 10.0.0.66,会自动将当前zone的名称追加在其后面。 www.yongshen.com
  • 如果使用了全限定域名,例如:www.yongshen.com.    IN A 10.0.0.66,就不会将当前zone的名称追加在其后面
$TTL说明

$TTL 是一个全局默认TTL,用于指定那些没有明确设置TTL的记录的生存时间。只需要在文件的顶部定义一次TTL,它会自动应用到所有后续的记录上,除非这些记录自己有明确的TTL设置
@ 符号说明

@ 符号是一个简写,代表当前区域的主域名,即在zone配置块中指定的域名。
除了@符号外,经常用的还有一个 * 号, 符号是一个通配符,和shell中的*效果一样,用来匹配该域中的任何未明确指定的主机名。
例如:
  1. www    IN A 10.0.0.66
  2. *    IN A 10.0.0.67
复制代码
查询www.yongshen.com 会范围10.0.0.66,查询其它的,例如mail.yongshen.com就返回10.0.0.67
区域数据文件省略说明

在BIND的区域文件中,连续的资源记录(RRs)可以省略与前一条相同的部分。例如:
  1. # 域名 example.com. 在后续的记录中被省略了,因为它与前一条记录相同。
  2. example.com.    IN    A    192.0.2.1
  3.                 IN    NS   ns.example.com.
  4.                 IN    MX   10 mail.example.com.
复制代码
来源:https://www.cnblogs.com/heyongshen/p/17794738.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具