0

0

如何在Linux系统中配置DNS服务器?使用BIND实现域名解析的指南

看不見的法師

看不見的法師

发布时间:2025-09-07 12:07:01

|

1712人浏览过

|

来源于php中文网

原创

安装并配置BIND DNS服务器需先安装bind9或bind软件包,再编辑named.conf.options设置全局参数如监听地址、允许查询范围及转发规则,接着在named.conf.local中定义正向与反向解析区域,创建对应的区域文件并配置SOA、NS、A、PTR等记录,每次修改后递增Serial号,最后通过named-checkconf和named-checkzone验证配置,启动服务并开放防火墙53端口,使用dig、nslookup等工具测试解析结果,同时配置allow-query、allow-recursion、allow-transfer等安全策略限制访问,启用DNSSEC增强安全性,确保服务稳定可靠。

如何在linux系统中配置dns服务器?使用bind实现域名解析的指南

在Linux系统中搭建一个DNS服务器,最常见且功能强大的选择就是使用BIND(Berkeley Internet Name Domain)。它能让你完全掌控域名解析过程,无论是为内部网络提供服务,还是作为权威服务器对外发布域名信息,BIND都是一个可靠的基石。在我看来,掌握BIND的配置,就像是掌握了互联网世界里的一把钥匙,能够更深入地理解网络运作的底层逻辑。

解决方案

配置BIND DNS服务器主要涉及安装软件包、编辑主配置文件、创建区域文件以及启动并测试服务。这个过程虽然有些步骤,但只要跟着逻辑走,并不复杂。

首先,你需要在你的Linux发行版上安装BIND软件包。对于基于Debian的系统(如Ubuntu),通常是

bind9

sudo apt update
sudo apt install bind9 bind9utils bind9-doc

对于基于RPM的系统(如CentOS/RHEL),则是

bind

sudo yum install bind bind-utils

安装完成后,BIND的主要配置文件通常位于

/etc/bind/
(Debian/Ubuntu)或
/etc/named.conf
(CentOS/RHEL)。核心的配置文件是
named.conf
,但为了模块化和管理方便,它通常会包含其他文件,比如
named.conf.options
(全局选项)和
named.conf.local
(本地区域定义)。

我会先从

named.conf.options
入手,配置一些全局性的设置。例如,指定DNS服务器监听的IP地址和端口,以及转发查询的DNS服务器。

// /etc/bind/named.conf.options (示例)
options {
    directory "/var/cache/bind"; // 缓存和日志文件存放路径

    // 如果你的服务器有多个IP,这里可以指定监听哪个IP
    listen-on port 53 { any; }; // 监听所有IP的53端口
    listen-on-v6 port 53 { any; }; // 监听所有IPv6地址的53端口

    // 允许哪些客户端查询
    allow-query { any; }; 

    // 转发查询到上游DNS服务器,例如Google的公共DNS
    forwarders {
        8.8.8.8;
        8.8.4.4;
    };
    forward only; // 只转发,不自己解析

    dnssec-validation auto; // 启用DNSSEC验证,提高安全性

    // 其他一些安全和性能相关的选项
    auth-nxdomain no;    # conform to RFC1035
    max-cache-size 90%; // 限制缓存大小
    recursion yes; // 允许递归查询
};

接下来是定义本地区域,这通常在

named.conf.local
中完成。这里我们将定义你的域名(正向解析)和IP地址(反向解析)如何映射。

// /etc/bind/named.conf.local (示例)
zone "yourdomain.com" IN {
    type master;
    file "/etc/bind/db.yourdomain.com"; // 正向解析文件
    allow-update { none; };
};

// 反向解析,假设你的内网IP段是192.168.1.0/24
zone "1.168.192.in-addr.arpa" IN {
    type master;
    file "/etc/bind/db.192.168.1"; // 反向解析文件
    allow-update { none; };
};

然后,你需要创建这些区域文件。例如,

/etc/bind/db.yourdomain.com

$TTL 604800
@ IN SOA ns1.yourdomain.com. admin.yourdomain.com. (
    2023102701 ; Serial
    604800     ; Refresh
    86400      ; Retry
    2419200    ; Expire
    604800 )   ; Negative Cache TTL

@       IN      NS      ns1.yourdomain.com.
@       IN      A       192.168.1.100 ; 你的主服务器IP

ns1     IN      A       192.168.1.100
www     IN      A       192.168.1.101
mail    IN      A       192.168.1.102

