网络服务器配置与管理教辅书 Help

4-2 搭建bind服务

这节实验有难度,因为DNS服务在WWW服务前,有些教材把DNS安排在前面。

介绍

Bind: (Berkely Internet Name Daemon)是一款最流行的域名解析服务软件,实现了DNS协议,伯克利公司出品。

场景:

  • 域名到公网IP: 平时上网和软件的各种请求,99%以上都是这种情况。

  • 域名到内网IP: 某公司需要搭建内部OA管理系统和文件共享服务,为了安全没有连互联网,为了避免IP地址好记,做一个域名到局域网IP的解析。

  • 反向解析: 自己的服务器被某些IP大量访问,反查这些ip是否是大公司的爬虫来判断是否有风险。

实验环境 试验设计

系统: centOS stream 8
软件: Bind9

我们一没有购买域名和云服务器,二为了研究底层实现软件Bind,因此无法进行真实的域名解析。

因此实验设计为本地进行,在CentOS虚拟机中安装Bind软件,
在配置文件中配置映射 假设为 apple.com ➡️ 11.22.33.44
当然,我们不是这个域名的所有者,几个亿也买不到。
因此禁用掉客户端操作系统默认的DNS114.114.114.1148.8.8.8 ,修改为127.0.0.1 ,这样DNS查询强制走本地自建的Bind DNS服务, 如果客户端host apple.com得到11.22.33.44的结果,说明自建Bind DNS服务运行正常并且解析配置生效。

虚拟机准备

  1. 禁用掉宿主机Virtualbox网卡。虚拟机网卡模式设置为桥接。

  2. root登录

  3. 虚拟机进入桌面后检查右上角网络图标是否成功连互联网,记录下虚拟机ip地址。

  4. 换源。

    sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-* sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=https://mirrors.cloud.tencent.com|g" /etc/yum.repos.d/CentOS-* yum makecache

在线安装

bind是主程序、bind-utils是相关管理工具。

# (可选)检查是否已安装 yum list installed | grep bind # 安装Bind DNS软件和依赖软件 yum install bind bind-utils

配置

配置文件有多个,看上去复杂。
其实一个named.conf主配置文件中就行,但因为域名数万个,一个配置文件中写太多内容不易维护,因此配置文件采用了分层设计。
named.conf包含named.rfc1912.zones,
named.rfc1912.zones包含apple.com.zone。
部分一些配置文件在/var目录下,/etc目录下放的是软件全局配置,/var下放的是属于用户配置。

  • 主配置文件 /etc/named.conf

  • 区域主配置 /etc/named.rfc1912.zones

  • 根域配置 /var/named/named.ca

  • 正向解析区域 /var/named/apple.com.zone

  • 逆向解析区域 /var/named/44.33.22.11.zone

1. 主配置文件 named.conf

主配置文件: 全局配置,包括监听端口、日志、根域查询、包含的子配置文件路径。
修改两处:

  1. 监听地址接受来自除本机外的请求:监听来自网卡的请求。

  2. 允许所有客户端使用dns查询功能:以正常响应本地测试和局域网其它机器的解析请求测试。

