跳至内容

使用 bind 的专用 DNS 服务器

先决条件和假设

  • 运行 Rocky Linux 的服务器
  • 多个只需要本地访问而不需要互联网访问的内部服务器
  • 多个需要访问同一网络上存在的这些服务器的工作站
  • 对从命令行输入命令有良好的舒适度
  • 熟悉命令行编辑器(本例中使用 vi
  • 能够使用 firewalld 创建防火墙规则

简介

外部或公共 DNS 服务器将主机名映射到 IP 地址,在 PTR(称为“指针”或“反向”)记录的情况下,将 IP 地址映射到主机名。这是互联网的重要组成部分。无论您身在何处,它都能确保您的邮件服务器、Web 服务器、FTP 服务器或许多其他服务器和服务按预期工作。

在专用网络上,特别是一个用于开发许多系统的网络,您可以使用 Rocky Linux 工作站的 /etc/hosts 文件将名称映射到 IP 地址。

这适用于您的工作站,但不适用于您网络上的任何其他计算机。使其普遍适用的最佳方法是花一些时间创建一个本地、专用的 DNS 服务器来处理您所有计算机的此需求。

假设您正在创建生产级别的公共 DNS 服务器和解析器。在这种情况下,作者推荐使用更强大的 PowerDNS 权威和递归 DNS,它可以安装在 Rocky Linux 服务器上。但是,本文档是为不会将 DNS 服务器暴露给外部世界的本地网络准备的。这就是作者选择 bind 作为本示例的原因。

DNS 服务器组件说明

DNS 将服务分为权威服务器和递归服务器。现在建议将这些服务分离在单独的硬件或容器上。

权威服务器是所有 IP 地址和主机名的存储区域,递归服务器则查找地址和主机名。在我们的专用 DNS 服务器的情况下,权威服务器和递归服务器服务将一起运行。

安装和启用 bind

第一步是安装软件包

dnf install bind bind-utils

bind 的服务守护进程是 named。启用此项使其在启动时启动

systemctl enable named

启动 named

systemctl start named

配置

在更改任何配置文件之前,请创建原始安装的工作文件 named.conf 的备份副本

cp /etc/named.conf /etc/named.conf.orig

如果配置文件出现错误,这将有助于将来进行排查。在进行更改之前,*始终* 最好制作一个备份副本。

编辑 named.conf 文件。作者正在使用 vi,但您可以替换为您喜欢的命令行编辑器

vi /etc/named.conf

关闭在 localhost 上的监听。通过在“options”部分使用“#”符号注释掉这两行来实现。这会关闭与外部世界的任何连接。

这很有帮助,尤其是在您将此 DNS 添加到我们的工作站时,因为您希望 DNS 服务器仅在请求服务的 IP 地址是本地的时响应,并且在服务器或服务位于 Internet 上时不会做出反应。

这样,其他配置的 DNS 服务器将几乎立即接管以查找基于 Internet 的服务

options {
#       listen-on port 53 { 127.0.0.1; };
#       listen-on-v6 port 53 { ::1; };

最后,滚动到 named.conf 文件底部,并为您的网络添加一个节。我们的示例是“ourdomain”,所以替换为您想称呼您的 LAN 主机的名称

# primary forward and reverse zones
//forward zone
zone "ourdomain.lan" IN {
     type master;
     file "ourdomain.lan.db";
     allow-update { none; };
    allow-query {any; };
};
//reverse zone
zone "1.168.192.in-addr.arpa" IN {
     type master;
     file "ourdomain.lan.rev";
     allow-update { none; };
    allow-query { any; };
};

保存您的更改(对于 viShift+:+W+Q+!

正向和反向记录

您需要在 /var/named 中创建两个文件。如果添加机器到您的网络,您将编辑这些文件以将它们包含在 DNS 中。

第一个是正向文件,用于将我们的 IP 地址映射到主机名。同样,这里的示例是“ourdomain”。请注意,我们本地 DNS 的 IP 地址是 192.168.1.136。在此文件底部添加主机。

vi /var/named/ourdomain.lan.db

完成后,该文件将看起来像这样

$TTL 86400
@ IN SOA dns-primary.ourdomain.lan. admin.ourdomain.lan. (
    2019061800 ;Serial
    3600 ;Refresh
    1800 ;Retry
    604800 ;Expire
    86400 ;Minimum TTL
)

;Name Server Information
@ IN NS dns-primary.ourdomain.lan.

;IP for Name Server
dns-primary IN A 192.168.1.136

;A Record for IP address to Hostname
wiki IN A 192.168.1.13
www IN A 192.168.1.14
devel IN A 192.168.1.15

添加所有您需要的主机和 IP 地址,然后保存您的更改。

您需要一个反向文件来将我们的主机名映射到 IP 地址。在这种情况下,您只需要 IP 的一部分,即主机的最后一个八位字节(在 IPv4 地址中,每个用“.”分隔的数字都是一个八位字节)、PTR 和主机名。

vi /var/named/ourdomain.lan.rev

完成后,该文件将看起来像这样

$TTL 86400
@ IN SOA dns-primary.ourdomain.lan. admin.ourdomain.lan. (
    2019061800 ;Serial
    3600 ;Refresh
    1800 ;Retry
    604800 ;Expire
    86400 ;Minimum TTL
)
;Name Server Information
@ IN NS dns-primary.ourdomain.lan.

;Reverse lookup for Name Server
136 IN PTR dns-primary.ourdomain.lan.

;PTR Record IP address to HostName
13 IN PTR wiki.ourdomain.lan.
14 IN PTR www.ourdomain.lan.
15 IN PTR devel.ourdomain.lan.

添加正向文件中的所有主机名,然后保存您的更改。

这些都意味着什么

既然您已添加了所有这些内容,并准备重新启动我们的 bind DNS 服务器,让我们探讨一下这两个文件中使用的一些术语。

如果不了解每个术语的含义,仅仅让事情工作是不够的,对吧?

  • TTL 代表“生存时间”(Time To Live)。TTL 告诉 DNS 服务器在请求新副本之前缓存多长时间。在这种情况下,TTL 是所有记录的默认设置,除非您手动输入特定的 TTL。这里的默认值是 86400 秒或 24 小时。
  • IN 代表 Internet。在这种情况下,Internet 不被使用。可以将其视为 Intranet。
  • SOA 代表“权威起始”(Start Of Authority),即域的主要 DNS 服务器是什么
  • NS 代表“名称服务器”(name server)
  • Serial 是 DNS 服务器用于验证区域文件内容是否最新的值
  • Refresh 指定从服务器 DNS 服务器请求区域传输的频率
  • Retry 指定在区域传输失败后重试的等待时间(秒)
  • Expire 指定当主服务器不可达时,从服务器将等待多长时间来响应查询
  • A 是主机地址或正向记录,仅存在于正向文件中
  • PTR 指针记录,更广为人知的名称是“反向”记录,仅存在于我们的反向文件中

测试配置

创建好所有文件后,您需要确保配置文件和区域在再次启动 bind 服务之前处于良好的工作状态。

检查主配置

named-checkconf

如果一切正常,这将返回空结果。

检查正向区域

named-checkzone ourdomain.lan /var/named/ourdomain.lan.db

如果一切正常,这将返回类似这样的结果

zone ourdomain.lan/IN: loaded serial 2019061800
OK

最后,检查反向区域

named-checkzone 192.168.1.136 /var/named/ourdomain.lan.rev

如果一切正常,这将返回类似这样的结果

zone 192.168.1.136/IN: loaded serial 2019061800
OK

假设一切看起来都不错,继续重新启动 bind

systemctl restart named

9 在局域网中使用 IPv4

要在局域网中*仅*使用 IPv4,您需要在 /etc/sysconfig/named 中进行一项更改

vi /etc/sysconfig/named
在此文件底部添加此内容

OPTIONS="-4"

保存这些更改。

9 测试机器

您需要将 DNS 服务器(在本例中为 192.168.1.136)添加到您希望能够访问您添加到本地 DNS 的服务器的每台计算机上。作者仅展示了如何在 Rocky Linux 工作站上执行此操作的示例。其他 Linux 发行版、Windows 和 Mac 计算机也存在类似的方法。

您需要将 DNS 服务器添加到列表中,而不是替换现有内容,因为您仍需要互联网访问,这将需要您当前分配的 DNS 服务器。DHCP(动态主机配置协议)服务通常分配这些,或者它们是静态分配的。

我们将使用 nmcli 添加本地 DNS,然后重新启动连接。

愚蠢的配置文件名称

在 NetworkManager 中,连接不是按设备名称修改,而是按配置文件名称修改。这些名称可以是“Wired connection 1”或“Wireless connection 1”。您可以通过运行不带任何参数的 nmcli 来查看配置文件

nmcli

这将显示类似这样的输出

enp0s3: connected to Wired Connection 1
"Intel 82540EM"
ethernet (e1000), 08:00:27:E4:2D:3D, hw, mtu 1500
ip4 default
inet4 192.168.1.140/24
route4 192.168.1.0/24 metric 100
route4 default via 192.168.1.1 metric 100
inet6 fe80::f511:a91b:90b:d9b9/64
route6 fe80::/64 metric 1024

lo: unmanaged
    "lo"
    loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536

DNS configuration:
    servers: 192.168.1.1
    domains: localdomain
    interface: enp0s3

Use "nmcli device show" to get complete information about known devices and
"nmcli connection show" to get an overview on active connection profiles.

在我们开始修改连接之前,您应该给它起一个合理的名字,例如接口的名称(*注意*下面的“\”转义了名称中的空格)

nmcli connection modify Wired\ connection\ 1 con-name enp0s3

完成后,再次单独运行 nmcli,您将看到类似这样的内容

enp0s3: connected to enp0s3
"Intel 82540EM"
ethernet (e1000), 08:00:27:E4:2D:3D, hw, mtu 1500
ip4 default
inet4 192.168.1.140/24
route4 192.168.1.0/24 metric 100
route4 default via 192.168.1.1 metric 100
...

这将使剩余的 DNS 配置更加容易!

假设您的连接配置文件名称是“enp0s3”,我们将包含已配置的 DNS,但首先添加我们的本地 DNS 服务器

nmcli con mod enp0s3 ipv4.dns '192.168.1.138,192.168.1.1'

您可以拥有更多 DNS 服务器。对于已配置公共 DNS 服务器的计算机,例如 Google 的开放 DNS,您可能有以下情况

nmcli con mod enp0s3 ipv4.dns '192.168.1.138,8.8.8.8,8.8.4.4'

添加完所需的 DNS 服务器到连接后,您应该能够解析 ourdomain.lan 中的主机以及 Internet 主机。

8 在局域网中使用 IPv4

如果您仅在局域网中使用 IPv4,则需要进行两项更改。第一项在 /etc/named.conf 中,第二项在 /etc/sysconfig/named

首先,再次使用 vi /etc/named.conf 进入 named.conf 文件。我们需要将以下选项添加到 options 部分中的任何位置。

filter-aaaa-on-v4 yes;

如下所示

Add Filter IPv6

进行此更改后,保存并退出 named.conf(对于 viShift+:+W+Q+!

您需要对 /etc/sysconfig/named 进行类似的更改

vi /etc/sysconfig/named

将此添加到文件底部

OPTIONS="-4"

保存这些更改(再次,对于 viShift+:+W+Q+!

8 测试机器

您需要将 DNS 服务器(在本例中为 192.168.1.136)添加到您希望能够访问您添加到本地 DNS 的服务器的每台计算机上。作者仅展示了如何在 Rocky Linux 工作站上执行此操作的示例。其他 Linux 发行版、Windows 和 Mac 计算机也存在类似的方法。

您需要将 DNS 服务器添加到列表中,因为您仍然需要互联网访问,这将需要您当前分配的 DNS 服务器。DHCP(动态主机配置协议)通常分配这些,或者它们是静态分配的。

在启用网络接口为 eth0 的 Rocky Linux 工作站上,使用

vi /etc/sysconfig/network-scripts/ifcfg-eth0

如果您的启用网络接口不同,您需要替换该接口名称。您将打开的配置文件对于静态分配的 IP(而非上面提到的 DHCP)将看起来类似这样。在下面的示例中,我们计算机的 IP 地址是 192.168.1.151

DEVICE=eth0
BOOTPROTO=none
IPADDR=192.168.1.151
PREFIX=24
GATEWAY=192.168.1.1
DNS1=8.8.8.8
DNS2=8.8.4.4
ONBOOT=yes
HOSTNAME=tender-kiwi
TYPE=Ethernet
MTU=

您需要为主(DNS1)替换为我们的新 DNS 服务器,并将其他 DNS 服务器向下移动一个位置

DEVICE=eth0
BOOTPROTO=none
IPADDR=192.168.1.151
PREFIX=24
GATEWAY=192.168.1.1
DNS1=192.168.1.136
DNS2=8.8.8.8
DNS3=8.8.4.4
ONBOOT=yes
HOSTNAME=tender-kiwi
TYPE=Ethernet
MTU=

完成更改后,重新启动计算机或使用以下命令重新启动网络

systemctl restart network

您现在将能够从您的工作站访问 ourdomain.lan 域中的任何内容,并且仍然能够解析和访问 Internet 地址。

防火墙规则 - firewalld

firewalld 默认情况下

在 Rocky Linux 9.0 及更高版本中,已弃用 iptables 规则。您应该改用 firewalld

作者不对您可能需要的网络或服务做任何假设,除了为我们的 LAN 网络仅启用 SSH 访问和 DNS 访问。为此,您将使用 firewalld 内置的“trusted”区域。您需要对“public”区域进行服务更改,以将 SSH 访问限制在 LAN。

第一步是将我们的 LAN 网络添加到“trusted”区域

firewall-cmd --zone=trusted --add-source=192.168.1.0/24 --permanent

将我们的两个服务添加到“trusted”区域

firewall-cmd --zone=trusted --add-service=ssh --permanent
firewall-cmd --zone=trusted --add-service=dns --permanent

从默认的“public”区域中删除 SSH 服务

firewall-cmd --zone=public --remove-service=ssh --permanent

重新加载防火墙并列出您已进行更改的区域

firewall-cmd --reload
firewall-cmd --zone=trusted --list-all

这将显示您已正确添加了服务和源网络

trusted (active)
    target: ACCEPT
    icmp-block-inversion: no
    interfaces:
    sources: 192.168.1.0/24
    services: dns ssh
    ports:
    protocols:
    forward: no
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    rich rules:

列出“public”区域将显示不再允许 SSH 访问

firewall-cmd --zone=public --list-all

显示

public
    target: default
    icmp-block-inversion: no
    interfaces:
    sources:
    services: cockpit dhcpv6-client
    ports:
    protocols:
    forward: no
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    rich rules:

这些规则将使 192.168.1.0/24 网络上的主机能够从您的专用 DNS 服务器解析 DNS。此外,您将能够从这些主机中的任何一台 SSH 到您的专用 DNS 服务器。

结论

在单个工作站上更改 /etc/hosts 文件可以访问您内部网络上的计算机,但只能在该计算机上使用。使用 bind 的专用 DNS 服务器允许您将主机添加到 DNS,并且只要工作站可以访问该专用 DNS 服务器,它们就可以访问这些本地服务器。

如果您不需要计算机解析 Internet 地址,但需要多台计算机从本地服务器访问本地服务器,那么请考虑使用专用 DNS 服务器。

作者:Steven Spencer

贡献者:Ezequiel Bruni, k3ym0, Ganna Zhyrnova