我的 DNS 记录只能指向一个 IP 地址。我如何让它到达一个端口?

xet*_*a11 13 networking domain-name-system http request

我对网络管理还很陌生,因此对成功设置 DNS 记录感到非常兴奋。

现在我有点困惑,因为我想要这个网址:

http://www.example.org:8080/fetch/characters/
Run Code Online (Sandbox Code Playgroud)

实际上可以通过这个到达

http://www.example.org/fetch/characters/
Run Code Online (Sandbox Code Playgroud)

因此用户可以在 8080 端口上访问服务,而无需显式设置端口。

我怎样才能做到这一点?我的服务器上需要一些特殊的应用程序吗?或者任何要应用于请求的重定向内容?

Sve*_*ven 34

DNS 记录不能指向端口(有一些特殊情况在此处不适用)。

如果您有一个 Web 服务侦听端口 8080 并希望在不指定此端口的情况下访问它,则有 3 个选项:

  • 使其实际侦听端口 80(或使用 https 侦听 443)。
  • 配置已经在端口 80 上侦听的任何内容,以将请求转发到端口 8080(反向代理)上的服务。
  • 如果您可以接受重定向,请使用它而不是代理,但是您的客户将:8080在重定向后在其地址栏中看到该部分。

  • 如果我们可以使用 SRV 记录并为服务指定端口会怎样... 浏览器不使用这个太糟糕了。 (10认同)
  • @JacobEvans:所有的 SRV 记录都是我的一个老梦想。这会让事情变得更容易(防火墙管理员除外,他们现在可以阻止除 80 和 443 之外的所有内容) (4认同)

Tom*_*iie 10

默认情况下,Web 服务器侦听 TCP 端口 80。如果您不想在 URL 中明确键入端口号,则有几个选项:

  • 您可以重新配置您的 Web 服务器以使用端口 80 而不是端口 8080。这建议用于 nginx 或 Apache 等 Web 服务器,但不适用于 Gunicorn 等 Web 服务器。此选项也并非总是可行,因为该端口可能已被其他 Web 服务器使用。

    此外,当您的服务器位于 NAT 网关后面时,它不拥有公共 IP 地址,并且该公共 NAT 地址和端口 80 的组合可能已经转发到不同的 Web 服务器。

  • 您可以在您的 Web 服务器前面放置一个反向代理服务器,它接受 TCP 端口 80 上的流量并将其发送到 TCP 端口 8080 上的 Web 服务器。如果端口 80 已被使用,这也将起作用。只需将反向代理服务器放在两个 Web 服务器的前面,让它们都侦听 80 以外的端口。

为了提供更好、更详细的帮助,说明哪个选项可能是最好的以及限制等,我们需要更多地了解您的设置。希望这个解释已经澄清了一些事情。


Sti*_*lez 7

简单的答案,与问题的级别有关

忽略 DNS 的异国使用,以及反向 DNS 查找(与问题无关),几乎所有 DNS 使用都采用以下形式:

  1. 客户端将域名(完全限定或其他)发送到 DNS 服务器
  2. DNS 服务器从其记录中返回域信息。通常请求的关键信息要么是与该域上的网络/电子邮件通信的 IP 地址,要么是能够更好地提供该信息的另一个 DNS 服务器的 IP 地址。

一旦客户端联系了服务器,服务器本身就会接管,DNS 系统就会消失。

这意味着,DNS 系统不需要提供端口信息,而且几乎从不提供。因此,尽管这个问题的目的是有效的,而且经常这样做,但实际上并不是 DNS 系统在这样做。这就是为什么你不能解决它:)

这个想法是,一旦您的客户端可以找到它正在寻找的特定机器或服务器,那台机器就可以监听它选择的任何端口,并接受/拒绝/响应任何配置的端口上的任何协议。

