需求
在家里组建局域网,其中一台电脑组为服务器,搭建了很多网站(nas系统,个人博客,游戏服务,代码仓库)智能设备网关,需要内网访问。
理论
DNS(Domain Name System,域名系统)是互联网的一项基础服务,它将域名转换为IP地址,从而使计算机能够互相通信。简单地说,DNS就像互联网的电话簿,把人类容易记住的域名(如www.example.com
)转换成计算机能够识别和处理的IP地址(如192.0.2.1
)
DNS的工作原理
- 域名解析:
- 用户在浏览器中输入一个网址(如
www.example.com
)。 - 计算机需要知道对应的IP地址才能访问这个网站。
- 用户在浏览器中输入一个网址(如
- 查询DNS服务器:
- 计算机首先检查本地缓存是否有该域名的IP地址记录。
- 如果本地缓存没有,计算机会向配置的DNS服务器发送查询请求。
- 递归查询:
- DNS服务器如果没有该域名的记录,会进行递归查询,从根DNS服务器开始,逐级查询顶级域名服务器(如
.com
服务器)和权威DNS服务器,直到找到正确的IP地址。
- DNS服务器如果没有该域名的记录,会进行递归查询,从根DNS服务器开始,逐级查询顶级域名服务器(如
- 返回结果:
- 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解析是否生效
在客户端机器上使用dig
或nslookup
命令测试域名解析:
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; };
};