/etc/bind/db.192.168.1

$TTL 604800
@ IN SOA ns1.yourdomain.com. admin.yourdomain.com. (
    2023102701 ; Serial
    604800     ; Refresh
    86400      ; Retry
    2419200    ; Expire
    604800 )   ; Negative Cache TTL

@       IN      NS      ns1.yourdomain.com.

100     IN      PTR     ns1.yourdomain.com.
101     IN      PTR     www.yourdomain.com.
102     IN      PTR     mail.yourdomain.com.

最后,检查配置文件的语法,启动并启用BIND服务,并确保防火墙允许53端口的UDP/TCP流量。

sudo named-checkconf
sudo named-checkzone yourdomain.com /etc/bind/db.yourdomain.com
sudo systemctl start bind9 # 或 named
sudo systemctl enable bind9 # 或 named
sudo ufw allow 53/udp
sudo ufw allow 53/tcp

BIND DNS服务器的安装与核心配置步骤是什么?

安装BIND,就像是给你的Linux系统装上了一套“域名翻译器”。我个人觉得,这个步骤是所有后续工作的基础,虽然看似简单,但不同发行版下的包名和管理方式略有差异,得留意一下。

在Debian/Ubuntu系系统上,通常用

apt
来搞定:

sudo apt update
sudo apt install bind9 bind9utils

bind9utils
这个包里包含了一些非常有用的工具,比如
dig
nslookup
named-checkconf
,它们在后续的测试和故障排除中会频繁用到。

安装完成后,核心的配置工作就围绕着

/etc/bind/
(Debian/Ubuntu)或
/etc/named.conf
(CentOS/RHEL)目录展开了。我的经验是,不要直接去改动
named.conf
主文件,它通常会通过
include
语句引入其他配置文件,这样做的好处是结构清晰,方便管理。

  1. named.conf.options
    :全局设置 这个文件掌管着BIND服务器的“脾气秉性”,比如它监听哪个IP地址、是否允许递归查询、要不要转发查询到上游DNS服务器等等。

    // /etc/bind/named.conf.options
    options {
        directory "/var/cache/bind"; // BIND的工作目录,日志、缓存文件都在这
    
        // 监听地址,如果你的服务器有多个网卡或IP,这里可以精细控制
        listen-on port 53 { 127.0.0.1; 192.168.1.100; }; // 监听本地和内网IP
        listen-on-v6 { none; }; // 如果不需要IPv6,可以关闭
    
        allow-query { 127.0.0.1; 192.168.1.0/24; }; // 允许哪些客户端查询,非常重要!
        allow-recursion { 127.0.0.1; 192.168.1.0/24; }; // 允许哪些客户端发起递归查询
    
        // 如果你的DNS服务器需要把无法解析的请求转发给外部DNS,这里设置
        forwarders {
            208.67.222.222; // OpenDNS
            1.1.1.1;        // Cloudflare
        };
        forward only; // 强制只转发,不自己尝试解析
    
        dnssec-enable yes;
        dnssec-validation auto; // 启用DNSSEC验证,增强安全性
    
        // 其他一些默认或推荐的设置
        recursion yes;
        pid-file "/run/named/named.pid";
        dump-file "/var/cache/bind/cache_dump.db";
        statistics-file "/var/cache/bind/named.stats";
        memstatistics-file "/var/cache/bind/named.memstats";
        channel "default_logging" {
            severity info;
            print-category yes;
            print-severity yes;
            print-time yes;
            file "/var/log/named/named.log" versions 3 size 5m;
        };
        logging {
            category queries { default_logging; };
            category default { default_logging; };
        };
    };

    这里特别要提一下

    allow-query
    allow-recursion
    ,这是你DNS服务器的“门卫”,务必配置好,不然你的服务器可能被滥用,甚至成为DDoS攻击的一部分。

    快剪辑
    快剪辑

    国内⼀体化视频⽣产平台

    下载
  2. named.conf.local
    :定义区域 这个文件是你定义“你的地盘”的地方,也就是你负责解析哪些域名,以及这些域名对应的IP地址。

    // /etc/bind/named.conf.local
    // 正向解析区域:将域名解析为IP地址
    zone "internal.lan" IN {
        type master; // 这是主DNS服务器
        file "/etc/bind/db.internal.lan"; // 区域数据文件路径
        allow-update { none; }; // 不允许动态更新,更安全
        allow-transfer { 192.168.1.200; }; // 允许备用DNS服务器同步区域数据
    };
    
    // 反向解析区域:将IP地址解析为域名
    // 注意:这里的区域名是IP段倒序加.in-addr.arpa
    zone "1.168.192.in-addr.arpa" IN {
        type master;
        file "/etc/bind/db.192.168.1";
        allow-update { none; };
        allow-transfer { 192.168.1.200; };
    };
  3. 区域文件(Zone Files):实际的映射数据 这些文件是DNS服务器的核心数据,包含了域名和IP地址的实际映射关系。它们通常放在

    /etc/bind/
    目录下。

    • 正向解析文件 (

      db.internal.lan
      ):

      $TTL 604800 ; 默认TTL,客户端缓存记录的时间
      @ IN SOA ns1.internal.lan. admin.internal.lan. (
          2023102702 ; Serial - 每次修改区域文件后都要递增,非常重要!
          604800     ; Refresh - 备用DNS多久检查一次主DNS更新
          86400      ; Retry - 如果刷新失败,多久重试
          2419200    ; Expire - 备用DNS多久后放弃区域数据
          604800 )   ; Negative Cache TTL - 负面缓存时间
      
      @       IN      NS      ns1.internal.lan. ; 声明本区域的DNS服务器
      ns1     IN      A       192.168.1.100     ; ns1服务器的IP
      
      server1 IN      A       192.168.1.101
      web     IN      A       192.168.1.102
      vpn     IN      A       192.168.1.103
    • 反向解析文件 (

      db.192.168.1
      ):

      $TTL 604800
      @ IN SOA ns1.internal.lan. admin.internal.lan. (
          2023102702 ; Serial - 同样需要递增
          604800
          86400
          2419200
          604800 )
      
      @       IN      NS      ns1.internal.lan.
      
      100     IN      PTR     ns1.internal.lan.
      101     IN      PTR     server1.internal.lan.
      102     IN      PTR     web.internal.lan.
      103     IN      PTR     vpn.internal.lan.

      记住,每次修改区域文件后,一定要增加SOA记录中的Serial号,否则备用DNS服务器或其他缓存DNS可能不会更新你的记录。我以前就犯过这个错误,导致更新不生效,排查了半天才发现是Serial没改。

