简短答案

简短答案

假设我有一个指向我的 IP 地址的域名。我有一个路由器,负责将端口转发到我客厅的服务器。例如,如果我在浏览器中输入域名,它最终会指向“它自己”。

因此,传播将是:

服务器 -> 路由器 -> ISP -> (DNS 意大利面条式)-> ISP -> 路由器 -> 服务器

但是一旦它知道了 IP 地址(并​​且它被缓存了整个过程),“整个系统”是否可能设置为知道它可以短路到:

服务器 -> 路由器 -> 服务器?

甚至

服务器 -> 服务器(通过“localhost”或其他?)

如果路由器后面还有另一台计算机怎么办?如果我通过 SSH 进入服务器(通过其域名),每次击键都会像

计算机 -> 路由器 -> ISP -> 路由器 -> 服务器?

或者它足够聪明,可以直接离开

计算机 -> 路由器 -> 服务器?

这只是一个问题,我是否应该有两个别名用于 ssh 进入我的家庭服务器(sshmyserverlocal 或 sshmyserverremote),这样如果是本地服务器,我就可以获得最快的连接,或者 DNS 是否为我处理这个问题。

答案1

DNS 和路由是完全独立的系统。DNS 查询返回的地址只是在客户端系统启动与服务器的连接时指定为目的地。数据包到达服务器所遵循的路由与此过程完全无关。这些系统在设计上是分开的,因此路由过程应该无论 DNS 如何表现,始终返回到目的地的最快路由。

答案2

@D34DM347 是正确的,但 DNS 不正确通常情况下参与 IP 数据包路由决策。

不过,有一个小小的例外(可能造成一些困惑),由内容分发网络 (CDN) 提供的一些大型 DNS 服务器在世界各地拥有相同的服务器,它们会查看请求的来源,并根据该来源更改答案。例如,如果您来自法国 IP,那么 Akamai 将为您提供指向他们在法国的一台相同计算机的响应。请参阅此博客文章。这可能就是您感到困惑的地方,也是您合理地期望 DNS 能够协助路由的原因。

至于路由,有些设备提供NAT 环回它们会智能地计算出您要访问的地址实际上是本地的,因此不会将这些数据包发送到外部网络......但这将是路由器设备特定的。

您要么需要指向更本地的 IP 地址,要么弄乱 IP 路由表......这超出了“DNS 是否足够智能来路由......”的问题范围。

答案3

与域名对应的 IP 地址的 DNS 查询将转到您在进行域查询的设备中配置的名称服务器。通常是您的 ISP 的 DNS 服务器。

然后,从客户端到服务器的 IP 数据包将经过设置了端口转发的路由器。

如果您配置一个内部名称服务器,为域名查询返回服务器的私有 IP 地址,那么流量将直接从客户端到服务器,前提是它们位于同一个子网中。

答案4

简短答案

不。

但是,您可以使用 DNS 来(帮助)完成您想要做的事情。

评估形势

这确实看起来像是一个案例XY问题。您正在尝试弄清楚 DNS 配置将如何控制路由。问题是 DNS 对路由的影响很小。这可能是由于对路由工作原理缺乏了解。

因此,我同意D34DM347 的回答。然而,当遇到 XY 问题时,我意识到有时你不只需要一个试图帮助你面对正确方向的答案,因为除非你更详细地了解为什么应该追求那个方向的原因,否则那个方向可能看起来并不理想。所以,我在这里谈到了一些设计概念。

将此概括为不安全

“整个系统”是否可能设置为……

嗯,关于“整个系统”的信息可能会有很大差异。做事的方法有很多种。有些方法可能更有效,但设置起来会比较复杂。

您的问题是寻求缩短流量路径的可能性,以便流量可以使用本地设备而不必经过互联网。好吧,这是否可行将取决于您的本地设备。答案将因网络不同而不同,具体取决于您的本地设备。全球互联网路由标准不会解决有关您的本地设备是否正在运行 DNS 服务器的大量细节。

我不想过于具体地给出一个答案来解释事情是如何运作的,因为事情有多种发生方式。不同的解决方案有不同的功能。简单功能的局限性是可能存在不同选项的原因之一。

