DNS 是否足够智能以通过最短(局域网内)路径路由本地连接?

Phi*_*ldo 5 ssh

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

因此,传播将是:

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

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

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

甚至

服务器 -> 服务器(通过“本地主机”或其他什么?)

如果我在路由器后面有另一台计算机怎么办?如果我通过 SSH 连接到服务器(通过它的域名),每次击键都会像

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

或者它足够聪明就去

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

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

D34*_*347 48

DNS 和路由是完全独立的系统。当您的客户端系统启动与服务器的连接时,您的 DNS 查询返回的地址被简单地指定为目的地。数据包到达服务器的路径完全独立于这个过程。这些系统在设计上是分开的,因此无论 DNS 的行为如何,路由过程都应始终返回到达目的地的最快路由。

  • 但是,DNS指向的是路由器地址,我认为路由算法并没有考虑“端口转发”。 (6认同)

Mat*_*471 12

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

然而,有一个轻微的例外(一些混乱可能来自)由内容分发网络 (CDN) 提供的一些大型 DNS 服务器在世界各地拥有相同的服务器,查看请求的来源并更改答案基于此。例如,如果您来自法国 IP,则 Akamai 将为您提供指向他们在法国的一台相同计算机的响应。请参阅此博客文章。这可能是您的困惑所在,也是您合理期望 DNS 协助路由的原因。

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

您要么需要指向更本地的 IP 地址,要么需要处理 IP 路由表。


Ter*_*nen 6

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

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

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


kas*_*erd 5

您的问题的答案将取决于您说“路由器”时的确切含义。

许多最终用户使用路由器一词来描述主要功能是执行 NAT(网络地址转换)的设备。然而,构成互联网骨干网的路由器很少配置为执行 NAT。这些骨干路由器基于旨在在硬件中高效路由的芯片,而不是其他太多。

这些区别非常重要,我将在这两种情况下分别回答您的问题。

在服务器和 ISP 之间使用 NAT 设备

在本例中,我假设您的服务器的 IP 地址为 10.0.0.2,而您的 NAT 设备的 IP 地址为 192.0.2.42。

当您的服务器连接到 Internet 上的其他服务器时,NAT 设备会将您的服务器发送的每个数据包的源 IP 地址从 10.0.0.2 更改为 192.0.2.42,同时它可能还需要更改源端口号。当数据包返回时,NAT 设备会将数据包的目标地址从 192.0.2.42 更改为 10.0.0.2。

为了支持从 Internet 到服务器的连接,您将在 NAT 设备上配置端口转发。这种端口转发让 NAT 设备在看到第一个建立新连接的数据包时知道用哪个目标地址替换 192.0.2.42。建立连接后,NAT 设备将执行与前一种情况相同的转换。

为了使所有这些都起作用,您的域名必须解析为 192.0.2.42。但这意味着当服务器本身解析域名时,它也会得到 192.0.2.42。

当服务器想要连接到 192.0.2.42 时,它会发现该地址在 LAN 之外,因为 LAN 仅覆盖 10.0.0.0/24。因此,它会将数据包发送到其默认网关,即 NAT 设备的 LAN 接口。

只要 NAT 设备足够智能,可以对同一个数据包进行两次 NAT,它就会转向并返回您的服务器,首先将源 IP 地址从 10.0.0.2 更改为 192.0.2.42,然后将目标 IP 地址从 192.0 更改为.2.42 至 10.0.0.2。返回流量将经过相同的转换过程。

在这种情况下,答案将是流量从服务器传输到 NAT 设备,然后返回到服务器。

如果您的 NAT 设备不太智能,流量可能会在转向之前一路到达 ISP。或者 NAT 设备可能只对数据包进行一次 NAT,并将源地址和目标地址均为 10.0.0.2 的数据包发送回您的服务器,您的服务器将静默丢弃该数据包。

