1.DNS工作原理
DNS解析的过程通常包括以下几个步骤:
客户端请求DNS解析:用户的设备(如计算机或手机)发起DNS查询请求,询问特定域名(如
www.example.com)对应的IP地址。递归查询:如果查询的DNS服务器是递归DNS服务器,它将从根DNS服务器开始查找所需的信息。递归DNS服务器通过多个步骤向下查询,直到找到权威DNS服务器并获取IP地址。
缓存机制:递归DNS服务器通常会缓存查询结果,缓存期限根据DNS记录的TTL(Time to Live)值来决定。这样,后续的相同查询可以直接从缓存中获取结果,提高响应速度。
返回最终结果:递归DNS服务器或权威DNS服务器将最终的IP地址返回给客户端,客户端就可以通过该IP地址与目标服务器建立连接。
2.自建DNS服务器
5.0 任务说明
目前公司内部,有很多的内部网站,仅能通过内部网络才可以访问到,但是每一个系统如果让员工通过IP访问,实在太麻烦了,公司希望建立一个内部DNS服务器,通过设置对应的域名,采用内部DNS服务器负责转发,同时该服务器也要支持访问外部网络
5.1 DNS服务器软件介绍
目前市场上支持搭建DNS服务器的软件有很多,以下是几个常用的DNS服务器介绍:
1.BIND 是最常见的 DNS 服务器软件之一,广泛应用于 Linux 和 Unix 系统。它功能强大,支持正向和反向解析,并且具有灵活的配置选项。
2.Unbound 是一个轻量级的、开源的 DNS 解析器,主要用于递归查询,它的设计目标是提供快速、安全、灵活的 DNS 服务。相比 BIND,Unbound 更加简洁易用,适合用于简单的 DNS 解析服务。
3.dnsmasq 是一个轻量级的 DNS 和 DHCP 服务器,适用于小型网络或家庭环境。它可以提供 DNS 缓存功能,并且支持 DHCP 服务。
4.PowerDNS 是一个高性能的 DNS 服务器,支持多种后端数据库,如 MySQL 和 PostgreSQL。它适用于需要高性能、高可用性的企业级应用。
5.CoreDNS 是一个灵活、可扩展的 DNS 服务器,广泛用于 Kubernetes 环境中,也可以作为传统 DNS 服务器使用。它由 Go 语言编写,支持插件扩展。
建议推荐:
如果需要强大功能和全面的支持,可以选择BIND,它适合用于大规模的、企业级的 DNS 服务。
如果需要一个轻量级且简单的DNS服务器,可以选择Unbound或dnsmasq,它们易于配置,适合小型网络或家庭使用。
如果需要高性能并且数据库集成的DNS服务,可以选择PowerDNS。
如果在 Kubernetes 环境中使用DNS,可以选择CoreDNS。
本次我们主要采用BIND来完成建设DNS服务器的任务
服务器规划:
node1为访问的客户端
node2为DNS服务
准备工作
标准化服务器基础设置
关于标准化服务器的说明:
1- 主机名调整: 格式:主机名+域名 主机名.it.cn 主机名从node1 ~ nodeN
2- 修改静态IP: 目前要求:192.168.88 开头 主机地址:从 101 开始 逐步+1即可
3- 修改hosts文件: 配置文件: /etc/hosts 增加所有的节点服务器的hosts映射关系, 主要目的是为了方便访问使用以及配置使用,减少直接使用IP
配置格式: IP 别名1 别名2 别名N... 当前我们有node1和node2二台服务器, 所以每台服务器需要对这两台服务器进行别名设置配置
192.168.88.101 node1 node1.it.cn
192.168.88.105 node2 node2.it.cn
注意:每个节点, 都需要配置这两行, 如果未来有更多的服务器, 每个hosts中都需要增加新的服务器的映射配置
4- 配置SSH免密:具体操作请看之前的文章
在DNS服务器上安装BIND
dnf -y install bind bind-utils 说明: bind:提供 DNS 服务器功能,用于 解析域名(包括内部和外部域名),管理 DNS 区域和记录。 bind-utils:提供一些 DNS 查询工具,如 dig、nslookup、host,用于测试和调试 DNS 配置。配置BIND主配置文件
BIND 的主配置文件位于/etc/named.conf。
vi /etc/named.conf # 调整以下内容(不要直接拷贝复制): options { listen-on port 53 { 127.0.0.1; 192.168.88.0/24; }; // 内部网络地址 listen-on-v6 { none; }; // 禁用IPv6,如果不需要的话 allow-query { 127.0.0.1; 192.168.88.0/24; }; // 允许来自内部网络的查询 recursion yes; // 启用递归查询 forwarders { 8.8.8.8; // Google DNS 114.114.114.114; // 国内移动、电信和联通通用的dns, }; dnssec-validation no; //关闭 DNSSEC(DNS 安全扩展)验证,增加 DNS 查询的安全性。 // 控制区域传输权限,禁止外部直接访问区域 allow-transfer { none; }; }; 说明: forwarders:配置转发 DNS 请求到外部 DNS 服务器(例如 Google DNS)。 为啥设置 allow-transfer { none; }; 区域传输是 DNS 服务器之间的一种机制,用于将一个 DNS 区域的数据从主 DNS 服务器(master)同步到从 DNS 服务器(slave)。这通常用于设置 主从 DNS 服务器 配置,在多个 DNS 服务器之间同步域名记录。 此配置是为了 增强安全性,防止未授权的服务器执行区域传输,从而保护 DNS 服务器的区域数据不被泄露或滥用。配置内部区域注册文件
假设目前有以下内部网站需要配置内部转发:
internal.local 192.168.88.101内部正向解析注册文件
vi /etc/named.rfc1912.zones 添加以下内容: zone "internal.local" IN { type master; file "/var/named/internal.local.db"; allow-update { none; }; }; 说明: zone "internal.local" IN { 表示一个 DNS 区域的声明 internal.local 是此 DNS 区域的名称 IN 指 Internet 类别,常用默认值 type master; 指定此区域的类型为 主(master)区域 主区域是该域名的权威数据源,DNS 数据直接从此服务器的配置文件加载 file "/var/named/internal.local.db"; 定义该区域的区域数据文件位置 文件 internal.local.db 包含该区域的记录(如 A、MX、NS 等) allow-update { none; }; 指定此区域是否允许动态更新 none 意味着不允许任何动态更新,域名记录只能通过手动修改文件更新vi /var/named/internal.local.db # 添加以下内容: $TTL 86400 @ IN SOA ns1.internal.local. admin.internal.local. ( 2024011701 ; Serial 3600 ; Refresh 1800 ; Retry 1209600 ; Expire 86400 ) ; Minimum TTL IN NS ns1.internal.local. ns1 IN A 192.168.88.102 web1 IN A 192.168.88.101 web2 IN A 192.168.88.101 @ IN A 192.168.88.101 说明: $TTL 默认 TTL (Time To Live)。 所有资源记录的默认缓存时间,单位为秒。 这里设置为 86400(一天)。客户端在缓存数据时会遵循此值。 SOA 记录(Start of Authority) @: 当前区域的根域(即 internal.local)。 IN: 表示 Internet 类别。 SOA: 开始授权记录,定义该区域的关键元信息。 ns1.internal.local. 主域名服务器的 FQDN(全限定域名)。 admin.internal.local. 管理员的邮箱地址,@ 替换为 .(即 admin@internal.local)。 2024011701 序列号,每次修改区域文件时需递增,用于从服务器检测更新。 3600 刷新时间,从服务器多久检查主服务器是否有更新(秒)。 1800 重试时间,从服务器在刷新失败后再次尝试的等待时间(秒)。 1209600 过期时间,从服务器在无法联系主服务器时数据失效的时间(秒)。 86400 最小 TTL,未覆盖的记录的默认缓存时间(秒)。 NS 记录(Name Server) 指定该区域的域名服务器地址。 ns1.internal.local.: 表示 internal.local 的主域名服务器。 A 记录(Address): 定义域名到 IPv4 地址的映射。 ns1.internal.local. 解析为 192.168.88.102 web1.internal.local. 和 web2.internal.local. 都解析为 192.168.88.101 扩展常见的DNS记录类型: A 记录(Address Record): 将域名映射到 IPv4 地址。 AAAA 记录: 将域名映射到 IPv6 地址。 CNAME 记录(Canonical Name Record): 为域名提供别名。 MX 记录(Mail Exchange Record): 指定邮件服务器的地址。 NS 记录(Name Server Record): 指定域名的权威 DNS 服务器。 SOA 记录(Start of Authority Record): 定义 DNS 区域的起始权威信息。 PTR 记录(Pointer Record): 用于反向 DNS 查找,将 IP 地址映射回域名。 TXT 记录(Text Record): 存储任意文本数据,常用于 SPF、DKIM 等验证机制。内部反向解析注册文件
vi /etc/named.rfc1912.zones # 添加以下配置 zone "88.168.192.in-addr.arpa" IN { type master; file "/var/named/192.168.88.rev"; allow-update { none; }; }; 说明: zone "88.168.192.in-addr.arpa" IN { 这是一个 反向区域(reverse zone)的声明。 反向区域用于将 IP 地址(IPv4)转换为域名,这和正向 DNS 查询(将域名转换为 IP 地址)是相反的。 88.168.192.in-addr.arpa:这是 192.168.88.x IP 地址段的反向区域名称。反向查找区域的命名规则是:将 IP 地址的每个八位字节倒序并加上 .in-addr.arpa 后缀。例如,192.168.88.x 的反向区域名称就是 88.168.192.in-addr.arpa。 type master; 指定该区域是 主(master)区域,也就是说,这是该区域的权威 DNS 服务器,并且数据会从本地文件加载 file "192.168.88.rev"; 这是该区域的区域数据文件路径。 192.168.88.rev 文件包含了反向解析记录,用于将 IP 地址(如 192.168.88.101)映射到对应的域名 allow-update { none; }; allow-update 指定是否允许动态更新。在这里设置为 none,意味着不允许任何动态更新 这是一种安全配置,防止未经授权的客户端修改 DNS 记录vi /var/named/192.168.88.rev # 添加以下配置 $TTL 86400 @ IN SOA ns1.internal.local. admin.internal.local. ( 2024011701 ; Serial 3600 ; Refresh 1800 ; Retry 1209600 ; Expire 86400 ) ; Minimum TTL IN NS ns1.internal.local. 102 IN PTR ns1 101 IN PTR web1 101 IN PTR web2 101 IN PTR @语法检测
# 配置文件语法检查 named-checkconf /etc/named.conf named-checkconf /etc/named.rfc1912.zones 如果报了错误, 一般都是由于配置文件丢失内容导致语法结构不对, 请检查配置文件 /etc/named.conf 【大概率是该文件的问题】 /etc/named.rfc1912.zones# 区域文件语法检查 named-checkzone internal.local /var/named/internal.local.db named-checkzone 88.168.192.in-addr.arpa /var/named/192.168.88.rev启动BIND服务
systemctl start named -- 立即启动 systemctl enable named -- 开启自动启动 systemctl status named -- 查看状态配置防火墙
确保防火墙允许 53 端口的 UDP 和 TCP 流量,这样 DNS 请求才能到达服务器。
firewall-cmd --zone=public --add-port=53/udp --permanent firewall-cmd --zone=public --add-port=53/tcp --permanent firewall-cmd --reload 或者: firewall-cmd --zone=public --add-service=dns --permanent firewall-cmd --reload # 查看规则信息: firewall-cmd --list-all客户端配置操作【node1】
vim /etc/NetworkManager/system-connections/ens160.nmconnection 修改完成后, 重启网卡: systemctl restart NetworkManagernmcli device show ens160测试服务器是否正常
在node1需要安装: bind-utils dnf -y install bind-utils- 使用 dig 或 nslookup 命令测试 DNS 查询,确保内部域名解析正常工作。例如: dig web1.internal.localping web1.internal.local- 使用 dig 或 nslookup 命令测试 DNS 查询,确保外部域名解析正常工作。例如: dig baidu.com安装脚本编写
node2安装脚本 说明 先运行node2脚本再运行node1脚本 脚本都需要有执行权限 脚本仅供参考 根据实际情况编写#! /bin/bash #DNS安装与配置(采用BIND建设DNS) # 前提:已完成免密设置 # 服务端ip ip5="192.168.88.105" # 客户端ip ip1="192.168.88.101" # 标准化服务器设置() # 主机名 hostnamectl set-hostname node5.it.cn ssh root@$ip1 hostnamectl set-hostname node1.it.cn # 服务器映射关系配置 echo "$ip1 node1 node1.it.cn" >> /etc/hosts" echo "$ip5 node2 node5.it.cn" >> /etc/hosts" ssh root@$ip1 "echo "$ip1 node1 node1.it.cn" >> /etc/hosts" ssh root@$ip1 "echo "$ip5 node2 node5.it.cn" >> /etc/hosts" # 安装BIND rpm -q bind &> /dev/null if [ $? -eq 0 ]; then echo "已安装BIND" else echo "正在安装BIND" dnf install bind bind-utils -y &> /dev/null fi # 修改主配置文件 sed -i '/listen-on port 53/ s#{[^}]*}#{ 127.0.0.1; 192.168.88.0/24; }#' /etc/named.conf && sed -i '/listen-on-v6 port 53/ s#{[^}]*}#{ none; }#' /etc/named.conf && sed -i '/allow-query/ s#{[^}]*}#{ 127.0.0.1; 192.168.88.0/24; }#' /etc/named.conf && sed -i '/recursion yes;/a\ forwarders {\ 8.8.8.8;\ 114.114.114.114;\ };' /etc/named.conf && sed -i 's#dnssec-validation yes#dnssec-validation no#' /etc/named.conf && sed -i '/include "\/etc\/crypto-policies\/back-ends\/bind.config"/a\ allow-transfer { none; };' /etc/named.conf && # 配置内部正向区域注册文件 echo 'zone "internal.local" IN { type master; file "/var/named/internal.local.db"; allow-update { none; }; };' >> /etc/named.rfc1912.zones touch /var/named/internal.local.db cat > /var/named/internal.local.db << 'EOF' $TTL 86400 @ IN SOA ns1.internal.local. admin.internal.local. ( 2024011701 ; Serial 3600 ; Refresh 1800 ; Retry 1209600 ; Expire 86400 ) ; Minimum TTL IN NS ns1.internal.local. ns1 IN A 192.168.88.105 web1 IN A 192.168.88.101 web2 IN A 192.168.88.101 @ IN A 192.168.88.101 EOF # 配置内部反向区域注册文件 echo 'zone "88.168.192.in-addr.arpa" IN { type master; file "/var/named/192.168.88.rev"; allow-update { none; }; };' >> /etc/named.rfc1912.zones touch /var/named/192.168.88.rev cat > /var/named/192.168.88.rev << 'EOF' $TTL 86400 @ IN SOA ns1.internal.local. admin.internal.local. ( 2024011701 ; Serial 3600 ; Refresh 1800 ; Retry 1209600 ; Expire 86400 ) ; Minimum TTL IN NS ns1.internal.local. 105 IN PTR ns1 101 IN PTR web1 101 IN PTR web2 101 IN PTR @ EOF # 配置主文件语法检查 named-checkconf /etc/named.conf && named-checkconf /etc/named.rfc1912.zones if [ $? -eq 0 ]; then echo "主配置文件无误" else echo "主配置文件有误" fi named-checkzone internal.local /var/named/internal.local.db && named-checkzone 88.168.192.in-addr.arpa /var/named/192.168.88.rev if [ $? -eq 0 ]; then echo "区域配置文件无误" else echo "区域配置文件有误" fi # 启动服务 systemctl start named systemctl enable named # 配置防火墙 firewall-cmd --zone=public --add-port=53/udp --permanent firewall-cmd --zone=public --add-port=53/tcp --permanent firewall-cmd --reload # 测试部分 echo "开始测试" # 调用客户端测试脚本 ssh root@$ip1 "cd /root && bash /root/ceshi.sh"node5脚本 #! /bin/bash # 客户端安装bind-utils dnf install bind-utils -y # 修改客户端DNS sed -i '/^dns=/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/192.168.88.105/g' /etc/NetworkManager/system-connections/ens160.nmconnection systemctl restart NetworkManager # 测试 dig web1.internal.local | grep 192.168.88.105 if [ $? -eq 0 ]; then echo "服务器正常" else echo "测试失败" fi ping -c1 web1.internal.local if [ $? -eq 0 ]; then echo "服务器正常" else echo "测试失败" fi