从零开始:利用 BIND 构建和管理您的 DNS 服务器

[复制链接]
发表于 2026-2-2 18:53:59 | 显示全部楼层 |阅读模式
1 媒介

        在这篇文章中,我将具体先容怎样利用 BIND(Berkeley Internet Name Domain)软件包中的 named 步调来设置和管理一个根本的 DNS 服务器。
        从安装 BIND 开始,到设置 DNS 地域文件,再到运行和测试您的服务器,我会一步步引导您完成整个过程。
        这里我们来演示一下,怎样设置一个自界说域名如:fenglm.yy
2 BIND 和 named 简介

2.1 BIND 的作用

        BIND 是互联网上利用最广泛的 DNS 软件之一,它负责将域名转换为 IP 地点。
2.2 named 的脚色

        在 BIND 中,named 是一个保卫历程,负责处置处罚全部的 DNS 哀求。
3 安装 BIND

        这里我利用的是Rocky9.3操纵体系来给各人做一个实操演示,我们先来实行下面这个下令来安装bind👇
  1. sudo dnf install bind bind-utils
复制代码


验证是否安装乐成👇
  1. named -v
复制代码

安装乐成表现图

3.1 设置文件先容

        安装完成后,会天生一些bind干系的文件,这里我们必要关注的有两个目次下的文件
        (1)/etc/named.conf
        (2)/var/named
3.1.1 named.conf设置文件

        我们来通过sudo vim /etc/named.conf 下令检察一下这个设置文件,如下图所示👇

设置文件剖析👇
  1. # 监听设置
  2. options {
  3.     # 监听IPv4地址127.0.0.1上的53端口,这是DNS服务的标准端口。
  4.     listen-on port 53 { 127.0.0.1; };
  5.     # 监听IPv6地址::1(即IPv6的本地回环地址)上的53端口。
  6.     listen-on-v6 port 53 { ::1; };
  7.     # 指定存放区域文件和其他相关文件的目录。
  8.     directory "/var/named";
  9.     # 指定DNS缓存转储文件的位置。
  10.     dump-file "/var/named/data/cache_dump.db";
  11.     # 指定统计数据文件的存放位置。
  12.     statistics-file "/var/named/data/named_stats.txt";
  13.     # 指定内存统计数据文件的存放位置。
  14.     memstatistics-file "/var/named/data/named_mem_stats.txt";
  15.     # 指定安全根文件的存放位置。
  16.     secroots-file "/var/named/data/named.secroots";
  17.     # 指定递归查询数据文件的存放位置。
  18.     recursing-file "/var/named/data/named.recursing";
  19.     # 允许从localhost发起查询。
  20.     allow-query { localhost; };
  21.     # 关于服务器类型的说明。这里启用了递归查询,适用于递归或缓存DNS服务器。
  22.     recursion yes;
  23.     # 启用DNSSEC验证。
  24.     dnssec-validation yes;
  25.     # 指定动态密钥文件的存放目录。
  26.     managed-keys-directory "/var/named/dynamic";
  27.     # 指定GeoIP数据库文件的存放目录。
  28.     geoip-directory "/usr/share/GeoIP";
  29.     # 指定named进程PID文件的存放位置。
  30.     pid-file "/run/named/named.pid";
  31.     # 指定会话密钥文件的存放位置。
  32.     session-keyfile "/run/named/session.key";
  33.     # 引入加密策略配置文件。
  34.     include "/etc/crypto-policies/back-ends/bind.config";
  35. };
  36. # 日志日志设置
  37. logging {
  38.     # 定义一个日志日志通道
  39.     channel default_debug {
  40.         file "data/named.run"; # 日志日志文件位置
  41.         severity dynamic; # 动态日志级别
  42.     };
  43. };
  44. # 根区配置
  45. zone "." IN {
  46.     type hint; # 类型为“hint”,意味着这是根域的提示。
  47.     file "named.ca"; # 指向根域的文件。
  48. };
  49. # 引入其他配置文件
  50. include "/etc/named.rfc1912.zones"; # RFC1912推荐的区域文件。
  51. include "/etc/named.root.key"; # 根密钥文件,用于DNSSEC。
复制代码
3.1.2 /var/named目次文件


/var/named目次文件剖析
  1. 目录结构解析:
  2. - data
  3.   - 用途:存储BIND运行时生成的数据,如DNS查询日志和统计信息。
  4. - dynamic
  5.   - 用途:存放动态DNS更新的记录,用于DDNS服务。
  6. - named.ca
  7.   - 用途:根提示文件,包含根DNS服务器地址,用于互联网DNS解析。
  8. - named.empty
  9.   - 用途:空的DNS区域文件,用于特殊配置。
  10. - named.localhost
  11.   - 用途:定义`localhost`的DNS记录,包含本地回环地址。
  12. - named.loopback
  13.   - 用途:用于定义回环地址的DNS区域,通常用于DNS服务器内部查询。
  14. - slaves
  15.   - 用途:存放从主DNS服务器同步的区域文件,用于备份或辅助解析。
复制代码
4 开始设置named

   这个文件是 named 的主设置文件。它界说了服务器的运行参数,如监听的 IP 地点、日志文件位置等。
