内网搭建dns服务

需求

在家里组建局域网,其中一台电脑组为服务器,搭建了很多网站(nas系统,个人博客,游戏服务,代码仓库)智能设备网关,需要内网访问。

理论

DNS(Domain Name System,域名系统)是互联网的一项基础服务,它将域名转换为IP地址,从而使计算机能够互相通信。简单地说,DNS就像互联网的电话簿,把人类容易记住的域名(如www.example.com)转换成计算机能够识别和处理的IP地址(如192.0.2.1

DNS的工作原理

  1. 域名解析
    • 用户在浏览器中输入一个网址(如www.example.com)。
    • 计算机需要知道对应的IP地址才能访问这个网站。
  2. 查询DNS服务器
    • 计算机首先检查本地缓存是否有该域名的IP地址记录。
    • 如果本地缓存没有,计算机会向配置的DNS服务器发送查询请求。
  3. 递归查询
    • DNS服务器如果没有该域名的记录,会进行递归查询,从根DNS服务器开始,逐级查询顶级域名服务器(如.com服务器)和权威DNS服务器,直到找到正确的IP地址。
  4. 返回结果
    • DNS服务器将查询结果返回给用户的计算机,计算机随后使用该IP地址与目标服务器建立连接。

什么是DNS服务器

DNS服务器是提供DNS服务的计算机系统或程序。它的主要功能是响应DNS查询请求,将域名解析为IP地址。根据其功能和角色,DNS服务器可以分为以下几类:

根DNS服务器

  • 位于DNS体系结构的最顶层,负责管理和维护根域(Root Zone)。
  • 当DNS服务器无法解析域名时,会向根DNS服务器请求帮助。

顶级域名服务器(TLD Name Servers)

  • 管理特定顶级域(如.com.org.net等)。
  • 顶级域名服务器提供特定顶级域内的权威DNS服务器列表。

权威DNS服务器(Authoritative DNS Servers)

  • 存储域名与IP地址的映射关系,并为域名提供权威的解析信息。
  • 通常由域名注册商或域名所有者维护。

递归DNS服务器(Recursive DNS Servers)

  • 为客户端执行递归查询,将域名解析为IP地址。
  • 通常由互联网服务提供商(ISP)或公共DNS服务(如Google DNS、OpenDNS)提供。

DNS服务器的类型和用途

权威DNS服务器

  • 作用:存储和提供特定域名的解析记录。
  • 用途:当用户查询特定域名时,权威DNS服务器提供该域名的最终解析结果。

递归DNS服务器

  • 作用:为客户端执行递归查询,缓存查询结果以提高解析效率。
  • 用途:大多数用户的计算机配置使用递归DNS服务器来进行域名解析,这些服务器会逐步查询其他DNS服务器以获得所需的IP地址。

Host文件

Hosts文件是一个用于将主机名(域名)映射到IP地址的本地文本文件。在操作系统解析域名时,系统首先检查Hosts文件中的记录,如果找到匹配的条目,就会直接使用对应的IP地址,而无需向DNS服务器发出查询请求。

Hosts文件在不同操作系统中的位置如下:

  • Windows
    • 文件路径:C:WindowsSystem32driversetchosts
    • 编辑方法:需要以管理员权限运行文本编辑器(如记事本),然后打开该文件进行编辑。
  • Linux/Unix
    • 文件路径:/etc/hosts
    • 编辑方法:使用超级用户权限编辑文。
  • macOS
    • 文件路径:/etc/hosts
    • 编辑方法:使用超级用户权限编辑文件。

host文件弊端,当局域网或广域网中计算机数量过多时,修改host文件工作量繁多耗时长。这时就需要dns服务器提供域名解析服务

详细操作步骤

安装dns服务软件,系统为ubuntu

bind9文档 dnsmasq

sudo apt install bind9

配置文件结构说明

/etc/bind
├── named.conf 主配置文件
    引入了named.conf.default-zones,named.conf.local,named.conf.options
├── named.conf.default-zones
    包含BIND9默认的区域配置,定义根提示文件、本地回环地址和反向区域的默认配置。
    包括 db.0,db.127,db.255,db.empty,db.local
├── named.conf.local
    用户自定义区域配置,添加域名需要修改
├── named.conf.options
    定义BIND9的全局选项配,如目录、递归设置、转发器和日志配置
├── bind.keys
    用途:包含DNSSEC(DNS Security Extensions)验证所需的根密钥。
    内容:定义了一组信任锚,用于验证DNSSEC签名的区域数据。
├── db.0
    用途:用于根区域的反向DNS查找。
    内容:定义了0.in-addr.arpa区域,用于解析IP地址0.0.0.0的反向查询。
├── db.127
    对应ip127.0.0.1 类似db.0
├── db.255
    对应ip255.255.255.255类似db.0
├── db.empty
    用途:用于定义一个空的反向区域模板
    内容:用于未使用的IP地址范围,防止未授权的查询
├── db.local
    用途:用于本地回环地址localhost的正向DNS查找
    内容:定义了localhost的A记录
├── rndc.key
    用途:用于rndc(Remote Name Daemon Control)的密钥文件
    内容:包含用于安全通信的密钥,用于远程管理BIND9服务器
└── zones.rfc1918

配置解析,以域名www.Alist.lan Alist.lan IP 192.168.1.100为例

编辑named.conf.local配置文件

sudo vim /etc/bind/named.conf.local

添加如下内容

zone "Alist.lan" {
    type master;
    file "/etc/bind/db.Alist.lan";
};

创建并编辑区域文件/etc/bind/db.Alist.lan

vim /etc/bind/db.Alist.lan

输入以下配置内容并保存

$TTL 86400
@       IN      SOA     ns1.Alist.lan. root.Alist.lan. (
                              1         ; 序列号,每次修改后需增加
                         604800         ; 刷新时间(秒)
                          86400         ; 重新尝试时间(秒)
                        2419200         ; 过期时间(秒)
                         86400 )        ; 最小TTL(秒)
;
@       IN      NS      ns1.alist.lan.  ; 指定域的权威名称服务器
ns1     IN      A       192.168.1.100   ; 名称服务器的IP地址
@       IN      A       192.168.1.100   ; 将域名*.lan映射到IP地址
www     IN      A       192.168.1.100   ; 将www.*.lan映射到IP地址 

序列号说明

修改记录后如果你不增加序列号,从属DNS服务器将不会知道主DNS服务器上的区域文件已更新,从而不会更新它们自己的数据。这可能导致不一致的DNS解析结果,影响网络的正常运行。相当于版本管理

序列号的格式

序列号通常是一个32位整数。最常见的格式有以下几种:

简单递增:每次修改区域文件时,序列号简单地递增1。

日期格式:使用日期加上一个小版本号来表示序列号。比如,2023080901表示2023年8月9日的第一次更新,2023080902表示同一天的第二次更新

检查配置是否正确

sudo named-checkconf
sudo named-checkzone Alist.lan /etc/bind/db.Alist.lan
#显示结果如下为正确
zone Alist.lan/IN: loaded serial 1
OK

重启BIND9服务

sudo systemctl restart bind9

配置客户端使用本地DNS服务器

对单台设备配置

在客户端机器上配置网络设置,将DNS服务器指向你的BIND9服务器(192.168.1.100

局域网配置

修改路由器DNS配置,指向你的BIND9服务器(192.168.1.100

首选DNS服务器设置内网的DNS服务器

测试DNS解析是否生效

在客户端机器上使用dignslookup命令测试域名解析:

dig @192.168.1.100 Alist.lan
dig @192.168.1.100 www.Alist.lan

同一局域网内的设备访问测试,dns有缓存,需要重新连接网络测试

扩展工具

编写一个添加解析服务的shell脚本

FAQ

看网上其他人的文章,会出现外网访问慢的问题,需要修改cat named.conf.options配置,添加

forwarders { 运营商ip或者家里上级路由网关; };

我没出现这种情况,采取的安装后默认配置,DNS查询是递归的,在本地dns查询不到后,会向上级DHCP的服务的dns查找,出现这种情况可能是没有开启DHCP服务,使用的静态ip导致上级dns查询不到。也可能是DNS缓存的问题。

options {
        directory "/var/cache/bind";

        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0's placeholder.

        // forwarders {
        //      0.0.0.0;
        // };

        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        dnssec-validation auto;

        listen-on-v6 { any; };
};