在 Ubuntu 20.04 服务器上设置未绑定的 DNS 解析器

本教程将向您展示如何在 Ubuntu 20.04 上设置本地 DNS 解析器 未绑定. DNS 解析器有多种名称,下面列出了其中一些名称。 他们都指的是同一个东西。

  • 完整解析器(与存根解析器相反)
  • 递归 DNS 服务器
  • 递归名称服务器
  • 递归解析器
  • DNS 递归

DNS 解析器的示例是 8.8.8.8 (谷歌公共 DNS 服务器)和 1.1.1.1 (Cloudflare 公共 DNS 服务器)。 您计算机上的操作系统也有一个解析器,但由于其功能有限,它被称为存根解析器。 一种 存根解析器 是最终用户计算机上的小型 DNS 客户端,它接收来自 Firefox 等应用程序的 DNS 请求并将请求转发到 递归解析器. 几乎每个解析器都可以缓存 DNS 响应以提高性能,因此它们也被称为 缓存 DNS 服务器.

为什么要运行自己的 DNS 解析器

通常,您的计算机、路由器或服务器使用 ISP 的 DNS 解析器来查询 DNS 名称,那么为什么要运行本地 DNS 解析器呢?

  • 它可以加快 DNS 查找速度,因为本地 DNS 解析器仅侦听您的 DNS 请求,而不会回答其他人的 DNS 请求,因此您直接从解析器上的缓存中获得 DNS 答案的机会要高得多。 您的计算机和 DNS 解析器之间的网络延迟被消除(几乎为零),因此可以更快地将 DNS 查询发送到根 DNS 服务器。
  • 如果您运行邮件服务器并使用 DNS 黑名单 (DNSBL) 来阻止垃圾邮件,那么您应该运行自己的 DNS 解析器,因为某些 DNS 黑名单(例如 URIBL)拒绝来自公共 DNS 解析器的请求。
  • 如果您在 VPS(虚拟专用服务器)上运行自己的 VPN 服务器,那么在同一 VPS 上安装 DNS 解析器也是一个好习惯。
  • 如果您不喜欢将 Internet 浏览历史记录存储在第三方服务器上,您可能还想运行自己的 DNS 解析器。

暗示Local 并不意味着您的家用电脑。 相反,这意味着 DNS 解析器与 DNS 客户端在同一台机器或同一网络上运行。 您可以在家用计算机上安装 Unbound DNS 解析器。 它在您的家用计算机本地。 您也可以在云服务器上安装 Unbound DNS 解析器,它是云服务器本地的。

未绑定的 DNS 解析器

Unbound 是一个开源 DNS 验证解析器,这意味着它可以进行 DNSSEC 验证以确保 DNS 响应是真实的。 未绑定功能:

  • 轻量级且速度极快,因为它不提供成熟的权威 DNS 服务器功能。 在我的一台服务器上,Unbound 使用了 BIND9 所需内存的四分之一。
  • DNS 响应缓存
  • 预取:获取即将过期的数据,以便在数据的 TTL 过期时需要重做查找时客户端不会出现延迟高峰。
  • 基于 TLS 的 DNS
  • 基于 HTTPS 的 DNS
  • 查询名称最小化:向上游服务器发送最少的信息以增强隐私。
  • 积极使用 DNSSEC 验证的缓存
  • 权限区域,用于根区域的本地副本
  • DNS64
  • DNSCrypt
  • DNSSEC 验证:它在 Ubuntu 上默认启用 🙂
  • EDNS 客户端子网
  • 可以作为 DNS 转发器运行。
  • 支持本地数据和响应策略区域为某些域名提供自定义答案。

第 1 步:在 Ubuntu 20.04 上安装 Unbound DNS Resolver

运行以下命令从默认存储库在 Ubuntu 20.04 上安装 Unbound。

sudo apt update
sudo apt install unbound

检查版本。

unbound -V

示例输出:

未绑定的 ubuntu 20.04 服务器

默认情况下,Unbound 会在安装后自动启动。 您可以通过以下方式检查其状态:

systemctl status unbound

unbound.service - 未绑定的 DNS 服务器 ubuntu 20.04

如果它没有运行,那么启动它:

sudo systemctl start unbound

并在启动时启用自动启动:

sudo systemctl enable unbound