例如,HTTP Web 服务通常在端口 80 上提供。这意味着一旦客户端知道机器 IP,它可以假设向端口 80 发送消息将导致该消息被该机器的 Web 服务读取/响应。但也不必如此。如果服务器配置为在端口 9000 上侦听 Web 传入请求,则任何能够访问端口 9000 的客户端都将能够访问其 Web 服务。如果服务器位于将端口 10000 重定向到端口 9000 的代理/NAT/路由器之后,并且客户端在端口 10000 上发送 Web 请求,则服务器将在端口 9000 上接收它并做出响应。

Web 服务器内的重定向/映射

您在评论中询问了重定向映射或重写。这些是 Web 服务器可以执行的功能。基本上,您可以配置 Web 服务器(或大多数/许多 Web 服务器)来管理它如何处理它在请求中收到的 URL。因此,它可以在收到时内部修改 URL 以使不同的 URL 以相同的方式处理,或者修复常见的错别字(映射),或者它可以实际响应告诉客户端本身第二次询问,使用一些不同的、替换的 URL (重定向)。

这些有它们的用途,原则上可以处理您的用例,但由于以下原因,它们听起来不像您的“正确”解决方案:

  1. 我认为映射根本没有帮助。映射几乎完全在 Web 服务器内部进行,它说“将此URL 视为URL”。例如,您可以使用 Web 服务器 URL 映射来允许用户使用“ https://example.com/index.php?area-=forum&topic ”(为了用户方便)使用非常旧的、旧的和当前的 URL 来查询论坛=2 ”,还有“ https://example.com/forum.php?topic=2 ”和“ https://forum.example.com?topic=2””,并且只处理一次,通过在内部将前两个映射到第三个 URL,作为处理查询的第一步。由于此目标影响查询路径而不是 IP/端口,因此映射对于端口管理,在您的情况下,客户端实际上根本没有查询 8080。
  2. 重定向会起作用,但可能不是您想要的。Web 服务器中的重定向依赖于实际接收查询的 Web 服务器(因为这些是 Web 服务器内部功能)。因此,Web 服务器无论如何都必须侦听端口 80 以获取原始查询,以便使用重定向/映射进行响应。这将有侦听端口8080在功能上,它需要一个重定向规则必须告诉任何客户端查询端口80,它再次使用查询“:8080” URL,这听起来并不像你想什么做。用户还会看到包含“:8080”的新 URL,但听起来您希望它是“透明的”而不显示。
  3. 此外,重定向只能用于重定向标准端口(80 或 443) ——比如说,你不能将端口 2000 重定向到 8080,因为客户端在默认情况下不会在 2000 上查询,首先,所以它永远不会访问 Web 服务器,即使它在 2000 上侦听。不过,这对您来说可能不是问题。

但是,如果您想要“智能”重定向,其中只有某些查询被重新路由到 8080,这可能是要走的路,因为重定向可以包含决定哪些 URL 应该重定向的逻辑,而端口映射(下面)将映射所有内容

如何正确做

您的问题的答案是,您希望 Web 服务器响应客户端发送到默认端口 (80/443) 但服务器实际在端口 8080 上接收的 Web 请求。

这意味着,如您所见,您需要在客户端和服务器之间映射端口的东西。这样,客户端在端口 80(Web 浏览器使用的默认端口)上发送,但它实际上是由 Web 服务器在端口 8080 上接收的。当然,您必须将 Web 服务器配置为侦听端口 8080,因为这不是标准的,但它很容易并且任何 Web 服务器都应该能够指定其侦听端口。

最常用的方法是在路由器/防火墙内,通过端口映射。

简单来说,要做到这一点,路由器被赋予一个规则,任何接收到的目标 IP 和目标端口 = 80 的内容都应该传递到 LAN,而目标端口改为 8080。Web 服务器和客户端都不会意识到更改(它 100% 由路由器处理),因此对它们两者都是 100% 透明的。客户端的 URL 中不会有 ":8080" 并且不需要重定向任何东西,因为它查询端口 80,并且 Web 服务器可以忽略端口 80 并只侦听 8080,因为它永远不会在端口 80 上查询.