存在多种可能设计的另一个原因可能是某些设备可能具有比我可能预测的更高级的功能。例如,我记得配置路由器以将流量发送到计算机,该计算机将验证出站流量,并将验证后的流量传回具有与互联网的物理连接的路由器。我的设置失败了,因为路由器旨在优化流量,因此设备试图通过让流量跳过它认为不必要的步骤来超越我的设计。

由于可能存在不同的情况,这些情况取决于可能使用哪种“DNS 服务器”软件等细节,因此没有一个简单的答案可以说明您的本地网络能够做什么。(您的问题对于您的设置的一些细节(例如正在使用什么设备,以及可能使用什么操作系统或 Web 浏览器)相当模糊,因此没有一个简单的答案可以适用于所有可能的情况。)因此,我只会提供一些关于常见情况的一般指导原则。

名称解析

许多 DNS 服务器都支持一种称为“水平分割”的概念,这基本上意味着从 DNS 服务器收到的答案将取决于请求的来源。例如,一种常见的技术是向所有来自“IETF BCP 5”地址(更常见的是“RFC 1918”地址,即以“10.”或“192.168.”开头的 IPv4 地址或以“172.16.”到“172.31.”开头的数字)的请求提供一个答案(即内部地址),并将其发送到您的内部地址。来自其他 IPv4 地址的请求将获得不同的答案,从而指向另一个地址,该地址可从地球上的大多数位置访问。(IPv6 也将使用不同的配置详细信息进行处理,但可以设置为与 IPv4 类似。为了保持合理性,IPv6 可能应该设置为与 IPv4 类似。)

现在,这对您来说是否是一个容易获得的选项,可能取决于所使用的 DNS 服务器等因素。

如果您的 Web 浏览器所在的计算机会将所有 DNS 流量转发到知名的公共 DNS 服务器,例如 google-public-dns-a.google.com (8.8.8.8) 或 OpenDNS (208.67.222.222 和 208.67.220.220),那么这可能不适合您。这是一种常见情况。

但是,另一种相当常见的情况可能没问题。如果您的 Web 浏览器使用 DHCP 服务器推荐的任何 DNS 服务器,并且如果您的 DHCP 服务器是您的本地路由器,并且该推荐的 DNS 服务器也是您的本地路由器,那么您可以通过在路由器配置中查找“DNS 服务器”功能并查找引用水平分割(或类似术语,如“分割 DNS”)的内容来进行设置。

因此,一种选择可能涉及在您的位置设置 DNS 服务器。但是,即使这样,工作量也可能比您需要的更多。您可以使用除 DNS 之外的“名称解析”技术来完成相同的操作。大多数计算机都支持使用“hosts 文件”作为主要资源进行检查,然后如果系统的本地“hosts 文件”未提供更具体的信息,则使用 DNS。因此,如果您只有一个 Web 浏览器想要执行此操作,您可能只需编辑一个文本文件即可实现您的目标(或缩短流量的路由),从而完全绕过 DNS。

SSH 按键

如果我通过 SSH 进入服务器(通过其域名),则每次击键都会转到 ISP

您的按键是否转到 ISP,完全取决于一些细节,例如您使用的 IP 地址,以及到该 IP 地址的 IP 流量如何路由。(请注意,IP 地址是数字,例如 IPv4 中的 192.168.0.10,或 IPv6 中使用十六进制的 fd00::abcd。DNS 中使用的域名,例如 example.com,不是 IP 地址。)当您“通过 SSH 进入服务器(通过其域名)”时,实际发生的是您的 SSH 客户端将执行“名称解析”查找,这可能涉及检查“主机文件”中的数据,然后检查 DNS。(可能还有其他步骤,例如在执行任何一项操作之前检查本地“解析器”缓存,然后如果使用 DNS,则将结果存储在“解析器”缓存中以加快下次的速度。)您的 SSH 客户端在尝试与远程计算机通信之前执行此操作。然后,一旦“名称解析”过程用于生成 IP 地址,SSH 客户端将使用“名称解析”查找得到的 IP 地址建立 SSH 连接。因此,处理流量的方式将取决于 IP 地址,而不是您是否输入了域名。

