做运维这些年,我见过太多因为DNS配置不当导致的各种问题:服务器无法解析域名、网站访问缓慢、内部服务互相找不到...这些问题排查起来往往让人无从下手。
今天就把DNS服务配置说透,从原理到实战,手把手教你搭建可靠的内网DNS服务器。
一、DNS服务到底是怎么工作的?
简单说,DNS(Domain Name System)就是互联网的"电话簿",把人类容易记住的域名(如 www.example.com)转换成机器需要的IP地址(如 192.168.1.100)。
1.1 DNS查询的完整流程
当你在浏览器输入 www.example.com 时,整个查询过程是这样的:
• 客户端 首先查询本地DNS缓存
• 本地DNS服务器收到请求
• 如果没有缓存,根服务器(.)告诉它:.com服务器在哪
• 顶级域服务器(.com)告诉它:example.com的DNS服务器在哪
• 权威DNS服务器最终返回IP地址
1.2 DNS记录类型详解
• A记录 - 域名指向IPv4地址
• AAAA记录 - 域名指向IPv6地址
• CNAME记录 - 域名别名
• MX记录 - 邮件服务器记录
• TXT记录 - 文本记录,常用于验证
• NS记录 - 域名服务器记录
• PTR记录 - 反向DNS解析
二、Linux下DNS服务配置
2.1 系统DNS配置文件
Linux系统中,DNS客户端配置主要涉及以下文件:
/etc/resolv.conf - DNS服务器配置
# /etc/resolv.conf 示例
nameserver 10.0.0.1
nameserver 8.8.8.8
search internal.local
options timeout:2 attempts:3
/etc/hosts - 本地静态解析
# /etc/hosts 示例
127.0.0.1 localhost
10.0.0.10 dns.internal.local dns
10.0.0.20 web01.internal.local web01
10.0.0.30 db01.internal.local db01
2.2 客户端DNS查询顺序
Linux查询域名的顺序是:hosts文件 → DNS缓存 → DNS服务器。这个顺序可以通过 /etc/nsswitch.conf 文件配置。
# /etc/nsswitch.conf 中的hosts配置
hosts: files dns myhostname
# 优先级:files → dns → myhostname
三、内网DNS服务器软件对比
主流的内网DNS服务器软件有以下几种,各有优缺点:
选型建议
• 小型办公室/家庭网络 → Dnsmasq
• 云原生/Kubernetes环境 → CoreDNS
• 中大型企业 → BIND9
• 递归DNS服务 → Unbound
四、BIND9实战配置
4.1 安装BIND9
CentOS/RHEL系统:
yum install -y bind bind-utils
systemctl enable named
systemctl start named
Ubuntu/Debian系统:
apt-get update
apt-get install -y bind9 bind9-utils dnsutils
systemctl enable named
systemctl start named
4.2 主配置文件 /etc/named.conf
// /etc/named.conf 完整配置示例
options {
listen-on port 53 { 10.0.0.10; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
recursion yes;
allow-query { 10.0.0.0/24; };
allow-query-cache { 10.0.0.0/24; };
dnssec-validation auto;
auth-nxdomain no;
};
// 本地区域配置
zone "internal.local" IN {
type master;
file "internal.local.zone";
allow-update { none; };
};
// 反向解析区域
zone "0.0.10.in-addr.arpa" IN {
type master;
file "10.0.0.zone";
allow-update { none; };
};
4.3 正向解析区域文件
$TTL 86400
@ IN SOA ns.internal.local. admin.internal.local. (
2024051901 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum
; Nameserver records
@ IN NS ns.internal.local.
ns IN A 10.0.0.10
; A records
www IN A 10.0.0.20
web01 IN A 10.0.0.20
web02 IN A 10.0.0.21
db01 IN A 10.0.0.30
db02 IN A 10.0.0.31
mail IN A 10.0.0.40
; CNAME records
blog IN CNAME www
forum IN CNAME www
; MX records
@ IN MX 10 mail.internal.local.
4.4 反向解析区域文件
$TTL 86400
@ IN SOA ns.internal.local. admin.internal.local. (
2024051901 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum
@ IN NS ns.internal.local.
10 IN PTR ns.internal.local.
20 IN PTR web01.internal.local.
21 IN PTR web02.internal.local.
30 IN PTR db01.internal.local.
31 IN PTR db02.internal.local.
40 IN PTR mail.internal.local.
4.5 配置语法检查与启动
# 检查配置文件语法
named-checkconf /etc/named.conf
# 检查区域文件语法
named-checkzone internal.local /var/named/internal.local.zone
named-checkzone 0.0.10.in-addr.arpa /var/named/10.0.0.zone
# 重载配置
systemctl reload named
# 测试解析
dig @10.0.0.10 www.internal.local
nslookup web01.internal.local 10.0.0.10
五、Dnsmasq快速部署
5.1 安装Dnsmasq
Dnsmasq是轻量级DNS服务器,特别适合小型网络环境。
# CentOS/RHEL
yum install -y dnsmasq
systemctl enable dnsmasq
# Ubuntu/Debian
apt-get install -y dnsmasq
systemctl enable dnsmasq
5.2 /etc/dnsmasq.conf 配置
# /etc/dnsmasq.conf
# 基础配置
interface=eth0
bind-interfaces
domain-needed
bogus-priv
# 上游DNS服务器
server=8.8.8.8
server=114.114.114.114
# 本地解析
address=/internal.local/10.0.0.10
# 自定义域名解析
host-record=web01,10.0.0.20
host-record=web02,10.0.0.21
host-record=db01,10.0.0.30
# 缓存配置
cache-size=1000
neg-ttl=3600
max-ttl=86400
# 日志
log-queries
log-facility=/var/log/dnsmasq.log
5.3 Dnsmasq + hosts文件
Dnsmasq可以直接读取/etc/hosts文件,非常方便:
# /etc/hosts(每行一个解析记录)
10.0.0.10 ns.internal.local ns
10.0.0.20 web01.internal.local web01 www
10.0.0.21 web02.internal.local web02
10.0.0.30 db01.internal.local db01 mysql
10.0.0.31 db02.internal.local db02
# 修改hosts后,重启dnsmasq生效
systemctl restart dnsmasq
六、CoreDNS云原生部署
6.1 二进制部署
# 下载CoreDNS
wget https://github.com/coredns/coredns/releases/download/v1.11.1/coredns_1.11.1_linux_amd64.tgz
tar -zxf coredns_1.11.1_linux_amd64.tgz
mv coredns /usr/local/bin/
# 创建配置目录
mkdir -p /etc/coredns
Corefile配置文件:
cat > /etc/coredns/Corefile <<'EOF'
.:53 {
forward . 8.8.8.8 114.114.114.114
log
errors
cache 30
}
internal.local:53 {
file db.internal.local
log
errors
}
EOF
区域文件:
cat > /etc/coredns/db.internal.local <<'EOF'
$ORIGIN internal.local.
$TTL 86400
@ IN SOA ns.internal.local. admin.internal.local. (
2024051901 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum
@ IN NS ns.internal.local.
ns IN A 10.0.0.10
www IN A 10.0.0.20
web01 IN A 10.0.0.20
db01 IN A 10.0.0.30
EOF
6.2 Docker部署(推荐)
# Docker部署CoreDNS
docker run -d \
--name coredns \
-p 53:53/udp \
-p 53:53/tcp \
-v /etc/coredns/Corefile:/Corefile \
coredns/coredns:1.11.1
# 测试
dig @127.0.0.1 www.internal.local
总结一下
本文详细讲解了Linux DNS服务的工作原理和配置方法:
• 理解了DNS的递归查询和迭代查询机制
• 掌握了Linux客户端DNS配置
• 对比了BIND9、Dnsmasq、CoreDNS等主流DNS软件
• 学会了BIND9主从DNS服务器的完整配置
• 掌握了Dnsmasq和CoreDNS的快速部署方法
觉得有用的话,转发给同事,一起学习!有问题评论区见~