nano /etc/named.conf
options { // 双正斜杠后面的是注释不用抄,修改位置用注释和图标标出。 // ⬇️修改前为 listen-on port 53 { 127.0.0.1; };。 listen-on port 53 { any; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; 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"; // ⬇️修改前为 allow-query { localhost; }; allow-query { any; }; recursion yes; dnssec-enable yes; dnssec-validation yes; managed-keys-directory "/var/named/dynamic"; 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; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";

2. (跳过)根域解析配置文件 named.ca

写死固定的,不需要编辑,只需了解内容。
根域配置文件: 全球13台顶级域名服务器映射列表。

cat /var/named/named.ca
; <<>> DiG 9.18.20 <<>> -4 +tcp +norec +nostats @d.root-servers.net ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47286 ;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 27 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1450 ;; QUESTION SECTION: ;. IN NS ;; ANSWER SECTION: . 518400 IN NS a.root-servers.net. . 518400 IN NS b.root-servers.net. . 518400 IN NS c.root-servers.net. . 518400 IN NS d.root-servers.net. . 518400 IN NS e.root-servers.net. . 518400 IN NS f.root-servers.net. . 518400 IN NS g.root-servers.net. . 518400 IN NS h.root-servers.net. . 518400 IN NS i.root-servers.net. . 518400 IN NS j.root-servers.net. . 518400 IN NS k.root-servers.net. . 518400 IN NS l.root-servers.net. . 518400 IN NS m.root-servers.net. ;; ADDITIONAL SECTION: a.root-servers.net. 518400 IN A 198.41.0.4 b.root-servers.net. 518400 IN A 170.247.170.2 c.root-servers.net. 518400 IN A 192.33.4.12 d.root-servers.net. 518400 IN A 199.7.91.13 e.root-servers.net. 518400 IN A 192.203.230.10 f.root-servers.net. 518400 IN A 192.5.5.241 g.root-servers.net. 518400 IN A 192.112.36.4 h.root-servers.net. 518400 IN A 198.97.190.53 i.root-servers.net. 518400 IN A 192.36.148.17 j.root-servers.net. 518400 IN A 192.58.128.30 k.root-servers.net. 518400 IN A 193.0.14.129 l.root-servers.net. 518400 IN A 199.7.83.42 m.root-servers.net. 518400 IN A 202.12.27.33 a.root-servers.net. 518400 IN AAAA 2001:503:ba3e::2:30 b.root-servers.net. 518400 IN AAAA 2801:1b8:10::b c.root-servers.net. 518400 IN AAAA 2001:500:2::c d.root-servers.net. 518400 IN AAAA 2001:500:2d::d e.root-servers.net. 518400 IN AAAA 2001:500:a8::e f.root-servers.net. 518400 IN AAAA 2001:500:2f::f g.root-servers.net. 518400 IN AAAA 2001:500:12::d0d h.root-servers.net. 518400 IN AAAA 2001:500:1::53 i.root-servers.net. 518400 IN AAAA 2001:7fe::53 j.root-servers.net. 518400 IN AAAA 2001:503:c27::2:30 k.root-servers.net. 518400 IN AAAA 2001:7fd::1 l.root-servers.net. 518400 IN AAAA 2001:500:9f::42 m.root-servers.net. 518400 IN AAAA 2001:dc3::35

3. 扩展配置文件 named.rfc1912.zones

扩展配置文件: 具体的域名映射规则。默认配置包括本地127.0.0.1的正向和逆向解析。

RFC介绍: (Request For Comments),是由互联网工程任务组(IETF)发布的一系列备忘录。文件收集了有关互联网相关信息,以及UNIX和互联网社群的软件文件,以编号排定。目前RFC文件是由互联网协会(ISOC)赞助发行。rfc1912规定了DNS相关内容。

修改两处(在文件末尾添加):

  • 正向解析

  • 逆向解析。如果域名对应的ip为11.22.33.44,那么写倒序44.33.22.11,接上后面的.ip-addr.arpa是固定写法。在一些教程中只写了ip的前三段网段33.44.55(1.168.192),第四段将出现在zone文件的解析记录中,而这里我写的是完整的四段,zone文件解析记录中最后一段将写作*@*。

nano /etc/named.rfc1912.zones
zone "localhost.localdomain" IN { type master; file "named.localhost"; allow-update { none; }; }; zone "localhost" IN { type master; file "named.localhost"; allow-update { none; }; }; zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN { type master; file "named.loopback"; allow-update { none; }; }; zone "1.0.0.127.in-addr.arpa" IN { type master; file "named.loopback"; allow-update { none; }; }; zone "0.in-addr.arpa" IN { type master; file "named.empty"; allow-update { none; }; }; // ⬇️在文件末尾添加。正向解析匹配规则写域名。指向的区域配置文件名一定要与后面/var/named目录下创建的详细解析文件名apple.com.zone保持一致。 // 注意格式:缩进,每行结尾的引号,右大括号,右双引号,语句块结束后的分号。 zone "apple.com" IN { type master; file "apple.com.zone"; }; // ⬇️逆向解析为域名指向IP 11.22.33.44的倒写44.33.22.11加.in-addr+.arpa。指向的区域配置文件名要与后面创建的逆向文件名保持一致,有的教程写作apple.com.reverse.zone,这里用ip倒写,只要文件名保持一致。 zone "44.33.22.11.in-addr.arpa" IN { type master; file "44.33.22.11.zone"; };

4. 正向解析配置文件 apple.com.zone

  1. 手动创建文件或复制模版,根据域名修改文件名。

# 参数-a表示复制文件时保持原文件权限。配置文件所属组必需为named,权限不能过高和过低,否则配置文件无法加载。这么设计是为了安全。用ls -a命令查看权限变化。 cp -a /var/named/named.localhost /var/named/apple.com.zone
  1. 编辑配置。

# 这个配置文件在/var目录下 nano /var/named/apple.com.zone
// ⚠️此文件不支持行内注释,文档仅作说明,不要抄写//和后面的内容。 // ⚠️配置文件解析严格,必须用tab键保持跟下房完全一致的缩进。不能直接从文档复制到虚拟机中会导致格式乱掉。 // 注意比较,从模板到下面内容有多行需要修改 $TTL 1D @ IN SOA dns.apple.com. admin.apple.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ NS dns.apple.com. // 域名后面的"."表示根,不能省略。dns.apple.com是假设的域名服务器地址,随意写。 dns A 172.31.5.100 // ⬅️⚠️替换成你自己的服务器IP,即虚拟机IP。⚠️ @ A 11.22.33.44 // 正向解析,即apple.com指向11.22.33.44 www A 11.22.33.44 // 正向解析,二级域名www.apple.com指向11.22.33.44 oa A 11.22.33.44 // 正向解析,二级域名oa.apple.com指向11.22.33.44

解析类型

  • SOA记录: Start of Authority。它标志着一个DNS区域文件的开始,包含了关于这个区域的重要管理信息、如区域的首要名称服务器,负责该区域的管理员联系信息、区域文件的默认TTL值、区域的刷新时间等。关注管理方面。

  • NS记录: NS记录指的是Name Server记录,它定义了该域名的权威名称服务器,即负责响应解析该域的服务器。指向我们自建的dns服务器ip。关注dns服务器ip方面。

  • A记录 三级域名 dns: 指向我们自建的dns服务器ip。

  • A记录 三级域名 空 : 官网主页,访问网址 apple.com 会指向到后面的IP。@符号表示三级域名为空。

  • A记录 三级域名 www : 官网主页,访问网址 www.apple.com。

  • A记录 三级域名 oa : 办公主页,访问网址 oa.apple.com。

5. ⬅️逆向解析配置 44.33.22.11.zone

手动创建文件或复制模版,根据域名修改文件名。文件名应该与/etc/named.rfc1912.zone中的配置的逆向解析规则文件名保持一致。
1.

cp -a /var/named/named.loopback /var/named/44.33.22.11.zone # 或普通复制后修改权限chown root:named /var/named/44.33.22.11.zone
  1. 编辑文件。添加PTR指针记录,让IP能找到对应的域名。由于一个ip对应的服务器上可能有多个Web应用,所以PTR记录也可能有多个。
    如果named.rfc1912.zone中配置的反向解析为"44.33.22.ip-addr.arap"那么应该配置为"11 PTR www.apple.com."数字为ip最后一段,因为我的配置是四段ip写全,所以最后不需要补最后一段,写作@。

nano /var/named/44.33.22.11.zone
// 注意事项同上,注意缩进,域名后的句号,修改ip $TTL 1D @ IN SOA dns.apple.com. admin.apple.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum @ NS dns.apple.com. dns A 172.31.5.100 // ⬅️⚠️替换成你的服务器IP,即虚拟机IP。⚠️ @ PTR www.apple.com. @ PTR oa.apple.com.

检查配置

  1. 检查主配置、区域主配置、域名区域正向解析配置。

# -z参数表示检查include包含的下级配置文件 named-checkconf -z

返回信息最后两行为域名正向配置和逆向配置文件已加载。

zone localhost.localdomain/IN: loaded serial 0 zone localhost/IN: loaded serial 0 zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0 zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0 zone 0.in-addr.arpa/IN: loaded serial 0 zone apple.com/IN: loaded serial 0 // ⬅️正向解析配置文件已经加载 zone 11.22.33.44.in-addr.arpa/IN: loaded serial 0 // ⬅️逆向解析配置文件已经加载
  1. (可选)如果启动服务仍然报错,进行详细检查

# 检查单个配置 named-checkzone /var/named/named.rfc19212.zones # 检查解析记录规则 named-checkzone apple.com /var/named/apple.com.zone named-checkzone apple.com /var/named/44.33.22.11.zone

启动服务

  1. 启动服务

systemctl restart named systemctl status named

服务进程状态active,无其它报错为正常。一些关于ipv6的解析服务器找不到的错误,是正常现象。

● named.service - Berkeley Internet Name Domain (DNS) Loaded: loaded (/usr/lib/systemd/system/named.service; disabled; vendor preset: disabled) Active: active (running) since Sun 2024-10-20 09:03:59 EDT; 5s ago Process: 80994 ExecStop=/bin/sh -c /usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID (code=exited, status=0/SUCCESS) Process: 81012 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS) Process: 81008 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; e> Main PID: 81013 (named) Tasks: 7 (limit: 22874) Memory: 23.5M CGroup: /system.slice/named.service └─81013 /usr/sbin/named -u named -c /etc/named.conf Oct 20 09:03:59 localhost.localdomain named[81013]: network unreachable resolving './DNSKEY/IN': 2001:503:ba3e::2:30#53 Oct 20 09:03:59 localhost.localdomain named[81013]: network unreachable resolving './NS/IN': 2001:503:ba3e::2:30#53 Oct 20 09:03:59 localhost.localdomain named[81013]: network unreachable resolving './DNSKEY/IN': 2001:500:9f::42#53 Oct 20 09:03:59 localhost.localdomain named[81013]: network unreachable resolving './NS/IN': 2001:500:9f::42#53 Oct 20 09:03:59 localhost.localdomain named[81013]: network unreachable resolving './DNSKEY/IN': 2001:500:2d::d#53 Oct 20 09:03:59 localhost.localdomain named[81013]: network unreachable resolving './NS/IN': 2001:500:2d::d#53 Oct 20 09:03:59 localhost.localdomain named[81013]: network unreachable resolving './DNSKEY/IN': 2001:500:a8::e#53 Oct 20 09:03:59 localhost.localdomain named[81013]: network unreachable resolving './NS/IN': 2001:500:a8::e#53 Oct 20 09:04:00 localhost.localdomain named[81013]: network unreachable resolving './DNSKEY/IN': 2001:7fe::53#53 Oct 20 09:04:00 localhost.localdomain named[81013]: resolver priming query complete
  1. 关闭防火墙 关闭SELinux