如何配置正向与反向解析区域,并确保其安全运行?

配置正向和反向解析区域是BIND服务器的核心功能,这决定了你的DNS服务器能“认识”哪些域名和IP。在我看来,理解这两个概念以及它们的文件结构,是掌握BIND的关键一步。

正向解析区域(Forward Zone): 这是最常见的DNS功能,将域名(如

www.example.com
)解析成IP地址(如
192.168.1.100
)。

  1. named.conf.local
    中声明区域:

    zone "yourcompany.local" IN {
        type master; // 表明这是该区域的主服务器
        file "/etc/bind/db.yourcompany.local"; // 指向实际的区域数据文件
        allow-update { none; }; // 强烈建议设置为none,除非你有动态DNS需求
        // 如果有从服务器(slave),需要配置allow-transfer
        // allow-transfer { 192.168.1.20; };
    };
  2. 创建区域数据文件(

    /etc/bind/db.yourcompany.local
    ):

    $TTL 86400 ; 默认生存时间,单位秒
    @ IN SOA ns1.yourcompany.local. admin.yourcompany.local. (
        2023102703 ; Serial: 每次修改后递增
        10800      ; Refresh: 从服务器多久检查更新
        3600       ; Retry: 更新失败后多久重试
        604800     ; Expire: 从服务器多久后放弃区域数据
        86400 )    ; Negative Cache TTL: 负面缓存时间
    
    @       IN      NS      ns1.yourcompany.local. ; 声明本区域的权威DNS服务器
    ns1     IN      A       192.168.1.100          ; ns1服务器的IP地址
    
    server-app IN   A       192.168.1.101
    server-db  IN   A       192.168.1.102
    intranet   IN   CNAME   server-app             ; CNAME记录,别名

    这里有几个关键点:

    • SOA
      记录:Start Of Authority,一个区域的起始点,包含区域的元数据。
      Serial
      号每次修改区域文件后必须递增,否则从服务器不会同步更新。
    • NS
      记录:Name Server,指定哪些服务器是该区域的权威DNS。
    • A
      记录:Address,将域名映射到IPv4地址。
    • CNAME
      记录:Canonical Name,为现有域名创建别名。

