Linux上DNS客户端配置的Sisyphean任务

2021-04-16 00:49:29

DNS(域名服务)是在1983年发明的。DNS是一个系统,它可以将名称置于IP地址,以便您的计算机可以知道如何像Tailscale.com这样连接到Websites。这是一个简单的服务,所以作者为4.3 bsdspecified一个名为/etc/resolv.conf的简单配置文件:

在这种情况下,它讲述了DNS解析函数使用192.168.122.1作为THEDNS服务器。这意味着当您为TailScale.com等网站进行查找时,它将询问192.168.122.1对您进行查找:

如果在过去的旧日子周围,我们可能只会安全修改/ etc / soldv.conf,这将是它的结束。

然而,像DHCP这样的事情进入并添加了一堆所需的复杂性Intothe等式。 DHCP是一个协议,让网络上的机器发现它们应该通过漫无目的地喊叫在网络上的每个人身上,直到我们讲述他们想要的东西。 DHCP提供的一件事是网络首选DNS服务器的AIP地址。 /etc/resolv.conf的内容需要由某些程序管理,如果有aredisagreements,则不同意的计划(例如DHCP客户端和TailScale)需要竞争DNS至上。大多数发行版和自定义设置,同步为一个名为rescolvconf的ungoolable程序,以帮助这一点。

Resolvconf将有助地向ARTC/RESOLV.conf的开头帮助您的评论,让您知道rollevconf正在管理它:

RESCRVCONF是管理DNS的一个松散的公约,该公约由多个程序实现了互相不兼容的方式。两个常见的evaneare是debian的resolvconf和OpenResolv。

当几件事有关于DNS配置的意见时,您需要某种方式在它们之间仲裁。 Debian的ResolVConf采用LettingVenyBody赢取的策略,并安装了所有输入的混合的配置。这很好,直到您进入像尾部的情况,您实际上希望能够完全覆盖DNS配置(例如,因为Anadmin在TailScale管理面板中设置强制DNS配置)。当然,我们认为我们比其他人更为正确,但其他人认为对自己同样的事情,而Debian Refalvconf拒绝选择一个胜利者。

OpenResolv允许您指定DNS服务器的优先顺序。另外允许程序指定“独占”模式,其中它将始终更喜欢选项,并且将丢弃其他选项。如果两个程序希望处于“独占”模式,则最后一个提供配置获胜的最后一个,以及我们的竞争为DNS至上的竞争。

但是,正如TailScale我们实际上想要这种行为,所以我们使用它来设置DNSconFiguration:

过了一段时间的人在Freedesktop中注意到这种不断的DNSSupremacy的战斗非常烦人(更不用说配置WiFi连接是令人讨厌的,他们在一起创造了更好的道路。他们这个网络管理器。 ituses一个名为d-busto的协议允许其他程序告诉它该做什么。这是一个明显的改进resolvconf。要使用ResolvConf更新/etc/resolv.conf,您需要将所需配置管制到Rescrivconf,并希望您愿意发生的事情。 NetworkManager的API具有架构并允许内省,这在我们的末端更容易。

NetworkManager旨在成为一个守护程序,以统治所有网络Mancesson Linux。尽管它有自己的方法来管理/etc/resolv.conf,但是networkManager可以配置为使用roctVconf来管理/etc/resolv.conf。这会发生在更多的发行版,然后你会想到的是在隐藏很多硬件和允许使用GUI工具的硬件和允许员时做得非常好的工作。

NetworkManager是长时间做DNS配置的标准和最好的方法,但是,一些发行版仍然更喜欢这一天),然而随着物品更复杂,有需要更强大的东西。 Systemd项目创建了名为systemd-solutived的solution,该管理员可以更好地控制DNS在APER-Network界面中如何解决。以下是我们的LinuxMachines之一的已解决状态:

$ resolvectl状态 全球的 协议:+ llmnr + mdns -dnsovertls dnssec =否/不支持 resolv.conf模式:stub 当前DNS服务器:100.100.100.100 DNS服务器:100.100.100.100 8.8.8.8 1.1.1.1 后退DNS服务器:100.100.100.100 8.8.8.8 1.1.1.1 DNS域:Akua.xeserv.us christine.website.beta.tailscale.net 链接2(ENP5S0) 当前范围:LLMNR / IPv4 LLMNR / IPv6 协议:-defaultroute + llmnr -mdns -dnsovertls dnssec =否/不支持 链接9(Tailscale0) 当前范围:LLMNR / IPv4 LLMNR / IPv6 协议:-defaultroute + llmnr -mdns -dnsovertls dnssec =否/不支持

除此之外,Systemd-Devertved允许您使用DNS DESTLS。这是一个额外的肮脏球,愉快地脱离了这篇文章的范围。但是,SystemD-Devallved andallows optaWale可以使用其D-Bus API可靠地配置它(当然不是NetworkManager,而不是Sameapi,当然)。

当然,这假设我们将DNS视为全球一致的NameSpace,在首次发明时DNS的方式。这并非总是如此。

某些网络或组织具有自己的私有DNS服务器,其中包含无法通过Internet解析的名称。这使事情变得很多。由于缺乏更好的术语,我们将呼叫此设置“拆分DNS”(如果您有更好的术语,我们非常乐意采取建议,但为了本文,我们将称之为“拆分” DNS“)。

使用路由表在其他计算机之间路由到IP流量。此路由标准有一个网络和关于与它们有关的指示。 Tocorryly处理拆分DNS设置,您需要一个用于DNS的路由表,由子域而不是IP地址。这就是Windows,MacOS,Andlinux与Systemd-Departved处理这些类型的配置。例如,您可以拥有一个如下所示的DNS路由表:

