我对网络管理相当陌生,因此很高兴能够成功设置 DNS 记录。
现在我有点困惑,因为我想要这个 URL:
http://www.example.org:8080/fetch/characters/
实际达到这个
http://www.example.org/fetch/characters/
因此用户无需显式设置端口即可访问 8080 端口上的服务。
我怎样才能做到这一点?我的服务器上需要一些特殊的应用程序吗?或者要应用于请求的任何重定向内容?
我对网络管理相当陌生,因此很高兴能够成功设置 DNS 记录。
现在我有点困惑,因为我想要这个 URL:
http://www.example.org:8080/fetch/characters/
实际达到这个
http://www.example.org/fetch/characters/
因此用户无需显式设置端口即可访问 8080 端口上的服务。
我怎样才能做到这一点?我的服务器上需要一些特殊的应用程序吗?或者要应用于请求的任何重定向内容?
DNS 记录不能指向端口(有一些不适用的特殊情况例外)。
如果您在端口 8080 上有一个 Web 服务侦听并且想要在不指定此端口的情况下访问它,您有 3 个选项:
:8080
在重定向后在其地址栏中看到该部分。默认情况下,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 以外的端口。
为了提供更好和更详细的帮助,说明哪个选项可能是最好的以及限制等,我们需要更多地了解您的设置。希望这个解释已经澄清了一些事情。
简单的答案,与问题的级别有关
忽略 DNS 的外来使用,以及反向 DNS 查找(与问题无关),几乎所有 DNS 使用都是以下形式:
一旦客户端联系了服务器,服务器本身就会接管,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 (重定向)。
这些有其用途,原则上可以处理您的用例,但它们听起来不像您的“正确”解决方案,原因如下:
但是,如果您想要“智能”重定向,其中只有某些查询被重新路由到 8080,这可能是要走的路,因为重定向可以包含决定哪些 URL 应该被重定向的逻辑,而端口映射(如下)将映射所有内容。
如何正确做
您的问题的答案是,您希望 Web 服务器响应客户端发送到默认端口 (80/443) 的 Web 请求,但服务器实际在端口 8080 上接收这些请求。
这意味着,如您所见,您需要在两者之间映射客户端和服务器之间的端口。这样,客户端在端口 80(Web 浏览器使用的默认端口)上发送,但实际上是由 Web 服务器在端口 8080 上接收的。当然,您必须将 Web 服务器配置为侦听端口 8080,因为这不是标准的,但它很容易,并且任何 Web 服务器都应该能够指定其侦听端口。
最常用的方法是在路由器/防火墙内,通过端口映射。
简单来说,要做到这一点,给路由器一个规则,任何接收到的目标 IP 和目标端口 = 80 的东西都应该被传递到 LAN 中,而目标端口改为 8080。Web 服务器和客户端都不会意识到更改(它 100% 由路由器处理),因此它们对两者都是 100% 透明的。客户端不会在其 URL 中包含“:8080”并且不需要重定向任何内容,因为它查询端口 80,并且 Web 服务器可以忽略端口 80 并仅侦听 8080,因为它永远不会在端口 80 上获得查询.
如果您想要一种简单、直接的方式,类似于“用于端口的 DNS”,这可能是您在问题中所要求的最接近的等价物。
你不能。
我的意思是,从技术上讲,这是可以做到的。DNS 以能够提交域名和获取 IP 地址而闻名。但是,我对 DNS 协议进行了一些研究,实际上 DNS 在技术上能够充当查询/响应机制,而不仅仅是域名和 IP 地址。一种可能的方法是使用不是典型 A 或 AAAA 类型的 DNS 资源记录,例如 TXT 记录(从技术上讲,它只是文本,可以用于任何事情)或者可能是 SRV 记录,或任何其他您选择的较新的资源记录类型。
如果您正在编写自己的软件(客户端和服务器),可能没有技术原因不这样做,除非知道有些人使用 DNS 托管公司并限制他们仅使用某些记录类型。这很不幸,因为运行自己的 DNS 服务器的人当然对这些事情有足够的灵活性。
但是,如果您没有自己制定网络协议(例如,如果您想使用 HTTP),您可能会遇到一个主要问题,即现有软件不会使用您的自定义解决方案,除非您使用已经建立的解决方案。那将是障碍。不是技术上的不可能。社会障碍:你能说服每个人按照你的方式做事吗?
既然我已经解释了为什么你不能这样做,那么我可能会为你所追求的提供解决方案。首先,让我们看看为什么我们甚至有 IP 地址和端口。
IP 地址和端口做不同的事情。IP 地址的目的是实现 OSI 网络通信模型的第 2 层和第 3 层的目标。IP 地址的目的是识别流量应该流向哪台计算机。我们可能会为此目的使用端口号,通过让防火墙/路由器调查端口号以执行 NAPT(基于网络地址端口的转换,有时也称为 PNAT 或简称为 NAT),这是一种利用资源(信息),但不是原始设计的一部分。如果我们暂时远离这种“滥用”端口号,并考虑最初的设计,我们或许能够找到更简单的解决方案。根据 Internet 的设计,机器应该使用 IP 地址来查找。
TCP 和 UDP 以及一些替代方案使用的“端口号”的意义在于能够跟踪单个对话。这有助于与正在运行的程序进行通信。因此,如果一台机器在 TCP 端口 80 上接收到流量,该机器将知道网络流量是由作为 Web 服务器的程序使用的。如果 Web 浏览器同时下载多个图形,“源端口”编号和“目标端口”编号的组合可以跟踪哪些数据用于哪个图形,因此可以同时进行这些对话而不会混淆数据。
现在,我的猜测是您可以访问 DNS 服务器,并且您似乎认为 DNS 管理能够方便地处理一些流量路由。但是 DNS 似乎无法帮助您获取端口号。你能做什么?
考虑 IPv6。IPv6 使您能够拥有更多的 IP 地址。此外,与 IPv4 的某些实现不同,使用 IPv6 的设备通常可以轻松地同时支持多个活动的 IPv6 地址。因此,如果您想在一台计算机上拥有三种不同的网络协议,您可以为同一台计算机分配至少三个不同的 IPv6 地址。然后你可以用这些 IPv6 地址做任何你喜欢的路由恶作剧。
然后,您可以使用 AAAA 资源记录类型为该 IPv6 地址分配一个名称,您的网络设计可以将其视为有效地专用于您想要的特定计算机上的特定服务。
Wallah,您现在让 DNS 有效地指向了该软件,并且无需尝试依赖使 DNS 指向端口号就实现了该目标,这不能很好地工作,因为该功能恰好不常见支持的。
可能的反对意见:
如果您觉得 IPv4 卡住了并且认为 IPv6 不支持,我会鼓励您尝试解决这个问题。这个问题可能会更容易解决(也许使用某种隧道),并且一旦你实施它可能最终会成为一个更有价值的解决方案。