笔记:如果有另一个服务在 UDP 端口 53 上侦听,则 unbound 可能无法启动。 您需要在开始解除绑定之前停止该服务。 要找出哪些服务已经在使用 UDP 端口 53,请运行以下命令。

sudo ss -lnptu | grep 53

如果你之前安装了BIND9解析器,那么你需要运行以下命令来停止和禁用它,这样Unbound才能监听UDP 53端口。默认情况下,Unbound监听 127.0.0.1:53[::1]:53

sudo systemctl disable named --now

第 2 步:配置未绑定

Unbound 的主要配置文件是 /etc/unbound/unbound.conf. 开箱即用,Ubuntu 上的 Unbound 服务器仅为本地主机提供递归服务。 外部查询将被拒绝。

编辑配置文件。

sudo nano /etc/unbound/unbound.conf

默认情况下,此文件中只有一个配置行。

include: "/etc/unbound/unbound.conf.d/*.conf"

这是为了包含下面的配置文件 /etc/unbound/unbound.conf.d/ 目录,其中包含两个配置文件。

  • qname-minimisation.conf:启用 QNAME 最小化。
  • root-auto-trust-anchor-file.conf:启用 DNSSEC 验证。

您不必接触这两个文件。 只要知道它们会对您的 DNS 解析有好处。 现在我们需要添加我们的自定义配置。 您可以查看示例配置文件 /usr/share/doc/unbound/examples/unbound.conf 了解如何配置 Unbound。 为了您的方便,我为您编译了一个最小的配置。 在 /etc/unbound/unbound.conf 文件。

server:
      # the working directory.
      directory: "/etc/unbound"
 
      # run as the unbound user
      username: unbound

      verbosity: 2      # uncomment and increase to get more logging.

      # listen on all interfaces, answer queries from the local subnet.
      interface: 0.0.0.0
      # comment out the following line if your system doesn't have IPv6.
      interface: ::0

      # perform prefetching of almost expired DNS cache entries.
      prefetch: yes

      access-control: 10.0.0.0/8 allow
      access-control: 127.0.0.1/24 allow
      access-control: 2001:DB8::/64 allow

      # hide server info from clients
      hide-identity: yes
      hide-version: yes

remote-control:
      # Enable remote control with unbound-control(8) here.
      control-enable: no

      # what interfaces are listened to for remote control.
      # give 0.0.0.0 and ::0 to listen to all interfaces.
      # set to an absolute path to use a unix local name pipe, certificates
      # are not used for that, so key and cert files need not be present.
      control-interface: 127.0.0.1
      # control-interface: ::1

      # port number for remote control operations.
      control-port: 8953

上述配置是不言自明的。 您可能需要考虑两件事。

(1) 默认情况下,Ubuntu 运行 systemd-resolved stub 解析器,它监听 127.0.0.53:53. 你需要停止它,所以 unbound 可以绑定到 0.0.0.0:53.

sudo systemctl disable systemd-resolved --now

(2) 如果您的本地网络范围不是 10.0.0.0/8,你需要改变它,例如,

access-control: 192.168.0.0/24 allow

所以 unbound 将接受来自 192.168.0.0/24 网络的 DNS 查询。

保存并关闭文件。 然后重新启动未绑定。

sudo systemctl restart unbound

检查状态。 确保它正在运行。

systemctl status unbound

如果您在 Unbound 服务器上运行了 UFW 防火墙,那么您需要打开端口 53 以允许 LAN 客户端发送 DNS 查询。

sudo ufw allow in from 10.0.0.0/8 to any port 53

这将打开 TCP 和 UDP 端口 53 到专用网络 10.0.0.0/8。

步骤 3:在 Ubuntu 20.04 服务器上设置默认 DNS 解析器

我们需要让 Ubuntu 20.04 服务器使用 127.0.0.1 作为 DNS 解析器,因此 unbound 将回答 DNS 查询。 Ubuntu 上的未绑定包附带了 systemd 服务 unbound-resolvconf.service 这应该可以帮助我们实现这一目标。 但是,我发现它不起作用。

相反,您可以创建自定义 unbound-resolvconf.service 文件。

sudo nano /etc/systemd/system/unbound-resolvconf.service

在此文件中添加以下行。

[Unit]
Description=local unbound via resolvconf
After=unbound.service
ConditionFileIsExecutable=/sbin/resolvconf

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/sh -c 'echo nameserver 127.0.0.1 | /sbin/resolvconf -a lo.unbound'
ExecStop=/sbin/resolvconf -d lo.unbound

