Skip to content

DNS域名解析

域名服务(Domain Name System,简称DNS)是互联网的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口来传输数据,默认情况下,DNS服务使用以下两个端口号:

  • UDP端口53:用于DNS查询请求和响应。
  • TCP端口53:用于区域传输(zone transfers)、DNSSEC(DNS安全扩展)和其他需要可靠传输的操作。

DNS服务的作用

DNS 的核心功能

  • 域名解析:将域名转换为 IP 地址(正向解析)或 IP 地址转换为域名(反向解析)。
  • 分层管理:采用分布式数据库结构,通过层级域名(如 .com.org)和权威服务器分工协作。
  • 负载均衡:通过返回不同的 IP 地址实现流量分发(如 CDN 或大型网站)。

DNS解析类型

正向解析

  • 功能:通过域名查询IP地址(最常用的DNS查询方式)。

  • 记录类型

    • A记录(IPv4)
    • AAAA记录(IPv6)
    • CNAME记录(别名)
  • 示例

    bash
    dig www.example.com A
    nslookup www.example.com
  • 适用场景:浏览器访问网站、应用程序连接服务器等。

反向解析

  • 功能:通过IP地址查询域名(主要用于日志分析、邮件反垃圾验证)。

  • 记录类型PTR记录(Pointer Record)。

  • 查询方式

    • IPv4:dig -x 192.0.2.1
    • IPv6:dig -x 2001:db8::1
  • 示例

    bash
    dig -x 8.8.8.8  # 查询8.8.8.8对应的域名
  • 适用场景

    • 邮件服务器验证(防止垃圾邮件)。
    • 网络日志分析(IP归属查询)。

DNS服务类型

递归DNS服务器

  • 功能:接收客户端请求,代替客户端从根服务器逐级查询,直到获取最终IP地址。
  • 特点
    • 通常由ISP(如电信、联通)或公共DNS服务商(如Google DNS 8.8.8.8、Cloudflare 1.1.1.1)提供。
    • 具备缓存机制,可加速重复查询。
  • 适用场景:终端用户直接使用的DNS解析服务

权威DNS服务器

  • 功能:管理特定域名的DNS记录(如A、MX记录),直接提供域名解析结果。
  • 特点
    • 由域名注册商或企业自行维护(如ns1.example.com)。
    • 不处理递归查询,仅响应自身管理的域名请求。
  • 适用场景:托管域名解析记录的服务器

缓存域名服务器

  • 功能:缓存近期查询结果,减少重复解析时间。
  • 特点
    • 通常与递归服务器结合部署(如ISP的本地DNS服务器)。
    • 根据TTL(生存时间)控制缓存有效期

根域名服务器

  • 功能:全球共13组逻辑根服务器,管理顶级域(TLD)服务器的地址(如.com.org的TLD服务器)。
  • 特点
    • 不直接解析域名,仅引导查询到下一级TLD服务器。
    • 通过任播(Anycast)技术扩展为数百台物理服务器提升容灾能力

顶级域名服务器

  • 功能:管理特定顶级域(如.com)下的二级域名权威服务器地址。
  • 分类
    • 通用顶级域(gTLD):如.com.net
    • 国家代码顶级域(ccTLD):如.cn.uk
  • 示例.com TLD服务器返回example.com的权威服务器地址

转发DNS服务器

  • 功能:将查询请求转发至其他递归服务器(如公共DNS),并缓存结果。
  • 特点
    • 适用于内网环境,减少外部查询流量。
    • 依赖上游递归服务器的可靠性

公共DNS服务器

  • 示例
    • Google DNS:8.8.8.88.8.4.4
    • Cloudflare DNS:1.1.1.11.0.0.1
    • 阿里DNS:223.5.5.5223.6.6.6
  • 优势:提供更快的解析速度、更高的安全性(如支持DoH/DoT加密)

DNS查询模式

