从零开始:使用 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👇

bash 复制代码
sudo dnf install bind bind-utils

验证是否安装成功👇

bash 复制代码
named -v

安装成功示意图

3.1 配置文件介绍

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

(1)/etc/named.conf

(2)/var/named

3.1.1 named.conf配置文件

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

配置文件解析👇

bash 复制代码
# 监听设置
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目录文件解析

bash 复制代码
目录结构解析:

- 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文件,配置如下👇

bash 复制代码
$ORIGIN 0.168.192.in-addr.arpa.
$TTL 86400
@       IN      SOA     dns1.fenglm.yy.     hostmaster.fenglm.yy. (
                        2001062501 ; serial
                        21600      ; refresh after 6 hours
                        3600       ; retry after 1 hour
                        604800     ; expire after 1 week
                        86400 )    ; 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

bash 复制代码
$ORIGIN fenglm.yy.
$TTL 86400
@       IN      SOA     dns1.fenglm.yy.     hostmaster.fenglm.yy. (
                        2001062501 ; serial
                        21600      ; refresh after 6 hours
                        3600       ; retry after 1 hour
                        604800     ; expire after 1 week
                        86400 )    ; minimum TTL of 1 day


        IN      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.163


nginx   IN     A       192.168.0.163

www     IN      CNAME   nginx

4.3 修改named.conf

修改后如下图所示

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

bash 复制代码
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

bash 复制代码
version: "3"
services:
  nginx:
    image: nginx
    volumes:
      - ./nginx:/etc/nginx/templates
      - ./nginx/html:/usr/share/nginx/html
    ports:
      - 80:80
    environment:
      - NGINX_HOST=fenglm.yy
      - NGINX_PORT=80
    restart: always

(2)nginx配置文件

bash 复制代码
##
# 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服务

bash 复制代码
sudo systemctl start named.service

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

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

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

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

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

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

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

bash 复制代码
sudo chown named:named /var/named/0.168.192.db
sudo chown named:named /var/named/fenglm.yy.db

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

bash 复制代码
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是否确实是导致权限问题的原因

bash 复制代码
sudo ausearch -m avc -c named | audit2why

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

bash 复制代码
sudo semanage fcontext -a -t named_zone_t "/var/named/fenglm.yy.db"

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

bash 复制代码
sudo restorecon -v /var/named/fenglm.yy.db

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

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

bash 复制代码
sudo dig @localhost nginx.fenglm.yy

解析成功啦

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

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

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

bash 复制代码
firewall-cmd --zone=public --add-port=53/tcp --permanent
firewall-cmd --zone=public --add-port=53/udp --permanent

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

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

相关推荐
谷雨不太卷几秒前
Linux_文件权限
linux·运维·服务器
无泪无花月隐星沉1 小时前
uos server 1070e lvm格式磁盘扩容分区
linux·运维·uos
食咗未2 小时前
Linux USB HOST EXTERNAL STORAGE
linux·驱动开发
食咗未2 小时前
Linux USB HOST HID
linux·驱动开发·人机交互
Xの哲學2 小时前
Linux SLAB分配器深度解剖
linux·服务器·网络·算法·边缘计算
齐鲁大虾3 小时前
UOS(统信操作系统)如何更新CUPS(通用Unix打印系统)
linux·服务器·chrome·unix
虾..4 小时前
Linux 简单日志程序
linux·运维·算法
huoxingwen4 小时前
Ubuntu 22.04 上 VMware Workstation 点击虚拟机窗口就消失的解决历程
linux·运维·ubuntu
姚青&5 小时前
Linux 常用命令之基本命令
linux·运维·服务器
一路往蓝-Anbo5 小时前
【第05期】数据的微观世界 (五) —— 浮点数 vs 定点数:MCU的数学课
linux·stm32·单片机·嵌入式硬件·物联网