DNS 的基本常见工作本质上只是帮助“名称解析”过程将名称转换为 IP 地址。流量如何在整个系统中移动是一个概念,通常称为“路由”,它由与“名称解析”不同的软件/配置处理。因此,了解这些内容的人会尝试将与 DNS 相关的问题与与路由器相关的问题分开回答,因为它们实际上是为不同目的而设计的独立技术,如果您尝试思考它们的设计方式,事情会变得最简单。在您的脑海中,将 DNS 和路由分开。

以上就是我对 DNS 主题的介绍。现在,让我来谈谈您问题的另一个重点,即流量如何路由。

路由

服务器 -> 服务器

这也可能是一种选择。当计算机尝试发送网络流量时,该过程的一部分是创建适当的“第 2 层”帧。家庭网络中最常见的“第 2 层”帧形式是通过 UTP 电缆发送的以太网帧或通过无线方式发送的 Wi-Fi 帧。(商业站点可能使用其他技术,如光纤连接。)典型的“第 2 层”帧将使用 MAC-48 地址来识别接收者。

发送流量的计算机将检查目标地址 IP 是什么。例如,假设发送流量的计算机使用 IPv4 192.168.1.205,而接收流量的计算机是 IPv4 192.168.1.15。如果您的计算机使用的子网掩码为 255.255.255.0,则意味着子网的大小为 256 个地址。(如果您有以“255.255.255.”开头的其他子网掩码,则它将是一个较小的子网。)有一个子网有 256 个地址,包含 192.168.1.205,即从 192.168.1.0 到 192.168.1.255 的子网。

由于 192.168.1.15 属于同一子网,因此计算机将使用目标(您的图表显示为服务器)的 MAC-48 地址发送第 2 层帧。不会有任何流量发送到路由器的任何地址。

另一方面,如果目标地址是 203.0.113.6,那么它将不属于与源 (192.168.1.205) 相同的子网。在这种情况下,路由表指定流量被发送到“网关”设备。(“默认网关”可能是您的路由器。)因此,计算机将使用网关的 MAC-48 地址发送第 2 层帧。目的是让您的计算机相信网关会知道其哪些网络连接可用于将流量传送到所需的目的地。网关可能会使用与 Internet 服务提供商通信的网络连接,也可能不会。这些细节由正在使用哪些 IP 地址以及子网有多大等因素控制。

路由由关键路由细节处理,例如源计算机的 IP 地址、目标 IP 地址、源计算机子网的大小以及处理不属于更具体子网的流量的“默认网关”。家庭网络上的计算机通常通过使用 DHCP 获取 IPv4 的大部分详细信息。唯一的例外是“目标 IP 地址”,这是“名称解析”可能涉及的唯一部分。

服务器 -> 路由器 -> 服务器

你问的是这是否可能。有可能。我会描述一下这是如何实现的。

这比向 ISP 发送流量要好得多。(这完全不会影响 ISP 的设备,而且通信速度比向远程端发送流量要快。)

首先,当路由器接收流量时,它会查看目标 MAC-48 地址。如果目标 MAC-48 地址不是路由器,则路由器不会对流量执行任何操作,除非路由器配置为充当交换机。通常,家用路由器会将某些网络端口标记为“LAN 端口”,并且这些端口被视为单个“链路”,因此路由器将充当这些设备的交换机。如果是这种情况,路由器会将流量从被视为交换机的一个或多个端口发送出去。

为了使流量从内部 LAN 端口流向 ISP,路由器必须将流量从与 ISP 通信的网络端口发送出去。如果目标 IP 地址是“私有”地址之一,例如 IETF BCP 5(更著名的名称是 RFC 1918)中指定的 IPv4 地址,则您的典型家庭网络不太可能这样做。此外,大多数 ISP 只会立即阻止 IETF BCP 5 流量(并且不会将该流量发送回给您)。因此,这种设置(服务器 -> 路由器 -> 服务器)更可能是实际发生的情况,而不是涉及 ISP 的更复杂的过程。

如果信息通过路由器传输,但您只是在内部 LAN 端口上使用 IETF BCP5 地址,我通常不认为这涉及路由器。相反,路由器就像“交换机”一样处理流量,仅使用 MAC-48 地址来做出与流量相关的决策。

