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

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👇

sudo dnf install bind bind-utils

验证是否安装成功👇

named -v

安装成功示意图

3.1 配置文件介绍

        安装完成后,会生成一些bind相关的文件,这里我们需要关注的有两个目录下的文件

        (1)/etc/named.conf

        (2)/var/named

3.1.1 named.conf配置文件

        我们来通过sudo vim /etc/named.conf 命令查看一下这个配置文件,如下图所示👇

配置文件解析👇

# 监听设置
options {# 监听IPv4地址127.0.0.1上的53端口,这是DNS服务的标准端口。listen-on port 53 { 127.0.0.1; };# 监听IPv6地址::1(即IPv6的本地回环地址)上的53端口。listen-on-v6 port 53 { ::1; };# 指定存放区域文件和其他相关文件的目录。directory "/var/named";# 指定DNS缓存转储文件的位置。dump-file "/var/named/data/cache_dump.db";# 指定统计数据文件的存放位置。statistics-file "/var/named/data/named_stats.txt";# 指定内存统计数据文件的存放位置。memstatistics-file "/var/named/data/named_mem_stats.txt";# 指定安全根文件的存放位置。secroots-file "/var/named/data/named.secroots";# 指定递归查询数据文件的存放位置。recursing-file "/var/named/data/named.recursing";# 允许从localhost发起查询。allow-query { localhost; };# 关于服务器类型的说明。这里启用了递归查询,适用于递归或缓存DNS服务器。recursion yes;# 启用DNSSEC验证。dnssec-validation yes;# 指定动态密钥文件的存放目录。managed-keys-directory "/var/named/dynamic";# 指定GeoIP数据库文件的存放目录。geoip-directory "/usr/share/GeoIP";# 指定named进程PID文件的存放位置。pid-file "/run/named/named.pid";# 指定会话密钥文件的存放位置。session-keyfile "/run/named/session.key";# 引入加密策略配置文件。include "/etc/crypto-policies/back-ends/bind.config";
};# 日志设置
logging {# 定义一个日志通道channel default_debug {file "data/named.run"; # 日志文件位置severity dynamic; # 动态日志级别};
};# 根区配置
zone "." IN {type hint; # 类型为“hint”,意味着这是根域的提示。file "named.ca"; # 指向根域的文件。
};# 引入其他配置文件
include "/etc/named.rfc1912.zones"; # RFC1912推荐的区域文件。
include "/etc/named.root.key"; # 根密钥文件,用于DNSSEC。

3.1.2 /var/named目录文件

/var/named目录文件解析

目录结构解析:- data- 用途:存储BIND运行时生成的数据,如DNS查询日志和统计信息。- dynamic- 用途:存放动态DNS更新的记录,用于DDNS服务。- named.ca- 用途:根提示文件,包含根DNS服务器地址,用于互联网DNS解析。- named.empty- 用途:空的DNS区域文件,用于特殊配置。- named.localhost- 用途:定义`localhost`的DNS记录,包含本地回环地址。- named.loopback- 用途:用于定义回环地址的DNS区域,通常用于DNS服务器内部查询。- slaves- 用途:存放从主DNS服务器同步的区域文件,用于备份或辅助解析。

4 开始配置named

   这个文件是 named 的主配置文件。它定义了服务器的运行参数,如监听的 IP 地址、日志文件位置等。

4.1 新增0.168.192.db

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


$ORIGIN 0.168.192.in-addr.arpa.
$TTL 86400
@       IN      SOA     dns1.fenglm.yy.     hostmaster.fenglm.yy. (2001062501 ; serial21600      ; refresh after 6 hours3600       ; retry after 1 hour604800     ; expire after 1 week86400 )    ; minimum TTL of 1 day@       IN      NS      dns1.fenglm.yy.
163     IN      PTR     dns1.fenglm.yy.163     IN      PTR    nginx.fenglm.yy.

4.2 新增fenglm.yy.db

$ORIGIN fenglm.yy.
$TTL 86400
@       IN      SOA     dns1.fenglm.yy.     hostmaster.fenglm.yy. (2001062501 ; serial21600      ; refresh after 6 hours3600       ; retry after 1 hour604800     ; expire after 1 week86400 )    ; minimum TTL of 1 dayIN      NS      dns1.fenglm.yy.IN      NS      dns2.fenglm.yy.@       IN      A       192.168.0.163
dns1    IN      A       192.168.0.163
dns2    IN      A       192.168.0.163nginx   IN     A       192.168.0.163www     IN      CNAME   nginx

