当前位置:首页>Linux>公司网络又上不去?Linux DNS服务配置与实战一篇搞懂

公司网络又上不去?Linux DNS服务配置与实战一篇搞懂

  • 2026-10-11 07:46:20
公司网络又上不去?Linux DNS服务配置与实战一篇搞懂
   

       做运维这些年,我见过太多因为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的快速部署方法

       觉得有用的话,转发给同事,一起学习!有问题评论区见~    

最新文章

随机文章