systemctl stop firewalld setenforce 0 # (可选,正规做法)防火墙放通服务端口 # firewall-cmd --add-service=bind --permanent # firewall-cmd --reload
  1. (可选)查看服务监听端口,dns服务运行在本机局域网ip:53端口上

netstat -tunlp | grep named
ctive Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 192.168.156.135:53 0.0.0.0:* LISTEN 73773/named tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 73773/named tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 73773/named tcp6 0 0 ::1:53 :::* LISTEN 73773/named tcp6 0 0 ::1:953 :::* LISTEN 73773/named udp 0 0 192.168.156.135:53 0.0.0.0:* 73773/named udp 0 0 127.0.0.1:53 0.0.0.0:* 73773/named udp6 0 0 ::1:53 :::* 73773/named

======== 以下为客户端 =========

强制DNS解析走本地自建Bind DNS服务

1.CentOS服务器/或Windows宿主机 充当客户端,打开Bash/或PowerShell终端,能ping通服务器IP。

# CentOS既当服务器又当客户端 ping 127.0.0.1 # 或Windows宿主机 # ping 172.31.5.100 // 替换为你的服务器ip
  1. (重要)手动设置客户机DNS地址,指向自建DNS服务器服务IP,这样ping/host/dig命令就会强制从我们自建的DNS服务器查询信息。
    到手动设置IP的地方(Windows和CentOS略有不同),把DNS地址由114.114.114.114或8.8.8.8设置为named服务器的局域网IP 形如172.31.5.100 ,(如果把centos服务器同时当客户端,填127.0.0.1也行)。
    图形界面设置:
    设置/网络/以太网卡⚙️/ipv4/关闭DNS自动开关,设置为127.0.0.1你的服务器局域网IP 。然后点击应用