这些设置比你首先思考的更常见,并且在其中的每个家庭都有伤害。这使您可以使用域ComputerName.local自动触发ComputerName的IP。 MOSTCORENTATE VPN还希望实现内部服务(如售货机,数据库或IRC服务器)解析到VPN后面的IP地址。这项服务器对公共DNS服务泄露请求,以及缺少框中的Linux(在没有Systemd-Resolved的情况下运行时)已成为显着的限制。

/etc/resolv.conf对基于domainname的路由DNS不具有支持,因此在最基本的配置中,我们在TailScale守护程序中的Anin-Process Resolver中实现路由,并告诉操作系统将所有ITSDNS流量发送到100.100 .100.100。此流量通过您的尾声流程本地处理,让基于Resolv.conf的系统分开了DNS。我们仍然必须偶尔为DNS至上的战斗,具体取决于尝试编辑/etc/resolv.conf。 Resolvconf是一个类似的故事,可能在较少的配置方面略低。

然后是NetworkManager。 NetworkManager能够控制/etc/resolv.conf,soldvconf和可选的DNS服务器,称为DNSMASQ。只有拆分DNS的唯一模式是DNSMASQ模式。这意味着TailScale需要Careabout哪种模式NetworkManager在内,我们使用该ododeto执行此操作。我们在那里有一些额外的代码来处理我们应该营养的案例,我们应该营造NetworkManager,但它无法响应pings(感谢D-Bus做事的Tandard D-Bus方式的方式是让每个对象实现“Ping”方法),进入我们需要再次进入沟渠。

除了旁边,所有这些中的一个主要困难都是onlinux系统的名称分辨率指定非常差,这些方法中的每一个都会产生不同的行为。[j]如果我们为go.akua做出决议,那么willhappen是什么?它会转向公共互联网的解析程序吗?它会去视图拆分服务器吗?出于某种原因,它会被送过吗?将在您的LocalCoffee Shop的公共WiFi热点上发出潜在狡猾的DNS服务器吗?它会通过HTTPS通过UDP,TCP或DNS发送吗?我们不知道。这个东西没有记录,结果,你需要弄清楚通过血液,泪水和心碎的东西。为额外乐趣,Glibcand Musl的行为也不同。写新闻时文时,请记录您的行为。这很多时间挽救了这么多人。

如何执行此操作的示例是已解决的。它可以做所有Amodern Split-DNS VPN的所有东西都需要自然,所以理论上没有额外的工作(除了下面的除外,因为现实不像我们想要的那样干净)。 SystemDteam精心讲述他们的他们,andmade它明确明显明显,你应该如何旋转东西来获得你的东西。这是基础架构程序突出的那种文档。

现在,如果您在Linux上提供DNS服务器的地方,并且弄清楚如何配置系统的解析器,那么这里就是如何做到。

从顶部开始,首先需要检查Alall是否存在/etc/resolv.conf。如果不是,你不能覆盖它:

如果确实存在,则需要检查文件的所有者是谁。您可以通过查找/etc/resolv.conf的魔术单词来查找/etc/resolv.conf的所有者。

这些将告诉您哪个服务管理/etc/resolv.conf文件。如果您不会找到任何所有者,则需要吹掉/etc/resolv.conf并希望最为希望。

如果正在使用的ResolvConf,那么您也应该在$ PATH上假设当然,您可以在$ PATH上提供resolvconf二进制文件:

如果Config似乎拥有NetworkManager,则需要检查NetworkManageris是否通过D-Bus提供可用,如果是,则可以使用它。否则,您将返回ToOverwriting arcorv.conf。

NetworkManager还将皱纹添加到RegryVconf路径:如果Theresolvconf生成的配置来自NetworkManager,我们希望尝试Andure NetworkManager而不是resolvconf,因为NetworkManager是难以征存的。因此,我们进行额外的检测通行证,看看rescrikvconf是否正在通过网络填充,并且如果是,请切换到NetworkManager。

如果resolvconf似乎被networkManager喂养,但我们无法谈论TonetWorkManager,我们应该返回使用ResolvConf。

如果您正在使用Systemd-solutived,事情应该是平稳的帆船......但是有震惊。事实证明,NetworkManager,直到最近,CommentUressystemd - 以一种方式略微解决,这使得如果您正在与Systemd-soluating yours oversing yoursformative,则无法实现默认解析器。这是在2020年12月的NetworkManager 1.26.6(相关的bugreport)。

因此,如果正在使用的系统已解决,我们需要检查NetworkManager是否是Alspresent,以及它是否将其配置推向系统已解决。 IFSO,我们必须使用NetworkManager来配置DNS,即使它的能力略小于Systemd-solutived。

据我们所知,此设置将允许您在Linux系统上配置DNS有点一致。我们希望这将节省您的时间和环境在将来努力实施这一逻辑。对于您没有路由感知DNSConfiguration的每种情况,您还需要为您的服务需求的DNS路由位实现“Polyfill”,以便为您没有路由感知的DNSConfiguration(其中大多数情况下的情况)。

如果您决定将来要制作一些新的DNS配置管理服务,请确保已记录。包括与此图的其余部分的娱乐。

如果您是一个Linux Distro维护者,您可能会想知道您应该对您的用户施加的特征性的哪一部分。我们的认为是您应该使用ystemd解决,如果您需要用户友好的网络配置,则是NetworkManager(1.26.6或更好)的redrecent版本。这将为您提供艺术态度的DNS功能,使网络化软旺旺更快乐的实施者。使用此设置,DNS配置图形如下所示:

即将举行的Tailscale 1.8释放实现了以上所有内容,它在Linux上就可以在Linux上制作DNS,无论您的机器如何选择如何。