递归查询

  • 适用对象:客户端 → 递归DNS服务器(如ISP DNS、Google DNS)。

  • 特点

    • 递归DNS服务器必须返回最终结果(IP地址或错误),不能转交查询。
    • 如果本地缓存没有记录,递归服务器会从根服务器开始逐级查询,直到找到答案。
  • 示例

    bash
    用户(浏览器)
    
    本地映射记录hosts
     
    localDNS(可以是网关)
     
    递归DNS服务器(8.8.8.8)
  • 适用场景:普通用户访问网站时,本地DNS服务器执行的查询方式。

迭代查询

  • 适用对象:递归DNS服务器 → 根(.)/TLD/权威DNS服务器。

  • 特点

    • 被查询的服务器(如根服务器)不会代替查询,而是返回下一级服务器的地址。
    • 递归DNS服务器需要自己继续向下一级服务器查询。
  • 示例

    bash
    # 迭代查询是从一级域名->二级域名->三级域名顺序返回信息
    
    递归DNS服务器(8.8.8.8)
     
    根服务器(返回.com TLD服务器地址)
    递归DNS服务器 
     
    .com TLD服务器(返回example.com权威服务器地址)
    递归DNS服务器 
     
    example.com权威服务器(返回www.example.com的IP)
  • 适用场景:DNS服务器之间的查询方式,递归DNS服务器负责完成整个查询链。

示例

访问 www.example.com ① 根服务器指向 .com TLD 服务器 → ② TLD 服务器指向 example.com 的权威服务器 → ③ 权威服务器返回 www.example.com 的 IP。

DNS 记录类型

记录类型描述示例主要用途
AIPv4 地址记录192.0.2.1将域名解析到 IPv4 地址(如网站服务器)。
AAAAIPv6 地址记录2001:db8::1将域名解析到 IPv6 地址。
CNAME规范名称(别名)记录www.example.comexample.com将一个域名指向另一个域名(别名)。
MX邮件交换记录mail.example.com(优先级 10)指定接收邮件的服务器。
TXT文本记录"v=spf1 include:_spf.example.com ~all"用于验证、SPF(反垃圾邮件)、DKIM/DMARC 等。
NS域名服务器记录ns1.example.com指定管理该域名的权威 DNS 服务器。
PTR指针记录(反向解析)1.2.0.192.in-addr.arpaexample.com将 IP 地址解析回域名(常用于邮件服务器验证)。
SOA起始授权记录(Start of Authority)ns1.example.com admin.example.com (...)存储域名的管理信息(如主 DNS 服务器、序列号、刷新时间等)。
SRV服务定位记录_sip._tcp.example.com10 60 5060 sipserver.example.com定义特定服务的服务器地址和端口(如 VoIP、LDAP)。
CAA证书颁发机构授权记录0 issue "letsencrypt.org"

说明

  • 优先级(MX/SRV):数值越小优先级越高(如 MX 记录中的 1020)。
  • TTL(Time To Live):所有记录均可设置缓存时间(单位:秒)。
  • 通配符记录:可使用 *.example.com 匹配所有子域名(A/CNAME 等支持)。

DNS查询流程示例

mermaid
sequenceDiagram
    客户端->>本地DNS: 查询www.example.com
    本地DNS->>根服务器: 请求.com地址
    根服务器-->>本地DNS: 返回.com NS
    本地DNS->>.com服务器: 请求example.com地址
    .com服务器-->>本地DNS: 返回权威NS
    本地DNS->>权威NS: 请求A记录
    权威NS-->>本地DNS: 返回IP地址
    本地DNS->>客户端: 返回解析结果

1. 客户端本地检查

  • ① 浏览器/应用缓存 浏览器(如Chrome)或应用程序会先检查自己的DNS缓存(如近期访问过的域名)。
  • ② 操作系统Hosts文件 检查本地 hosts 文件(如Windows的 C:\Windows\System32\drivers\etc\hosts),如果存在对应记录,直接使用。
  • ③ 操作系统DNS缓存 检查系统DNS缓存(如Windows的 ipconfig /displaydns),若有缓存且未过期,直接返回IP。