4-2手动设置dns.png
  1. 开关网卡。即使上一步点了"应用",其实没有立即生效。设置/网络/以太网卡⚙ 进行开关。

测试域名解析

  1. host命令,最简单

    # Linux host apple.com

    返回下面信息即为成功

    # 如果返回的是apple.com对应的真实美国服务器ip地址,则说明没有走自建dns服务。 apple.com has address 11.22.33.44

    🎉终于成功!🎉

  2. nslookup命令,返回更详细。Windows下也有这个命令

    # Linux/Windows nslookup apple.com
    Server: 127.0.0.1 Address: 127.0.0.1#53 Name: apple.com Address: 11.22.33.44 Name: apple.com Address: ::1

  • dig命令,返回最详细的信息。此软件需要额外安装

    dig apple.com
    dig apple.com ; <<>> DiG 9.11.36-RedHat-9.11.36-13.el8 <<>> apple.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55341 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ; COOKIE: de738ca644787f1cafb1a98f67150dd60ee678225ba29890 (good) ;; QUESTION SECTION: ;apple.com. IN A ;; ANSWER SECTION: apple.com. 86400 IN A 11.22.33.44 ;; AUTHORITY SECTION: apple.com. 86400 IN NS dns.apple.com. ;; ADDITIONAL SECTION: dns.apple.com. 86400 IN A 11.22.33.44 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Sun Oct 20 10:04:06 EDT 2024 ;; MSG SIZE rcvd: 116

  1. 测试二级域名正向解析