还有另一种可能的设置,即您可能正在使用 WAN 地址。在这种情况下,正在使用多个子网,因此设备就像路由器一样。这变得更加复杂,但由于这是事情可能运作的一种方式,因此值得在这里介绍。我将提供一个示例来说明如何成功运作。下一段包含几个 IP 地址。为了帮助理解这些地址,这里要跟踪的主要细节是,以“192.168.1”开头的地址是 LAN 上的 IP 地址,而以“203.0.113”开头的地址是 WAN 连接的地址(路由器连接到 ISP 的地方)。

可能发生的情况是,ISP 的网关设备可能有一个使用类似 203.0.113.5 的地址的网关设备,以及分配给路由器“WAN 端口”的 IPv4 地址 203.0.113.6。如果位于 192.168.1.200 的计算机尝试与 203.0.113.6(路由器的 WAN 端口)通信,则路由器将接收流量(在路由器的 LAN 端口上,可能位于 192.168.1.15),并且路由器将意识到流量应该使用包含 203.0.113.5 和 203.0.113.6 的子网进行通信。当路由器意识到 203.0.113.6 正在接收流量时,路由器可能会意识到 203.0.113.6 的流量处理规则,该规则规定 TCP 端口 80 流量应该应用“网络地址转换”(NAT)。为此,您的路由器会创建一个新的 IP 数据包,该数据包从 203.0.113.6 传送到您的本地 Web 服务器(可能位于 192.168.1.50)。路由器会意识到 192.168.1.50 与 192.168.1.15 位于同一子网,并将流量发送出本地 LAN 端口。

如果情况确实如此,那么路由器将没有理由将流量发送到 203.0.113.5,因此它永远不会到达 ISP。

事实上,如果 ISP 确实收到了这些流量,它可能会说“收到的流量本该发往该客户的网络。但是,这些流量来自客户的网络。这些流量是没有必要发送给我的。我不想配合。我只会丢弃/忽略这些流量。”如果这导致问题,ISP 希望通过智能修复您的内部网络来解决问题,这样它就不会不必要地向 ISP 发送流量。

(这也涉及“计算机 -> 路由器 -> ISP -> 路由器 -> 服务器”的概念。如果您在两次说“路由器”时都是指一个路由器,因为您认为流量可能会在 ISP 处转向,那么这是非常不可取的,而且由于 ISP 处理流量的常见方式,很可能是不可行的。)

那么,“服务器 -> 路由器 -> 服务器”在理论上可行吗?是的。但是,并非所有设备都一定支持 NAT,或者以相同的方式支持它们。某些设备可能设计为仅在流量处理过程中的某个特定点支持 NAT,这可能是在流量将子网从“192.168.1”地址切换到“203.0.113”地址之前。因此,在某些情况下,这可能不起作用。如上一段所述,解决方案不是尝试将流量发送到 ISP。(解决方案是不将流量发送到路由器 WAN 端口上的 IP 地址。您可以通过影响“名称解析”的工作方式最轻松地避免这种情况。)

这只是一个问题,我是否应该有两个别名用于 ssh 进入我的家庭服务器(sshmyserverlocal 或 sshmyserverremote),这样如果是本地服务器,我就可以获得最快的连接,或者 DNS 是否为我处理这个问题。

您希望解决这个问题,无论是使用“名称解析”还是 IP 路由,或者两者兼而有之。如果您有多个名称,但最终使用了错误的名称,那么有时这样的细节根本不重要,有时则很重要。例如,“ping”命令使用 ICMP,可能不会受到影响。但是,如果您使用的是 HTTPS(而不是 SSH),那么主机名可能会更重要。至于 SSH(示例中提到过),这可能并不重要,尽管至少某些版本的 sshd 使用了反向 DNS,因此如果事情与预期不符,您可能会遇到延迟。

为了您自己安心,并尽可能保证技术功能正常,您需要始终使用正确的主机名。例如,Web 服务器的 SSL 证书应具有与在 Web 浏览器中输入的名称相匹配的名称。使所有这些工作正常进行并避免相关问题的简单方法是只使用一个主机名(即使该主机名有多个 IP 地址,这要归功于使用“hosts 文件”或使用拆分 DNS)。

相关内容