反向解析区域(Reverse Zone): 反向解析将IP地址(如

192.168.1.101
)解析成域名(如
server-app.yourcompany.local
)。这对于日志分析、邮件服务器的反垃圾邮件检查等场景非常有用。

  1. named.conf.local
    中声明区域: 区域名是IP地址段倒序加上
    .in-addr.arpa
    。例如,
    192.168.1.0/24
    的区域名就是
    1.168.192.in-addr.arpa

    zone "1.168.192.in-addr.arpa" IN {
        type master;
        file "/etc/bind/db.192.168.1";
        allow-update { none; };
        // allow-transfer { 192.168.1.20; };
    };
  2. 创建区域数据文件(

    /etc/bind/db.192.168.1
    ):

    $TTL 86400
    @ IN SOA ns1.yourcompany.local. admin.yourcompany.local. (
        2023102703 ; Serial
        10800
        3600
        604800
        86400 )
    
    @       IN      NS      ns1.yourcompany.local.
    
    100     IN      PTR     ns1.yourcompany.local.       ; IP的最后一位映射到域名
    101     IN      PTR     server-app.yourcompany.local.
    102     IN      PTR     server-db.yourcompany.local.

    PTR
    记录:Pointer,用于反向解析,将IP地址的最后一位映射到完整的域名。

确保安全运行: DNS服务器是网络基础设施的关键组成部分,其安全性不容忽视。

  • 最小权限原则:
    allow-query
    allow-recursion
    named.conf.options
    中务必配置好,只允许你信任的客户端进行查询或递归查询。我通常会把它们限制在内网IP段,避免服务器被外部滥用。
  • 区域传输限制:
    allow-transfer
    用于控制哪些IP可以从你的主DNS服务器同步区域数据。如果你没有从服务器,直接设置为
    none
    。即使有从服务器,也只允许其IP地址。
  • 关闭不必要的递归: 如果你的DNS服务器只作为权威服务器,不为客户端提供递归查询服务,那么可以在
    named.conf.options
    中设置
    recursion no;
  • DNSSEC: 启用DNSSEC(
    dnssec-enable yes; dnssec-validation auto;
    )可以有效防止DNS缓存投毒等攻击,虽然配置略复杂,但对于对外提供服务的DNS服务器来说,这是非常推荐的。
  • 防火墙: 确保只有53端口(UDP和TCP)对必要的用户开放。UDP用于标准查询,TCP用于区域传输和DNSSEC。
  • 日志监控 配置详细的日志记录,并定期检查日志文件,以便及时发现异常活动。
  • 定期更新: 保持BIND软件包及其运行的操作系统最新,修补已知漏洞。

DNS服务器配置完成后,如何进行有效测试与故障排除?

配置好DNS服务器后,测试是必不可少的一步,它能帮你确认所有设置是否按预期工作。我发现,很多时候问题并非出在配置本身,而是出在一些细节,比如防火墙规则、文件权限,甚至是简单的拼写错误。

有效测试:

  1. 检查BIND服务状态: 这是最基础的检查,确保BIND进程正在运行。

    sudo systemctl status bind9 # 或 named

    如果服务没有运行,查看日志文件(通常是

    /var/log/syslog
    /var/log/messages
    ,或者你自定义的BIND日志文件)来获取错误信息。

  2. 配置文件语法检查: BIND提供了一些工具来检查配置文件的语法错误。

    • named-checkconf
      检查
      named.conf
      及其包含的所有文件的语法。
      sudo named-checkconf

      如果没有输出,说明语法正确。如果有错误,它会指出具体的文件和

相关专题

更多
tcp和udp的区别
tcp和udp的区别

TCP和UDP的区别,在连接性、可靠性、速度和效率、数据报大小以及适用场景等方面。本专题为大家提供tcp和udp的区别的相关的文章、下载、课程内容,供大家免费下载体验。

119

2023.07.25

udp是什么协议
udp是什么协议

UDP是OSI参考模型中一种无连接的传输层协议。本专题为大家带来udp是什么协议的相关文章,免费提供给大家。

282

2023.08.08

tcp和udp有什么区别
tcp和udp有什么区别

tcp和udp的区别有:1、udp是无连接的,tcp是面向连接的;2、udp是不可靠传输,tcp是可靠传输;3、udp是面向报文传输,tcp是面向字节流传输。想了解更多tcp相关的内容,可阅读本专题下面的相关文章。

374

2024.11.14

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1348

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

701

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

776

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

572

2023.07.06

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

9

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 4.5万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.3万人学习

Git 教程
Git 教程

共21课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号