如果您想要一种简单、直接的方法,类似于“端口 DNS”的作用,这可能与您在问题中所要求的最接近。


TOO*_*GAM 5

你不能。

我的意思是,从技术上讲这是可以做到的。DNS 因能够提交域名并获取 IP 地址而闻名。不过,我对 DNS 协议进行了一些研究,实际上 DNS 在技术上能够充当查询/响应机制,而不仅仅是域名和 IP 地址。一种可能的方法是使用非典型 A 或 AAAA 类型的 DNS 资源记录,例如 TXT 记录(技术上只是文本,可用于任何用途)或 SRV 记录,或任何其他记录您选择的较新的资源记录类型。

如果您正在编写自己的软件(客户端和服务器),则可能没有技术原因不这样做,除非您知道有些人使用 DNS 托管公司并限制他们仅使用某些记录类型。这很不幸,因为运行自己的 DNS 服务器的人当然有足够的灵活性来处理此类事情。

但是,如果您没有制定自己的网络协议(例如,如果您想使用 HTTP),则可能会遇到一个主要问题,即现有软件不会使用您的自定义解决方案,除非您使用已经建立的解决方案。这将成为障碍。并非技术上不可能。社会障碍:你能说服每个人都按照你的方式做事吗?

现在我已经解释了为什么你不能这样做,不过,我可能有一个解决方案来满足你的需求。首先,让我们看看为什么我们有 IP 地址和端口。

IP 地址和端口执行不同的操作。IP 地址的目的是实现网络通信 OSI 模型第 2 层和第 3 层的目标。IP 地址的目的是识别流量应发送至哪台计算机。事实上,我们可以通过让防火墙/路由器调查端口号来执行 NAPT(基于网络地址端口的转换,有时也称为 PNAT 或 NAT)来使用端口号,这是一种较新的技术,它利用资源(信息),但不是原始设计的一部分。如果我们暂时远离这种对端口号的“滥用”,并考虑最初的设计,我们也许能够找到一个更简单的解决方案。根据互联网的设计,应该使用 IP 地址来找到机器。

TCP 和 UDP 以及一些替代方案使用的“端口号”的目的是能够跟踪各个对话。这有助于与正在运行的程序进行通信。因此,如果一台机器在 TCP 端口 80 上收到流量,该机器就会知道网络流量将由 Web 服务器程序使用。如果网络浏览器同时下载多个图形,“源端口”号和“目标端口”号的组合可以跟踪哪些数据适用于哪个图形,因此可以在不混淆数据的情况下进行这些同时对话。

现在,我的猜测是您可以访问 DNS 服务器,并且您似乎认为 DNS 管理会很方便,能够更多地处理一些流量路由。但是DNS似乎不能帮你获取端口号。你能做什么?

考虑 IPv6。IPv6 使您能够拥有更多的 IP 地址。此外,与 IPv4 的某些实现不同,使用 IPv6 的设备通常可以轻松地同时支持多个活动 IPv6 地址。因此,如果您想在一台计算机上使用三种不同的网络协议,则可以为同一台计算机分配至少三个不同的 IPv6 地址。然后您可以使用这些 IPv6 地址进行任何您喜欢的路由恶作剧。

然后,您可以使用 AAAA 资源记录类型为该 IPv6 地址分配一个名称,您的网络设计可以将其视为有效专用于您想要的特定计算机上的特定服务。

Wallah,您现在已经拥有了有效地指向该软件的 DNS,并且无需尝试依赖于使 DNS 指向端口号即可实现该目标,这不能很好地工作,只是因为该功能恰好不常见支持的。

可能的反对意见:
如果您对 IPv4 感到困惑,并认为 IPv6 在某种程度上不受支持,我会鼓励您尝试解决该问题。这个问题可能会更容易解决(也许使用某种隧道),并且一旦实施,最终可能会成为一个更有价值的解决方案。