host www.apple.com host oa.apple.com
  1. 测试反向解析

nslookup 11.22.33.44

总结

废了这么大劲,最后获取到一行信息。梳理下映射和包含关系。

  1. 客户端请求解析apple.com

  2. 搜索/etc/hosts文件看里面有相关映射没有,没有继续下一步

  3. 请求网卡DNS地址(已手动修改为127.0.0.1,走自建Bind DNS服务器)

  4. Bind DNS服务器监听来自客户端的请求

  5. 查询named.conf主文件,此文件include区域主文件

  6. 查询named.rfc1912.zone,此文件包含域名指向到域名区域配置文件路径

  7. 查询apple.com.zone,根据解析记录中的*@ A 11.22.33.44*找到域名对应的服务器IP。

  8. 返回解析结果。

服务端命令一览,不含编辑配置内容:

1 yum list installed | grep bind 2 pwd 3 ls 4 tar -zxvf bind-installer.tar.gz // 压缩包名可能与实际略有差异,tab自动补全不容易出错 5 rpm -iv --nodeps --force ./bind-installers/*.rpm // 文件夹名可能与实际略有差异,tab自动补全不容易出错 6 yum list installed | grep bind 7 nano /etc/named.conf 8 cat /var/named/named.ca 9 nano /etc/named.rfc1912.zones 10 cp -a /var/named/named.localhost /var/named/apple.com.zone 11 cd /var/named 12 ll 13 nano apple.com.zone 14 cp -a /var/named/named.loopback /var/named/44.33.22.11.zone 15 nano 44.33.22.11.zone 16 named-checkconf -z 17 named-checkzone apple.com /var/named/apple.com.zone 18 named-checkzone apple.com /var/named/44.33.22.11.zone 19 systemctl stop firewalld 20 systemctl start named 21 systemctl status named 22 host apple.com 23 host 11.22.33.44 24 history

参考

bind官网
配置DNS服务的正反向解析
反向解析不生效原因

20 十月 2025