跳至内容

使用 bind 创建私有 DNS 服务器

先决条件和假设

  • 运行 Rocky Linux 的服务器
  • 几个仅需要本地访问,而不是通过 Internet 访问的内部服务器
  • 几个需要访问这些位于同一网络上的相同服务器的工作站
  • 从命令行输入命令的舒适水平
  • 熟悉命令行编辑器(在本例中使用 *vi*)
  • 能够使用 *firewalld* 创建防火墙规则

简介

外部或公共 DNS 服务器将主机名映射到 IP 地址,并且在 PTR(称为“指针”或“反向”)记录的情况下,将 IP 地址映射到主机名。这是 Internet 的重要组成部分。它使您的邮件服务器、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; };
};

保存您的更改(对于 *vi*,Shift+:+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 地址。在本例中,您唯一需要的部分是主机的最后一个八位字节(在 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 代表“生存时间”。TTL 告诉 DNS 服务器在请求新副本之前要保留其缓存的时间。在本例中,TTL 是所有记录的默认设置,除非您手动输入特定 TTL。此处的默认值为 86400 秒或 24 小时。
  • IN 代表互联网。在本例中,互联网未使用。将其视为内部网。
  • SOA 代表“授权开始”或域的主 DNS 服务器是什么。
  • NS 代表“名称服务器”。
  • 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 中,连接不是通过设备名称修改的,而是通过配置文件名称修改的。这可能是“有线连接 1”或“无线连接 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中的主机以及互联网主机。

8 在您的局域网中使用 IPv4

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

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

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=

您需要将我们的新 DNS 服务器替换为主服务器(DNS1),并将其他每个 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域中的任何内容,并且仍然能够解析并访问互联网地址。

防火墙规则 - firewalld

firewalld 默认情况下

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

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

第一步是将我们的局域网添加到“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 服务器,它们将能够访问这些本地服务器。

如果您不需要机器解析互联网上的地址,但确实需要从多台机器访问本地服务器,那么请考虑使用私有 DNS 服务器。

作者:Steven Spencer

贡献者:Ezequiel Bruni、k3ym0、Ganna Zhyrnova