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 ; 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
$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
修改后如下图所示
与原文件相比,我们主要改动了以下内容👇
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: 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配置文件
##
# 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 的更多高级特性。敬请大家持续关注,更多精彩内容即将呈现!