4.1 新增0.168.192.db

        在/var/named目次下新增0.168.192.db文件,设置如下👇

  1. $ORIGIN 0.168.192.in-addr.arpa.
  2. $TTL 86400
  3. @       IN      SOA     dns1.fenglm.yy.     hostmaster.fenglm.yy. (
  4.                         2001062501 ; serial
  5.                         21600      ; refresh after 6 hours
  6.                         3600       ; retry after 1 hour
  7.                         604800     ; expire after 1 week
  8.                         86400 )    ; minimum TTL of 1 day
  9. @       IN      NS      dns1.fenglm.yy.
  10. 163     IN      PTR     dns1.fenglm.yy.
  11. 163     IN      PTR    nginx.fenglm.yy.
复制代码
4.2 新增fenglm.yy.db


  1. $ORIGIN fenglm.yy.
  2. $TTL 86400
  3. @       IN      SOA     dns1.fenglm.yy.     hostmaster.fenglm.yy. (
  4.                         2001062501 ; serial
  5.                         21600      ; refresh after 6 hours
  6.                         3600       ; retry after 1 hour
  7.                         604800     ; expire after 1 week
  8.                         86400 )    ; minimum TTL of 1 day
  9.         IN      NS      dns1.fenglm.yy.
  10.         IN      NS      dns2.fenglm.yy.
  11. @       IN      A       192.168.0.163
  12. dns1    IN      A       192.168.0.163
  13. dns2    IN      A       192.168.0.163
  14. nginx   IN     A       192.168.0.163
  15. www     IN      CNAME   nginx
复制代码
4.3 修改named.conf

        修改后如下图所示


与原文件相比,我们紧张改动了以下内容👇
  1. listen-on port 53 {any;};
  2. allow-query     { any; };
  3. listen-on-v6 { none; };
  4. dnssec-validation no;
  5. zone "fenglm.yy" IN {
  6.         type master;
  7.         file "fenglm.yy.db";
  8.         allow-update { none;};
  9. };
  10. zone ".168.192.in-addr.arpa" IN {
  11.         type master;
  12.         file "0.168.192.db";
  13.         allow-update { none; };
  14. };
复制代码
        为了方便看到测试效果,我给各人安装个nginx演示一下,如允许以更直观查验实操效果。
这里我用的是docker-compose来安装nginx的,比力方便快捷,核心安装设置脚本如下👇
(1)docker-compose
  1. version: "3"
  2. services:
  3.   nginx:
  4.     image: nginx
  5.     volumes:
  6.       - ./nginx:/etc/nginx/templates
  7.       - ./nginx/html:/usr/share/nginx/html
  8.     ports:
  9.       - 80:80
  10.     environment:
  11.       - NGINX_HOST=fenglm.yy
  12.       - NGINX_PORT=80
  13.     restart: always
复制代码
(2)nginx设置文件
  1. ##
  2. # You should look at the following URL's in order to grasp a solid understanding
  3. # of Nginx configuration files in order to fully unleash the power of Nginx.
  4. # https://www.nginx.com/resources/wiki/start/
  5. # https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
  6. # https://wiki.debian.org/Nginx/DirectoryStructure
  7. #
  8. # In most cases, administrators will remove this file from sites-enabled/ and
  9. # leave it as reference inside of sites-available where it will continue to be
  10. # updated by the nginx packaging team.
  11. #
  12. # This file will automatically load configuration files provided by other
  13. # applications, such as Drupal or Wordpress. These applications will be made
  14. # available underneath a path with that package name, such as /drupal8.
  15. #
  16. # Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
  17. ##
  18. # Default server configuration
  19. #
  20. server {
  21.         listen 80;
  22.         listen [::]:80;
  23.         # SSL configuration
  24.         #
  25.         # listen 443 ssl default_server;
  26.         # listen [::]:443 ssl default_server;
  27.         #
  28.         # Note: You should disable gzip for SSL traffic.
  29.         # See: https://bugs.debian.org/773332
  30.         #
  31.         # Read up on ssl_ciphers to ensure a secure configuration.
  32.         # See: https://bugs.debian.org/765782
  33.         #
  34.         # Self signed certs generated by the ssl-cert package
  35.         # Don't use them in a production server!
  36.         #
  37.         # include snippets/snakeoil.conf;
  38.         server_name nginx.fenglm.yy;
  39.         location / {
  40.                 proxy_set_header X-Forwarded-Host $host;
  41.                 proxy_set_header X-Forwarded-Server $host;
  42.                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  43.                 proxy_pass http://nginx:80;
  44.                 client_max_body_size 50M;
  45.         }
  46.         # pass PHP scripts to FastCGI server
  47.         #
  48.         #location ~ \.php$ {
  49.         #        include snippets/fastcgi-php.conf;
  50.         #
  51.         #        # With php-fpm (or other unix sockets):
  52.         #        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
  53.         #        # With php-cgi (or other tcp sockets):
  54.         #        fastcgi_pass 127.0.0.1:9000;
  55.         #}
  56.         # deny access to .htaccess files, if Apache's document root
  57.         # concurs with nginx's one
  58.         #
  59.         #location ~ /\.ht {
  60.         #        deny all;
  61.         #}
  62. }
  63. # Virtual Host configuration for example.com
  64. #
  65. # You can move that to a different file under sites-available/ and symlink that
  66. # to sites-enabled/ to enable it.
  67. #
  68. #server {
  69. #        listen 80;
  70. #        listen [::]:80;
  71. #
  72. #        server_name example.com;
  73. #
  74. #        root /var/www/example.com;
  75. #        index index.html;
  76. #
  77. #        location / {
  78. #                try_files $uri $uri/ =404;
  79. #        }
  80. #}