4.3 修改named.conf

        修改后如下图所示

与原文件相比,我们主要改动了以下内容👇

listen-on port 53 {any;};allow-query     { any; };listen-on-v6 { none; };dnssec-validation no;zone "fenglm.yy" IN {type master;file "fenglm.yy.db";allow-update { none;};
};zone ".168.192.in-addr.arpa" IN {type master;file "0.168.192.db";allow-update { none; };
};

        为了方便看到测试效果,我给大家安装个nginx演示一下,这样可以更直观检验实操效果。

这里我用的是docker-compose来安装nginx的,比较方便快捷,核心安装配置脚本如下👇

(1)docker-compose

version: "3"
services:nginx:image: nginxvolumes:- ./nginx:/etc/nginx/templates- ./nginx/html:/usr/share/nginx/htmlports:- 80:80environment:- NGINX_HOST=fenglm.yy- NGINX_PORT=80restart: always

(2)nginx配置文件

##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by other
# applications, such as Drupal or Wordpress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
### Default server configuration
#
server {listen 80;listen [::]:80;# SSL configuration## listen 443 ssl default_server;# listen [::]:443 ssl default_server;## Note: You should disable gzip for SSL traffic.# See: https://bugs.debian.org/773332## Read up on ssl_ciphers to ensure a secure configuration.# See: https://bugs.debian.org/765782## Self signed certs generated by the ssl-cert package# Don't use them in a production server!## include snippets/snakeoil.conf;server_name nginx.fenglm.yy;location / {proxy_set_header X-Forwarded-Host $host;proxy_set_header X-Forwarded-Server $host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://nginx:80;client_max_body_size 50M;}# pass PHP scripts to FastCGI server##location ~ \.php$ {#	include snippets/fastcgi-php.conf;##	# With php-fpm (or other unix sockets):#	fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;#	# With php-cgi (or other tcp sockets):#	fastcgi_pass 127.0.0.1:9000;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {#	deny all;#}
}# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
#	listen 80;
#	listen [::]:80;
#
#	server_name example.com;
#
#	root /var/www/example.com;
#	index index.html;
#
#	location / {
#		try_files $uri $uri/ =404;
#	}
#}

        那么核心配置文件有了,如果会使用docker-compose的话,相信安装也是肯定没有问题的,这里就不多做说明了。

安装完成后的效果如下图👇 

然后我们向html目录中放一张图片66.png,以便一会我们来做效果演示

准备工作都做完了,接下来我们还要进行最关键的一步,那就是运行和测试named啦~_~

5 运行和测试named

5.1 启动named服务

sudo systemctl start named.service

        上图演示一下启动后如果报错了该如何查看错误日志,这里我们看到错误日志中显示的主要问题是:_default/0.168.192.in-addr.arpa/IN: permission denied

5.1.1 排错1:检查区域文件的正确性

named-checkzone 0.168.192.in-addr.arpa 0.168.192.db

5.1.2 排错2:检查named主配置文件的正确性

named-checkconf /etc/named.conf

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

        通过上图我们发现文件的所有者是flmtest用户,而不是named,猜想问题可能是出在这里,现在我们来更改一下文件的所有者,执行如下命令

sudo chown named:named /var/named/0.168.192.db
sudo chown named:named /var/named/fenglm.yy.db

        确保named用户对该文件具有读权限。通常,区域文件的推荐权限是640(即所有者有读写权限,组有读权限),可以使用chmod命令设置👇

sudo chmod 640 /var/named/0.168.192.db
sudo chmod 640 /var/named/fenglm.yy.db

5.1.4 排错4:检查SELinux状态

        如果上面的方法都解决不了问题,那么这一步将是你解决报错问题的关键步骤,我们可以临时关闭SELinux看看是否可解决问题

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

        之前的文章中我有提到,SELinux 是一个强大的安全工具,它可以防止许多类型的漏洞和攻击,因此,不建议永久禁用 SELinux,所以这里我就来演示一下不关闭SELinux的情况下我们要怎么去解决这个报错问题。

        我们也可以通过下面命令查看SELinux日志来确认SELinux是否确实是导致权限问题的原因

