我的DNS记录只能指向IP地址。如何到达港口?


10

我是网络管理的新手,因此很高兴能成功设置DNS记录。

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

http://www.example.org:8080/fetch/characters/

实际达到这个目的

http://www.example.org/fetch/characters/

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

我怎样才能做到这一点?我的服务器上需要一些特殊的应用程序吗?还是将任何重定向的东西应用于请求?


4
默认情况下,浏览器不访问端口8080。这是键入问题时的错误吗?
Džuris

对dns是什么及其作用的误解。
CONvid19

@Džuris娜这是我的思维8080个错误是HTTP的默认,而不是80
xetra11

Answers:


32

DNS记录不能指向端口(有一些例外情况例外,不适用于此处)。

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

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

10
如果我们可以使用SRV记录并为服务指定端口,该怎么办...糟糕的浏览器不使用它。
雅各布·埃文斯

4
@JacobEvans:SRV记录的一切都是我的古老梦想。它将使事情变得如此简单(防火墙管理员现在可以阻止除80和443以外的所有内容)
Sven

SRV记录对于某些服务(例如XMPP)非常有效,但是可惜不是很多(当然不是HTTP)
Josh

选项4:通过防火墙进行端口转发
Joel Coel

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以外的端口。

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


我已经有了所需的信息!我将80 80的默认Web端口误认为是8080
xetra11

7

简单的答案,与问题的程度有关

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

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

客户端与服务器联系后,服务器本身将接管服务器,DNS系统将从画面中消失。

这就是说,DNS系统不需要提供端口信息,并且几乎永远不会提供。因此,尽管该问题的目的是有效的且经常实现,但实际上不是DNS系统执行此任务。这就是为什么你无法解决问题的原因:)

这样的想法是,一旦您的客户端可以找到它要查找的特定计算机或服务器,它就取决于该计算机来监听其选择的任何端口,并在配置的任何端口上接受/拒绝/响应任何协议。

例如,通常在端口80上提供HTTP Web服务。这意味着,一旦客户端知道机器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,所以永远不会即使它正在侦听2000,也要访问Web服务器。但这对您来说可能不是问题。

但是,如果您要“智能”重定向,即仅将某些查询重新路由到8080,这可能是可行的方法,因为重定向可以包含确定应该重定向哪些URL的逻辑,而端口映射(如下)将映射所有内容

如何正确做

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

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

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

简而言之,要做到这一点,路由器将获得一个规则,即接收到的任何目标IP为80且目标IP为80的东西都应传递到LAN,而目标端口改为8080。Web服务器和客户端都不会知道更改(路由器100%处理了更改),因此对它们两者都是100%透明的。客户端的URL中不会有“:8080”,也不需要重定向任何内容,因为它查询端口80,并且Web服务器可以忽略端口80而仅侦听8080,因为它永远不会在端口80上获取查询。 。

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


我经常听到有关重定向映射或重写的信息?这些解决方案也是吗?
xetra11

这些都是踢修饰符的Web服务器,在处理客户端的命令。因此,如果Web服务器支持它,则您可以自动响应端口80上的任何查询,并使用HTTP重定向到端口8080上的相同URL-毕竟,HTTP / 80-> HTTPS / 443重定向几乎是同一回事。但是它必须能够首先接收查询,因此它无法在未配置为侦听的端口上运行,并且客户端可能会看到:8080修改后的URL。通过端口映射执行此操作会使客户端100%看不到它,因为它们只使用端口80(8080仅是内部100%)
Stilez

我添加了“在Web服务器中重定向/映射”部分,并扩展了最后一部分,以更详细地介绍您的问题。希望他们能帮上忙!
Stilez

3

你不能

我的意思是,从技术上讲,这可以做到。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,我鼓励您尝试解决该问题。可能更容易解决该问题(也许使用某种隧道),并且一旦实施,最终可能会得到更大的回报。


IPv6总是很容易受到支持,但是如果由于某种原因现在允许使用端口80(或443),将无济于事。
圣保罗Ebermann

的确如此,但是如果DNS设法传达了一个端口号,那么在阻止特定端口号上的流量的防火墙周围也无法正常工作。除此之外,我对如何使用IPv6的解释实际上只是答案的一部分,而且我确实相信答案的较早部分解决了这个问题。
TOOGAM
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.