在 18.04 中将主机添加到主机文件会破坏 DNS,但在 16.04 中不会

在 18.04 中将主机添加到主机文件会破坏 DNS,但在 16.04 中不会

编辑

我设法找出了缺失的内容,从而明确了如何修复我的问题。事实证明,在 16.04 和 18.04 之间,Ubuntu 及其衍生产品默认从基于 dnsmasq 的版本切换到基于 systemd-resolved 的版本,而 systemd-resolved 比 dnsmasq 更不愿意容忍数十万行/etc/hosts

下面是我试图描述的原始问题,我只是添加了关于当我在编辑页面上时这里有一个答案的内容,因为我认为我应该修复标签以更好地反映相关组件。


原始帖子

因此,我最近从 xenial (16.04) 转到了 bionic (18.04),并且我已成功解决了至少我认为可以解决的问题。我想我只剩下最后一件事了,那就是我不希望它得到修复。

在 16.04 中,我曾经有一个很长的主机文件,甚至无法加载已知的恶意网站。对我来说,它运行良好,如果出现任何问题,我只需检查相关域名是否存在,检查它是如何到达那里的,然后自行决定是否将其从黑名单中移除。

我尝试将我的主机文件从装有 16.04 的旧驱动器迁移过来,但突然什么都加载不了,所以我不得不恢复。经过一番比较,我发现了一个微小的差异(我的新主机文件包含两个版本的计算机主机名,一个以“.lan”结尾),并尝试更正它以查看是否能解决问题。没有成功。

将项目添加到列表中,如果我复制我的域名候选列表,我只是不想加载那些被阻止的域名,但是当我添加以前可以正常工作的大量列表时,它似乎使 DNS 永远无法解析任何东西。这是我几天前用同样的方式添加的相同的主机列表。

我最好的想法是进一步研究 xenial 和 bionic 之间网络发生的变化(我不得不重新夺回对我的 modern-name-of-eth0 的控制权,因为有些新的试图自动管理它),但我花了一些时间才找到一个指南,成功地让我重新控制我的有线网络,老实说,我甚至不确定整个变化的范围是什么。

是否有其他人使用主机文件来阻止一堆域名并碰巧知道这里发生了什么?是否有一些设置的默认设置被更改,并且它会影响主机文件解析,我需要将其设置为旧设置或其他什么?我会对文件本身更加怀疑,但它在 xenial 下运行良好,这让我相当确定 bionic 的变化是相关的,而不仅仅是主机文件本身是错误的(或者如果是,它是错误的,从历史上看,我一直在使用相同的源,因为 precise)。

答案1

/etc/hosts好的,我可能应该在问这个问题之前就想到这样做,但我意识到当我尝试使用我想要的完整文件时,我应该在名称未解析时观察我的进程。

原来systemd-resolve只是我的 CPU 在不停地运转,而没有解决任何问题,所以我调查了这个问题。这让我在找到之前访问了几个网站另一篇 Ask Ubuntu 帖子答案由一位名为塞纳这对我有帮助解决问题(是的,我知道我做了什么)。

事实证明,Ubuntu 在 2016 年至 2018 年期间发生的重大变化之一是从使用 dnsmasq 处理系统上的 DNS 事务转变为使用 systemd-resolve(systemd-resolved?)。现在,对于不乱搞的普通用户来说/etc/hosts,这已经足够了。

问题在于 systemd 使用的解析方法要慢得多/etc/hosts。这显然与应该只让本地 DNS 服务器执行我正在做的那种过滤而不是逐台机器执行有关,因此预期 hostsfile 只有十几行左右,而不是我正在使用的 700,000 行左右。虽然我完全可以理解这里的理由,如果我只使用台式机,我可能会不辞辛劳地使用这种方法,但我的笔记本电脑是便携式的,可以随身携带到任何地方,因此仅限家庭的过滤器对我来说没有我想要的那么有用。因此,我需要一个更好的解决方案。

该链接中的答案摘要(回答者复制了信息对我非常有帮助,因为我向下滚动找到它时 DNS 无法正常工作)如下(谢谢塞纳修复了我笔记本电脑的 DNS):

这是 (X)Ubuntu 18.04 Bionic 的解决方案。

安装 dnsmasq

sudo apt install dnsmasq

在端口 53 上禁用 systemd-resolved 监听器(不要触碰 /etc/systemd/resolved.conf,因为它可能会在升级时被覆盖):

$ cat /etc/systemd/resolved.conf.d/noresolved.conf 
[Resolve]
DNSStubListener=no

并重新启动它

$ sudo systemctl restart systemd-resolved

(或者通过 完全禁用它$ sudo systemctl disable systemd-resolved.service

删除 /etc/resolv.conf 并重新创建。这很重要,因为 resolv.conf 默认是指向 /run/systemd/resolve/stub-resolv.conf 的符号链接。如果您不删除符号链接,则该文件将在重启时被 systemd 覆盖(即使我们禁用了 systemd-resolved!)。此外,NetworkManager (NM) 会检查它是否是符号链接以检测 systemd-resolved 配置。

$ sudo rm /etc/resolv.conf
$ sudo touch /etc/resolv.conf

禁止 NM 覆盖 /etc/resolv.conf(还有一个 rc-manager 选项,但是它不起作用,尽管 NM 手册中有描述):

$ cat /etc/NetworkManager/conf.d/disableresolv.conf 
[main]
dns=none

然后重新启动:

$ sudo systemctl restart NetworkManager

告诉 dnsmasq 从 NM 使用 resolv.conf:

$ cat /etc/dnsmasq.d/nmresolv.conf 
resolv-file=/var/run/NetworkManager/resolv.conf

然后重新启动:

$ sudo systemctl restart dnsmasq

使用 dnsmasq 解析:

$ cat /etc/resolv.conf 
# Use local dnsmasq for resolving
nameserver 127.0.0.1

在我的系统上执行此操作似乎已经(并且我已经重新启动,因此目前似乎仍然存在)迁移了所有在本地完成的 DNS 工作后退/etc/hosts对于 dnsmasq,当我外出并且不能依赖我的家庭 DNS 解决方案来保护我时,它似乎完全没有遇到任何困难,可以将数十万个已知不良域名列入黑名单。

(我不知道在 markdown 格式中注明某人功劳的“正确”方法,但是再次,想指出我发现这似乎是由塞纳,他应该为我找到的这个解决方案受到赞扬。)

相关内容