内网DNS系统搭建记录
因为最近处理公司内网DNS系统,借此机会记录一下DNS的相关知识以防后面遗忘。
在日常使用中,我们访问网站常用的是域名,即www.baidu.com,但是这个域名只是为了使用方便而增加的一个方式,我们可以看做别名,其访问域名,计算机会将其解析为IP地址来将请求转发到相对应的机器上进行对请求的处理。而将域名转为或者说将域名和IP地址对应起来的方式叫做DNS(域名解析服务)。
DNS简介
DNS提供的服务分为两种:
正向解析:也就是常用将域名解析为IP地址,就可以通过域名来查找对应的IP地址,例如:www.baidu.com -> xxx.xxx.xxx.xxx
反向解析:也称逆向解析,是将IP地址解析为域名,可以通过IP地址来寻找对应的域名,例如:xxx.xxx.xxx.xxx -> www.baidu.com
DNS服务使用的是两个端口,一个是UDP的53端口,用于解析DNS,另一个是TCP的53端口,用于连接DNS。
DNS域
DNS域名的可以看做倒树状结构:根域名 -> 顶级域名 -> 二级域名 -> 三级域名 -> 四级域名
以下是从网上找到的一个图片可以用作参考:
202210101118373.jpeg
根域名:‘.’,一般在写域名时会省略
顶级域名:由国家或者组织使用,例如:com\cn\edu...
二级域名:在顶级域名下个人或者组织使用的,例如:baidu.com
三级域名:在已经注册的二级域名下衍生的,例如:test.baidu.com、dd.baidu.com
查询过程
查询过程老生常谈了,这里只做简单的查询过程描述。一般来说,浏览器输入域名之后,DNS解析会经过一下几个过程:
-- 首先搜索浏览器的DNS缓存,缓存中维护一张域名与IP地址的对应表;
-- 若浏览器中没有命中,则会从操作系统的DNS中搜索;
-- 若操作系统中的DNS缓存依然没有的话,则会向本地DNS服务器发送域名,本地DNS服务会递归查询自己的DNS缓存,查找成功则返回结果;
-- 若本地DNS服务器依然没有命中,则会向上级DNS服务进行迭代查询;
1、本地DNS服务器向根DNS服务发起请求,获取顶级DNS服务器地址;
2、本地DNS服务器向顶级DNS服务器发起请求,获取权限DNS服务器地址;
3、本地DNS服务器向权限DNS服务器地址发起请求,获取该域名对应的IP地址;
-- 本地DNS服务器将得到的IP地址返回给操作系统,同时增加一条缓存;
-- 操作系统将IP地址返回给浏览器,同时增加一条缓存;
-- 浏览器获取正确的解析地址,也会增加一条缓存;
内网DNS服务器搭建
DNS服务器:192.168.33.131
测试服务器:192.168.33.128
软件版本:bind-9.11.4-26.P2.el7_9.9.x86_64
安装bind
# 安装bind服务
[root@localhost ~]# yum -y install bind
# 查看bind软件的相关文件
[root@localhost ~]# rpm -qc bind
/etc/logrotate.d/named
/etc/named.conf # 主配置文件
/etc/named.iscdlv.key
/etc/named.rfc1912.zones # 区域配置文件
/etc/named.root.key
/etc/rndc.conf
/etc/rndc.key
/etc/sysconfig/named
/var/named/named.ca
/var/named/named.empty
/var/named/named.localhost # 区域数据配置文件(正向)
/var/named/named.loopback # 区域数据配置文件(反向)
配置文件介绍
主配置文件:/etc/named.conf
# 全局选项
options {
# 定义监听的IP地址和端口,若注释则监听全部IP的53端口
listen-on port 53 { 192.168.33.131; };
# 定义IPV6地址
listen-on-v6 port 53 { ::1; };
# 定义区域数据文件位置
directory "/var/named";
# 定义 dump cache位置
dump-file "/var/named/data/cache_dump.db";
# 指定服务器统计信息路径
statistics-file "/var/named/data/named_stats.txt";
# 记录内存使用情况
memstatistics-file "/var/named/data/named_mem_stats.txt";
# 在收到rndc secroots指令后,服务器转储安全根的目的文件的路径名。默认named.secroots
recursing-file "/var/named/data/named.recursing";
# 指定服务器在通过rndc recursing命令指定转储当前递归请求到的文件路径。默认named.recursing
secroots-file "/var/named/data/named.secroots";
# 指定允许哪些主机可以进行普通的DNS查询,可以是关键字:any/localhost/none,也可以是IPV4,IPV6地址
allow-query { any; };
# 设置DNS转发方式
# - first:优先使用forwarders DNS解析,查询不到使用本地DNS服务解析;
# - only: 只使用forwarders DNS解析,查询不到返回查询失败;
forward first;
# 转发地址
forwarders {
114.114.114.114;
202.106.0.20;
};
# 设置递归查询
recursion yes;
# 是否支持dnssec开关
dnssec-enable yes;
# 是否支持dnssec确认开关
dnssec-validation yes;
# ISC DLV KEY 路径
bindkeys-file "/etc/named.root.key";
# 指定管理密钥路径
managed-keys-directory "/var/named/dynamic";
# 指定服务器进程pid文件路径
pid-file "/run/named/named.pid";
# named生成的TSIG session key写入文件的路径
session-keyfile "/run/named/session.key";
};
# 定义日志
logging {
channel default_debug {
file "data/named.run";
# 设置当前日志调试级别
severity dynamic;
};
};
# 定义区域
zone "." IN {
# 域(master)、从域(slave)、缓存域(hint)、转发域(forward)、stub 只负责主域的NS记录
type hint;
# 指定根域的文件
file "named.ca";
};
# 正反向区域文件
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
区域配置文件:/etc/named.rfc1912.zones
# 设置维护域
zone "localhost.localdomain" IN {
# 指定为主域服务器
type master;
# 指定区域数据的zone文件名
file "named.localhost";
# 是否允许辅助dns更新: allow-updata
allow-update { none; };
};
# IPV6的PTR配置文件设定
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
# 配置PRT维护域
zone "1.0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
区域数据配置文件
/var/named/named.localhost(正向)
# DNS记录过期时间
$TTL 1D
# 第一个@表示当前区域的名字;第二个@表示主dns服务器区域记录 SOA 表示dns的SOA记录类型: rname.invalid. 表示管理该域名管理员邮箱地址(其中'.'代表电子邮件中的'@')
@ IN SOA @ rname.invalid. (
# 序列号
0 ; serial
# 更新时间
1D ; refresh
# 重试时间
1H ; retry
# 过期时间
1W ; expire
# 缓存时间
3H ) ; minimum
# NS:NameServer 即指定dns区域服务器记录
NS @
A 127.0.0.1
AAAA ::1
/var/named/named.loopback(反向)
$TTL 1D
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1
# 反向与正向代理不同点,一定要记得域名后面的'.'
PTR localhost.
添加新解析记录 - 正文开始
以test.com为例
添加的过程基本是 - 添加区域文件 -> 将区域文件位置添加到主配置文件中 -> 添加区域数据文件。
顺序可以乱,但是不能落下,区域文件有两种:
1、新建区域文件,需要添加之后将新增区域文件位置增加到主配置文件中;
2、或者直接将解析记录添加到默认的区域文件(/etc/named.rfc1912.zones),不需要再次修改主配置文件。
新增区域文件
[root@localhost ~]# vim /etc/named.test.zones
# 正向
zone "test.com" IN {
type master;
file "test.com.zone";
};
# 反向(若没有反向解析的需求,可以省略,下面区域数据配置文件也不需要反向解析的配置文件,即/var/named/192.168.33.zone)
zone "33.168.192.in-addr.arpa" IN {
type master;
file "192.168.33.zone";
};
修改主配置文件
[root@localhost ~]# vim /etc/named.conf
......
include "/etc/named.rfc1912.zones";
# 新增区域文件位置
include "/etc/named.test.zones";
include "/etc/named.root.key";
新增区域数据配置文件
[root@localhost ~]# cd /var/named/
[root@localhost named]# cp -a named.localhost test.com.zone
[root@localhost named]# vim test.com.zone
$TTL 1D
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1
# 新增解析记录,将dddd.test.com解析为192.168.33.129
dddd IN A 192.168.33.129
[root@localhost named]# cp -a named.loopback 192.168.33.zone
$TTL 1D
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1
129 PTR dddd.test.com.
重启DNS服务
[root@localhost ~]# systemctl restart named
测试解析
在192.168.33.128上配置DNS指向192.168.33.131,来测试是否可正常解析dddd.test.com
[root@localhost ~]# vim /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.33.131
[root@localhost ~]# systemctl restart network
[root@localhost ~]# nslookup dddd.test.com
Server: 192.168.33.131
Address: 192.168.33.131#53
Name: dddd.test.com
Address: 192.168.33.129
[root@localhost ~]# nslookup 192.168.33.129
129.33.168.192.in-addr.arpa name = dddd.test.com.