若以上任意一步命中,则直接返回IP,查询终止。

2. 向本地递归DNS服务器查询

如果本地无缓存,客户端会向配置的 递归DNS服务器 发起请求(通常由ISP或手动指定,如 8.8.8.8):

  • ④ 路由器/本地DNS服务器

    家用路由器或企业内网DNS服务器会检查自己的缓存,若命中则返回IP。

    • 如果未命中,递归DNS服务器会代表客户端 从根服务器开始迭代查询(见下文)。

🔄 递归DNS服务器的核心任务:代替客户端完成后续所有查询,直到拿到最终IP或报错。

3. 递归DNS服务器的迭代查询过程

递归DNS服务器会按以下顺序逐级查询(迭代方式):

  • ⑤ 根域名服务器(Root Server) 询问根服务器 www.example.com 的IP,根服务器返回 .com 顶级域(TLD)服务器的地址。
  • ⑥ TLD服务器(.com 服务器) 询问 .com 服务器,返回 example.com 的权威DNS服务器地址。
  • ⑦ 权威DNS服务器(example.com 的NS记录) 询问 example.com 的权威服务器,最终返回 www.example.com 的A记录(如 192.0.2.1)。

4. 结果返回与缓存

  • ⑧ 递归DNS服务器缓存结果 递归服务器将IP存入缓存(根据TTL时间),并返回给客户端。
  • ⑨ 客户端缓存IP 客户端操作系统和浏览器缓存该记录,后续访问直接使用。

DNS查询工具

工具命令示例用途
digdig www.example.com A专业DNS查询(支持所有记录)
nslookupnslookup www.example.com基础DNS查询(Windows/Linux)
hosthost www.example.com快速查询域名IP
pingping www.example.com测试DNS解析+网络连通性

重点路径说明

  • 主配置文件/etc/named.conf
  • 数据配置文件目录/var/named

数据配置目录文件解析