sudo ausearch -m avc -c named | audit2why

        如果SELinux确实是导致问题的原因,我们需要更新受影响文件的SELinux上下文,以便named服务能够访问它们,可以使用semanage为文件添加正确的上下文规则👇

sudo semanage fcontext -a -t named_zone_t "/var/named/fenglm.yy.db"

        然后,使用restorecon应用这些更改👇

sudo restorecon -v /var/named/fenglm.yy.db

        再重新运行一下named服务,这时我们发现问题已经解决了✌

测试一下我们DNS服务器配置的域名是否解析成功👇

sudo dig @localhost nginx.fenglm.yy

解析成功啦

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

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

        这时我们需要检查一下我们的防火墙,如果防火墙正处于开启状态,则需要确保防火墙规则允许 DNS 流量,因为DNS 使用的是 UDP 和 TCP 协议的 53 端口,咱放开53端口👇

firewall-cmd --zone=public --add-port=53/tcp --permanent
firewall-cmd --zone=public --add-port=53/udp --permanent

重载防火墙配置,以更改生效👇

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 的更多高级特性。敬请大家持续关注,更多精彩内容即将呈现!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/586237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 19c OCP 1z0 082考场真题解析第17题

考试科目:1Z0-082 考试题量:90 通过分数:60% 考试时间:150min 本文为云贝教育郭一军guoyJoe原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。 17. Which three …

通过数字证书对PDF电子文件进行数字签名/盖章

以下代码详细说明如何使用数字证书对PDF电子文件进行数字签名/盖章。PDF文件签署主要传递PDF文件,数字证书信息,签章图片3个信息。代码中需要的文件、数字证书、签章图片可访问开放签电子签章开源系统详细了解系统的实现与效果。也可通过gitee开源社区下…

AQS之ReentrantReadWriteLock

AQS之ReentrantReadWriteLock 一. 归纳总结 ReentrantReadWriteLock适合读多写少的场景。是可重入的读写锁实现类。其中, 写锁是独占的,读锁是共享的。 支持锁降级(持有写锁、获取读锁,最后释放写锁的过程) 锁降级可以帮助我们…

2023-12-30 msys2的python包降级

点击 <C 语言编程核心突破> 快速C语言入门 msys2的python包降级 前言总结 前言 要解决问题: 调大模型, 要用python, 需要numpy安装pip结果是升级了, 对不上当前py版本, 啥都装不了, 需要降级. 想到的思路: https://repo.msys2.org/mingw/clang64/ 下载对应包 使用命令…

oracle-存储结构

文件包括 控制文件.ctl、数据文件.dbf、日志文件.log这三类放在存储上。 参数文件&#xff1a;空间的划分&#xff0c;进程的选用&#xff08;.ora&#xff09; oracle启动的时候需要读一下&#xff0c;数据库启动后&#xff0c;参数文件并不关闭&#xff0c;但即使文件丢了&a…

Python生成器 (Generators in Python)

Generators in Python 文章目录 Generators in PythonIntroduction 导言贯穿全文的几句话为什么 Python 有生成器Generator&#xff1f;如何获得生成器Generator&#xff1f;1. 生成器表达式 Generator Expression2. 使用yield定义生成器Generator 更多Generator应用实例表示无…

车牌识别技术,如何用python识别车牌号

目录 一.前言 二.运行环境 三.代码 四.识别效果 五.参考 一.前言 车牌识别技术&#xff08;License Plate Recognition, LPR&#xff09;在交通计算机视觉&#xff08;Computer Vision, CV&#xff09;领域具有非常重要的研究意义。以下是该技术的一些扩展说明&#xff1…

Day20 222完全二叉树的节点个数 110平衡二叉树 257二叉树的所有路径

222 完全二叉树的结点个数 本题先不把它当成完全二叉树来看&#xff0c;用广度优先和深度优先搜索分别遍历&#xff0c;也能达到目的&#xff0c;只要将之前的代码稍加修改即可。注意后序遍历时的result要加上自身本身的那个结点。 //后序递归遍历 class Solution { public:in…

【AI】人工智能的未来

目录 一、人工智能的未来预测 二、可信人工智能 三、多模态预训练模型 四、基于人工智能的网络安全 五、边缘计算和联合学习 六、人机协作与交互 七、从大数据转向多样化小数据 八、人工智能伦理 一、人工智能的未来预测 从技术的发展角度看&#xff0c;人工智能&…

