使用 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;
如下所示
进行此更改后,保存并退出named.conf
(对于vi,Shift+:+W+Q+!)。
您需要对/etc/sysconfig/named
进行类似的更改
vi /etc/sysconfig/named
将此添加到文件末尾
OPTIONS="-4"
保存这些更改(同样,对于vi,Shift+:+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