[Install]
WantedBy=unbound.service

保存并关闭此文件。 然后重新加载systemd。

sudo systemctl daemon-reload

确保您的系统具有 resolvconf 二进制。

sudo apt install openresolv

接下来,重新启动此服务。

sudo systemctl restart unbound-resolvconf.service

现在检查内容 /etc/resolv.conf.

cat /etc/resolv.conf

在 Ubuntu 20.04 服务器上将 unbound 设置为默认 DNS 解析器

如您所见,127.0.0.1(未绑定)是默认的 DNS 解析器。

故障排除

如果您看到不同的值 /etc/resolv.conf 文件,这意味着 Unbound 仍然不是您的默认 DNS 解析器。 请注意,某些托管服务提供商(如 Linode)可能会使用网络助手来自动生成 /etc/resolv.conf 文件。 要更改默认 DNS 解析器,您需要在主机控制面板中禁用该网络助手。

如果这个方法还是不行,可能是因为 /etc/resolv.conf Ubuntu 服务器上的文件不是指向 /run/resolvconf/resolv.conf. 你需要删除 /etc/resolv.conf 文件并创建符号链接。

sudo rm /etc/resolv.conf

sudo ln -s /run/resolvconf/resolv.conf /etc/resolv.conf

如果您在 Ubuntu 服务器上运行了 WireGuard VPN 客户端,那么您需要在 WireGuard 客户端配置文件中使用以下 DNS 设置。

DNS = 127.0.0.1

然后重新启动 WireGuard VPN 客户端。

步骤 4:在客户端计算机上设置默认 DNS 解析器

在 Ubuntu 桌面上,您可以按照上述说明设置默认 DNS 解析器,但请记住将 127.0.0.1 替换为 Unbound 服务器的 IP 地址。 在 MacOS 和 Windows 上设置默认 DNS 解析器的步骤可以在互联网上找到。

如何在未绑定中禁用 IPv6

如果您的服务器没有 IPv6 连接,最好在 Unbound 中关闭 IPv6,以减少通过 IPv6 进行的不必要的 DNS 查找。 要在 Ubuntu 上的 Unbound 中禁用 IPv6,只需在 server: 条款中的 /etc/unbound/unbound.conf 文件。

do-ip6: no

保存并关闭文件。 然后重新启动未绑定。

sudo systemctl restart unbound

未绑定的 DNSSEC

DNSSEC 是一种验证 DNS 响应未被篡改的方法。 如果您从默认的 Ubuntu 存储库安装 Unbound,则默认情况下启用它。 让我们在 Ubuntu 20.04 服务器上做一个快速的 DNS 查询。

dig A linuxbabe.com

你可以看到 ad DNS 响应中的标志。 AD 表示真实数据。

未绑定的 dnssec ubuntu

请注意,域名必须启用 DNSSEC 才能进行验证。 如果您没有看到广告标志,则可能意味着该域名尚未启用 DNSSEC。

本地数据

您可以使用 Unbound 中的本地数据功能来提供本地内部主机名或覆盖公共 DNS 记录。

例如,如果我在我的博客 web 服务器上安装 unbound,我可以在 server: Unbound 配置文件中的子句,以便域始终解析为 localhost。

local-data: "linuxbabe.com      A   127.0.0.1"
local-data: "www.linuxbabe.com  A   127.0.0.1"
local-data: "linuxbabe.com      AAAA   ::1"
local-data: "www.linuxbabe.com  AAAA   ::1"

无法访问任何服务器

如果您在使用时看到以下错误 dig 客户端计算机上的命令

;; connection timed out; no servers could be reached

可能是您的防火墙规则错误或未绑定解析程序未运行。

结论

我希望本教程可以帮助您在带有 Unbound 的 Ubuntu 20.04 上设置本地 DNS 解析器。 因为它将在本地主机/本地网络上使用,所以不需要加密(DNS over TLS 或 DNS over HTTPS)。 要设置 DoT 解析器或 DoH 解析器,请阅读以下教程。

  • 如何在 Ubuntu 上使用 Nginx 轻松设置 DNS over TLS Resolver
  • 使用 DNSdist 在 Ubuntu 上通过 HTTPS (DoH) 解析器设置 DNS

与往常一样,如果您发现这篇文章有用,请订阅我们的免费时事通讯以获取更多提示和技巧。 保重🙂