如果您有自己的 DNS 服务器(可能托管在 NAT 设备上),您可以制作一些技巧,对 LAN 上的查询产生不同的响应,这些响应在 Internet 上会得到这些查询的响应。

因此,即使您的域的实际 IP 地址是 192.0.2.42,LAN 上的客户端也会被告知它是 10.0.0.2。

然而,这种方法不能完全自动化。假设您已将 192.0.2.42 上的端口 80 转发到 10.0.0.2 上的端口 80,将 192.0.2.42 上的端口 22 转发到 10.0.0.3 上的端口 22。并且 NAT 设备看到 IP 地址为 192.0.2.42 的 DNS 响应。在将 192.0.2.42 传递给 LAN 上的客户端之前,它应该用哪个 IP 地址替换 192.0.2.42?它还不知道该客户端是要连接到端口 22 还是端口 80,因此它无法知道要返回给客户端的 IP 地址。

这意味着这种水平分割 DNS 将始终需要一些手动配置。它可能会变得一团糟。

在服务器和 ISP 之间使用路由器

在本例中,我假设您的服务器的 IP 地址为 203.0.113.2,而您的路由器的外部 IP 地址为 192.0.2.42。

当您的服务器连接到 Internet 上的其他服务器时,您的路由器将转发数据包,除了降低 TTL 外没有任何变化。远程服务器将看到来自 203.0.113.2 的数据包,您的 ISP 将有一个路由表,说明所有到 203.0.113.0/29 的数据包都需要通过 192.0.2.42 路由,这就是返回流量返回到您的服务器的方式.

在 DNS 中,分配给您的服务器的 IP 地址将为 203.0.113.2。您 LAN 上和 Internet 上的两个客户端都会看到该地址。LAN 上的客户端将识别 203.0.113.2 是本地地址,并直接将数据包发送到服务器,而无需经过路由器。从服务器到自身的连接甚至不会到达网络接口,因为服务器上的 IP 堆栈会识别目标地址是服务器本身的本地地址。

如果您想从外部连接到 IP 地址为 203.0.113.2 的服务器上的端口 80 和 IP 地址为 203.0.113.3 的另一台服务器上的端口 22,您只需这样做。不需要转换,并且来自外部的流量明确指定其目的地为哪个 IP 地址。

您的路由器可能具有防火墙功能,因此您必须在允许从 Internet 到 LAN 发起的连接之前配置开放端口。但是不需要翻译,这意味着它会更快、更可靠。

为什么还要使用NAT?

从这两种场景的区别我们可以看出,避免 NAT 是两种方法中最有效的。使用 NAT 的原因是为了减少所需的 IP 地址数量。

在第一个示例中,您将从您的 ISP 获得仅 1 个 IP 地址。在第二个示例中,您将被分配 9 个 IP 地址。这是 ISP 可以在不需要任何黑客攻击的情况下分配给您的最小 IP 地址数量。

如果我们的 ISP 拥有支持 IPv4 和 IPv6 的最先进的网络,事情可能会更好。在这种情况下,可以仅对 IPv4 使用 NAT,对 IPv6 使用路由。

您的服务器可能有 IP 地址 10.0.0.2 和 2001:db8:42:cafe::2,您的 NAT/路由器可能有 IP 地址 192.0.2.42 和 2001:db8:42::2。在这种情况下,您的域将具有 IP 地址 192.0.2.42 和 2001:db8:42:cafe::2。

请注意,域解析为路由器的 IPv4 地址和服务器的 IPv6 地址。

无论客户端使用 IPv4 还是 IPv6,从 Internet 到服务器的连接都将通过路由器。从服务器到自身的连接可以并行尝试 IPv4 和 IPv6 并使用最快的,这将是 IPv6,因为 IPv4 连接将不得不通过 NAT/路由器绕道而行。

  • 我认为您在这里有双重否定:“避免 NAT 效率最低”应该读作“使用 NAT 效率最低”,或“避免 NAT 效率最高”。 (2认同)