目录/文件所属用户/组用途
data/named:named动态数据存储(如DNSSEC密钥、查询缓存等)
dynamic/named:named动态更新的区域文件(需配合allow-update配置)
slaves/named:named从服务器同步的区域文件存放位置
named.caroot:named根DNS服务器列表(hint zone数据源)
named.localhostroot:named本地回环域的正向解析模板(localhost127.0.0.1
named.loopbackroot:named反向解析模板(127.0.0.1localhost
named.emptyroot:named空区域文件(用于黑洞域名解析)

主配置文件 named.conf

named.conf 是BIND DNS服务的核心配置文件,采用类C语言语法,主要包含全局配置日志定义区域声明等模块。

配置文件结构

c
// 全局配置(影响整个DNS服务)
options {
    // 全局参数
};

// 日志配置(可选)
logging {
    // 日志参数
};

// 定义DNS根提示(根服务器列表)
zone "." IN {
    type hint;
    file "named.ca";
};

// 自定义区域(正向/反向解析)
zone "example.com" IN {
    // 区域参数
};

options 全局配置

c
options {
    listen-on port 53 { 127.0.0.1; 192.168.1.10; }; // 监听IPV4和端口,可设置any
    listen-on-v6 port 53 { ::1; };					// 监听IPV6和端口,可设置any
    directory "/var/named";                         // 工作目录(区域文件存放路径)
    allow-query { any; };                           // 允许查询的客户端(any/特定网段)
    recursion yes;                                  // 是否递归查询(缓存服务器需开启)
    forwarders { 8.8.8.8; 8.8.4.4; };              // 转发查询到上游DNS
    dnssec-validation yes;                         // DNSSEC验证(安全增强)
};

关键参数说明

  • listen-on:绑定服务的IP地址(默认仅localhost,生产环境需指定服务器IP)。
  • allow-query:限制查询来源(如内网网段 { 192.168.1.0/24; })。
  • recursion:设为no可防止DNS放大攻击(仅权威DNS需关闭)

logging 日志配置

c
logging {
    channel default_debug {
        file "data/named.run";  // 日志文件路径
        severity dynamic;       // 日志级别(dynamic/info/debug)
    };
};

日志级别建议

  • dynamic:默认级别(记录错误和警告)。
  • debug 3:调试模式(会记录详细查询过程,慎用,日志量极大)。

zone 区域定义

正向解析(域名 → IP)

c
zone "example.com" IN {
    type master;                   // 主服务器类型(master/slave)
    file "example.com.zone";       // 区域文件路径(默认在/var/named/)
    allow-update { none; };        // 禁止动态更新(安全考虑)
};

反向解析(IP → 域名)

c
zone "1.168.192.in-addr.arpa" IN { // 反向网段(IP倒写)
    type master;
    file "192.168.1.rev";
};

域配置文件

正向解析示例

c
$TTL 86400                      ; 默认缓存时间(24小时)
@       IN  SOA  ns1.example.com. admin.example.com. (
                2024060301      ; 序列号 (格式:YYYYMMDDNN)
                3600            ; 刷新时间(1小时)
                1800            ; 重试时间(30分钟)
                604800          ; 过期时间(7天)
                86400           ; 最小TTL(24小时)
        )

; 权威DNS服务器记录
@       IN  NS   ns1.example.com.
@       IN  NS   ns2.example.com.

; A记录(域名 → IPv4)
@       IN  A    192.168.1.10    ; 主域名解析
ns1     IN  A    192.168.1.10    ; NS服务器IP
www     IN  A    192.168.1.20    ; 子域名解析
mail    IN  A    192.168.1.30

; CNAME记录(别名)
web     IN  CNAME www.example.com.

; MX记录(邮件服务器)
@       IN  MX 10 mail.example.com.

反向解析示例

c
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
        2024060301 ; 序列号
        3600       ; 刷新
        1800       ; 重试
        604800     ; 过期
        86400      ; 最小TTL
)

; 权威DNS服务器
@ IN NS ns1.example.com.
@ IN NS ns2.example.com.

; PTR记录(IP最后一字节 → 域名)
10 IN PTR ns1.example.com.
20 IN PTR www.example.com.
30 IN PTR mail.example.com.

配置文件检查与重载

bash
# 检查主配置语法错误
named-checkconf /etc/named.conf
# 检测域名解析配置语法错误
named-checkzone example.com example.com.zone
# 重载配置(不中断服务)
systemctl reload named

安装与配置

  • bind:提供了域名服务器的主要程序及相关文件
  • bind-utils:提供了对 DNS 服务器的测试工具程序,如 nslookup
  • bind-libs:提供了 bindbind-utils 需要使用的库函数
  • bind-chroot:为 BIND 服务提供一个伪装的根目录(将/var/named/chroot 文件夹作为 BIND的跟目录)以提高安全性。也称为 jail(监牢)机制。BIND 安装以后,会自动增加一个名为 named 的系统服务
bash
# CentOS/RedHat
dnf -y install bind bind-utils bind-libs bind-chroot

构建缓存DNS服务器

流程说明

  • 缓存域名服务器 IP 地址为 192.168.148.140,并能够正常访问互联网

  • 缓存域名服务器代为处理客户端的 DNS 解析请求,并缓存查询结果

  • 局域网内的各 PC 将首选 DNS 服务器设为 192.168.148.140,访问外网页面

    mermaid
    graph LR
        网关服务器 -->|管理访问| 局域网缓存域名服务器
        局域网缓存域名服务器 -->|解析服务| 客户端1
        局域网缓存域名服务器 -->|解析服务| 客户端2
        
        subgraph 局域网[192.168.148.0/24]
            客户端1
            客户端2
        end

修改主配置文件/etc/named.conf

修改完检测配置语法错误named-checkconf /etc/named.conf

c
options {
	//需要监听的真实服务器ip,如果所有地址都监听可以只写端口,括号内可填any
    listen-on port 53 { 192.168.148.160; };
    listen-on-v6 port 53 { ::1; };
    // 关闭DNSSEC验证
    dnssec-validation no;
};

// 屏蔽掉请求根域名(国内无法访问根域名地址)
//zone "." IN {
//    type hint;
//    file "named.ca";
//};

// 正向解析
zone "yun.com" IN {
	type master;
	file "yun.com.zone";
};
// 反向解析
zone "148.168.192.in-addr.arpa" IN {
	type master;
	file "192.168.148.arpa";
};

生成域配置文件

正向解析

bash
cat > /var/named/repo.local.zone << EOF
$TTL 3H
@	IN SOA	@ rname.invalid. (
					0	; serial
					1D	; refresh
					1H	; retry
					1W	; expire
					3H )	; minimum
					
		NS	ns1.repo.local.
ns1		A	192.168.148.201
www		A	192.168.148.200
EOF

# 修改完检测配置语法错误
named-checkzone yum.com /var/named/yun.com.zone
# 出现一下信息正确
zone yum.com/IN: loaded serial 0
OK

反向解析

bash
cat > 192.168.148.arpa << EOF
$TTL 3H
@	IN SOA	@ rname.invalid. (
					0	; serial
					1D	; refresh
					1H	; retry
					1W	; expire
					3H )	; minimum
	NS	ns1.yun.com.
240	PTR	www.yun.com
240	PTR	news.yun.com
132	PTR	map.yun.com	
EOF

# 修改完检测配置语法错误
named-checkzone 148.168.192.in-addr.arpa 192.168.148.arpa
# 出现一下信息正确
zone 148.168.192.in-addr.arpa/IN: loaded serial 0
OK

重启服务

bash
systemctl restart named

客户端测试

将客户端网卡中的DNS设置192.168.148.140

bash
# 修改网卡
DNS1=192.168.148.140

# 检查
[root@localhost ~]# cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 192.168.148.140

# 验证DNS域名
## 正向解析
nslookup www.yun.com
## 反向解析
nslookup 192.168.148.240

DNS主从搭建

流程说明

  • 主、从域名服务器均位于 Internet 中,所负责的 DNS 区域为“yun.com”

  • 主服务器 IP 地址 192.168.148.140/24,主机名为 ns1.yun.com

  • 从服务器 IP 地址 192.168.148.141/24,主机名为 ns2.yun.com

  • 在 amber.com 区域中,除了 NS 记录以外提供的解析记录包括如下内容:

    • 网站服务器:www.yun.com, IP 地址 192.168.148.10/24

    • 邮件服务器:mail.yun.com,IP 地址 192.168.148.20/24

    • 新闻服务器:news.yun.com,IP 地址 192.148.91.30/24

    • 论坛服务器:bbs.yun.com,IP 地址 192.148.91.40/24

修改主配置文件 /etc/named

c
zone "yun.com" IN {
    type master;
    file "yun.com.zone";
    allow-transfer { 192.168.148.141; };
};
zone "148.168.192.in-addr.arpa" IN {
    type master;
    file "192.168.148.arpa";
    allow_transfer { 192.168.148.141; };
};

配置文件语法检测

bash
named-checkconf /etc/named

重启服务

bash
systemctl restart named

修改从配置文件

配置文件其他部分和主的保持一致即可。域配置文件会自动同步到/var/named/slaves中,从服务器指定域文件需要设置slaves路径。

c
zone "yun.com" IN {
    type slave;
    file "slaves/yun.com.zone";
    masters { 192.168.148.140; };
};
zone "148.168.192.in-addr.arpa" IN {
    type slave;
    file "slaves/192.168.148.arpa";
    masters { 192.168.148.140; };
};

配置文件语法检测

bash
named-checkconf /etc/named

重启服务

bash
systemctl restart named