复制代码
        那么核心设置文件有了,如果会利用docker-compose的话,信托安装也是肯定没有题目的,这里就不多做阐明白。
安装完成后的效果如下图👇 

然后我们向html目次中放一张图片66.png,以便一会我们来做效果演示
预备工作都做完了,接下来我们还要举行最关键的一步,那就是运行和测试named啦~_~
5 运行和测试named

5.1 启动named服务

  1. sudo systemctl start named.service
复制代码

        上图演示一下启动后如果报错了该怎样检察错误日志,这里我们看到错误日志中表现的紧张题目是:_default/0.168.192.in-addr.arpa/IN: permission denied
5.1.1 排错1:查抄地域文件的准确性

  1. named-checkzone 0.168.192.in-addr.arpa 0.168.192.db
复制代码

5.1.2 排错2:查抄named主设置文件的准确性

  1. named-checkconf /etc/named.conf
复制代码

5.1.3 排错3:从文件权限入手


        通过上图我们发现文件的全部者是flmtest用户,而不是named,意料题目大概是出在这里,现在我们来更改一下文件的全部者,实行如下下令
  1. sudo chown named:named /var/named/0.168.192.db
  2. sudo chown named:named /var/named/fenglm.yy.db
复制代码

        确保named用户对该文件具有读权限。通常,地域文件的保举权限是640(即全部者有读写权限,组有读权限),可以利用chmod下令设置👇
  1. sudo chmod 640 /var/named/0.168.192.db
  2. sudo chmod 640 /var/named/fenglm.yy.db
复制代码
5.1.4 排错4:查抄SELinux状态

        如果上面的方法都办理不了题目,那么这一步将是你办理报错题目的关键步调,我们可以暂时关闭SELinux看看是否可办理题目

如上图所示,果然是SElinux的题目

        之前的文章中我有提到,SELinux 是一个强盛的安全工具,它可以防止很多范例的弊端和攻击,因此,不发起永世禁用 SELinux,以是这里我就来演示一下不关闭SELinux的环境下我们要怎么去办理这个报错题目。
        我们也可以通过下面下令检察SELinux日志来确认SELinux是否确实是导致权限题目的缘故原由
  1. sudo ausearch -m avc -c named | audit2why
复制代码

        如果SELinux确实是导致题目的缘故原由,我们必要更新受影响文件的SELinux上下文,以便named服务可以大概访问它们,可以利用semanage为文件添加准确的上下文规则👇
  1. sudo semanage fcontext -a -t named_zone_t "/var/named/fenglm.yy.db"
复制代码
        然后,利用restorecon应用这些更改👇
  1. sudo restorecon -v /var/named/fenglm.yy.db
复制代码
        再重新运行一下named服务,这时我们发现题目已包办理了✌

测试一下我们DNS服务器设置的域名是否剖析乐成👇
  1. sudo dig @localhost nginx.fenglm.yy
复制代码

剖析乐成啦

        好,那接下来我们利用该域名访问一下我们之前上传的66.png图片,起首我们要先在客户端呆板上设置一下DNS,如下图所示👇

然后我们用cmd下令验证一下,发现如下题目👇

        这时我们必要查抄一下我们的防火墙,如果防火墙正处于开启状态,则必要确保防火墙规则允许 DNS 流量,由于DNS 利用的是 UDP 和 TCP 协议的 53 端口,咱放开53端口👇
  1. firewall-cmd --zone=public --add-port=53/tcp --permanent
  2. firewall-cmd --zone=public --add-port=53/udp --permanent
复制代码
重载防火墙设置,以更改收效👇
  1. firewall-cmd --reload
复制代码
        然后我们再来测试一下,发现没有题目了,这个时间我们就可以利用我们设置好的自界说域名来访问我们nginx中预先放置好的66.png图片了

题目全部办理✌

5.2 欣赏器访问检察运行效果

5.2.1 IP直接访问👇

http://192.168.0.163/66.png

 5.2.2 通过自界说域名访问👇

http://nginx.fenglm.yy/66.png

        也可以如许http://www.fenglm.yy/66.png访问哦✌,由于我们做了干系的设置,忘了的小同伴可以往上翻,看看我们之前设置文件中是咋配的!

        至此,我们已经对 BIND 和 named 的底子用法做了细致的叙述。这些内容应当充足作为各人的入门学习参考。随着我在这个范畴不停深入研究,我渴望在未来可以大概探索并分享 BIND 的更多高级特性。敬请各人一连关注,更多出色内容即将出现!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表