STL——集合算法

算法简介&#xff1a; set_intersection // 求两个容器的交集set_union // 求两个容器的并集set_difference // 求两个容器的差集 1.set_intersection 函数原型&#xff1a; set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);…

【办公技巧】怎么批量提取文件名到excel

Excel是大家经常用来制作表格的文件&#xff0c;比如输入文件名&#xff0c;如果有大量文件需要输入&#xff0c;用张贴复制或者手动输入的方式还是很费时间的&#xff0c;今天和大家分享如何批量提取文件名。 打开需要提取文件名的文件夹&#xff0c;选中所有文件&#xff0c…

iptables 防火墙(二)

目录 1. SNAT 策略及应用 1.1 SNAT策略概述 1. 只开启路由转发&#xff0c;未设置地址转换的情况 2. 开启路由转发&#xff0c;并设置SNAT转换的情况 1.2 SNAT策略的应用 1. 2.1 共享固定IP上网 &#xff08;1&#xff09;打开网关的路由转发 &#xff08;2&#xff09;…

SQL进阶:视图的增删改

上一节我们学习了子查询,这一节我们来了解下视图。这俩货很像。 当子查询很复杂,用的地方又多,为了提高重用率,就可以创建为视图。当然了,视图还有其他用处。 视图的用途 简化查询,这个上面已经提到了。 保护数据,可以通过视图来开放给用户指定的列,来缩小访问权限…

MongoDB 概念介绍

1、MongoDB 应用场景 传统的关系型数据库&#xff0c;在数据操作的"三高"需求以及应对Web2.0的网站需求面前&#xff0c;显得力不从心。 High performance -对数据库高并发读写的需求。Huge Storage -对海量数据的高效率存储和访问的需求。High Scalability &&…

servlet总结

目录 1.生命周期 2.线程总结 3.配置 4.请求和响应 5.会话管理 6.过滤和监听器 7.处理表单数据 8.与JSP集成 9.异常处理 10.安全性和认证 Servlet是一种基于Java的Web组件&#xff0c;用于处理客户端请求并生成动态Web内容。以下是关于Servlet的一些总结 1.生命周期 …

Java核心知识点1-java和c++区别、隐式和显示类型转换

java和c区别 java通过虚拟机实现跨平台特性&#xff0c;但c依赖于特定的平台。java没有指针&#xff0c;它的引用可以理解为安全指针&#xff0c;而c和c一样具有指针。java支持自动垃圾回收&#xff0c;而c需要手动回收。java不支持多重继承&#xff0c;只能通过实现多个接口来…

【PHP】函数array_intersect、array_diff:从数组中取出、去除指定的几个键值

1.从数组中取出 &#xff1a;array_intersect 要从数组中取出指定的几个键值&#xff0c;可以使用 array_intersect_key 函数。以下是一个示例&#xff1a; $array [name > John,age > 30,email > johnexample.com,city > New York ];$keys [name, email];$resu…

C++进阶--二叉树进阶(二叉搜索树)

二叉树进阶&#xff08;二叉搜索树&#xff09; 一、二叉搜索树1.1 二叉搜索树的概念 二、二叉搜索树的结构2.1 结点结构2.2 树结构 三、二叉搜索树的操作&#xff08;非递归&#xff09;3.1 二叉搜索树的插入3.2 二叉搜索树的查找3.3 二叉搜索树的中序遍历3.4 二叉搜索树的删除…

c++学习笔记-提高篇-STL-函数对象

目录 一、函数对象 二、函数对象使用 三、谓词 1、概念 2、一元谓词 3、二元谓词 插入一条sort函数源码 四、内建函数对象 1.基本概念 2、算数仿函数 3、关系仿函数 4、逻辑仿函数 一、函数对象 函数对象概念 &#xff08;1&#xff09;重载函数调用操作符的类&a…

WPF+Halcon 培训项目实战(11):HS组件封装

文章目录 前言相关链接项目专栏运行环境匹配图片封装组件新增类库项目选择依赖顺序并添加Nuget修改原本矩形方法运行结果&#xff1a; 对矩形进行抽象封装抽象基类矩形抽象改造 圆形抽象封装代码运行结果 前言 为了更好地去学习WPFHalcon&#xff0c;我决定去报个班学一下。原…