如何将DNS重定向到不同的端口

时间:2013-09-25 21:00:51

标签: networking dns minecraft

我拥有域名“Arboristal.com”。我还在arboristal.com上私下拥有所有子域名。例如lg.arboristal或ft.arboristal.com。

在我的DNS设置下,Arboristal.com将设置为我们当前托管我们网站的网站托管服务商。

我家里有三台运行在一个公共IP地址下的服务器。 (71.82.237.27)

我还有三个Arboristal.com子域名指向我的IP地址。

三个服务器中的每一个都在自己的端口上运行(25565,25566,25567)

我希望每个子域指向我的IP地址上的每个开放端口。

不幸的是,当您尝试使用其中一个子域连接到其中一个服务器时,它只会连接到您键入端口的服务器。

我的情况:

三台服务器,每台服务器在不同的端口上运行。 (所有portforwarded和作为服务器工作)

Minecraft服务器一(25565)

Minecraft服务器二(25566)

Minecraft服务器三(25567)

我在DNS提供商(webs.com)上运行了三个子域名

mc.arboristal.com

tekkit.arboristal.com

pvp.artboristal.com

当您使用Minecraft连接到其中一个时,它会自动通过端口25565,这意味着无论您尝试连接到哪个URL,它总是通过端口25565转到我的IP。将您连接到Minecraft服务器之一。您可以手动输入端口,但我希望尽可能保持良好的外观和专业。

所以,既然你了解我的情况,我有没有办法让mc.arboristal.com,tekkit.arboristal.com和pvp.arboristal.com都可以在不同的端口下访问我的IP地址而不必指定提供的URL中的每个端口以连接到用户端?

我可以将MX,A(使用此连接到服务器),CNAME和TXT记录添加到DNS设置

如果我需要使用第三方作为我的DNS提供商,我还可以将名称服务器添加到DNS设置。 (如果有必要,我愿意这样做)

如果需要在那里配置任何东西,我也可以完全访问我的路由器192.168.0.1。

我刚才刚刚了解到互联网在上周的运作方式,所以我不确定这里是否有任何可行的东西。我也可能没有关于互联网如何实际运作的正确信息。请原谅我有关互联网的任何虚假信息。

5 个答案:

答案 0 :(得分:37)

您可以使用SRV records

_service._proto.name. TTL class SRV priority weight port target.
  

服务:所需服务的符号名称。

     

Proto:所需服务的传输协议;这通常是TCP或UDP。

     

名称:此记录有效的域名,以点结尾。

     

TTL:标准DNS生存时间字段。

     

类:标准DNS类字段(始终为IN)。

     

优先级:目标主机的优先级,值越低意味着更优先。

     

权重:具有相同优先级的记录的相对权重。

     

端口:要在其上找到服务的TCP或UDP端口。

     

目标:提供服务的机器的规范主机名,以点结尾。

示例:

_sip._tcp.example.com. 86400 IN SRV 0 5 5060 sipserver.example.com.

所以我认为你正在寻找的是在你的DNS hosts file中添加这样的内容:

_sip._tcp.arboristal.com. 86400 IN SRV 10 40 25565 mc.arboristal.com.
_sip._tcp.arboristal.com. 86400 IN SRV 10 30 25566 tekkit.arboristal.com.
_sip._tcp.arboristal.com. 86400 IN SRV 10 30 25567 pvp.arboristal.com.

另外,我强烈建议您选择托管公司,而不是自己托管服务器。它只是要求您的家庭连接出现问题(DDoS和带宽/连接速度),但这取决于您。

答案 1 :(得分:7)

(自从我做了这些事以来已经有一段时间了。请不要盲目地认为所有下面的详细信息是正确的。但我希望我不是令人尴尬的错误。:))

正如之前的回答所述,Minecraft客户端(as of 1.3.1)使用服务名称_minecraft和协议名称_tcp支持SRV record查找,这意味着如果您的区域文件看起来像这样......

arboristal.com.                 86400 IN A   <your IP address>
_minecraft._tcp.arboristal.com. 86400 IN SRV 10 20 25565 arboristal.com.
_minecraft._tcp.arboristal.com. 86400 IN SRV 10 40 25566 arboristal.com.
_minecraft._tcp.arboristal.com. 86400 IN SRV 10 40 25567 arboristal.com.

...然后在更改日志中暗示执行SRV记录查找的Minecraft客户端将优先使用端口25566和25567(每个端口的40%)通过端口25565(20%的时间)。我们可以假设找到并尊重这些SRV记录的Minecraft客户端将像往常一样使用端口25565。

然而,我认为它实际上会更加干净和专业。使用Nginx等负载均衡器来完成此操作。 (我选择Nginx只是因为我之前已经使用过它。我并没有声称它非常适合这项任务。出于某种原因,它甚至可能是糟糕的选择。)那么你不必弄乱你的DNS,你可以使用相同的方法来负载平衡任何服务,而不仅仅是像Minecraft那样碰巧完成了硬客户端寻找和尊重SRV记录的工作。要以Nginx方式执行此操作,您需要在arboristal.com计算机上运行Nginx,其中包含/etc/nginx/sites-enabled/arboristal.com中的以下内容:

upstream minecraft_servers {
    ip_hash;
    server 127.0.0.1:25566 weight=1;
    server 127.0.0.1:25567 weight=1;
    server 127.0.0.1:25568 weight=1;
}
server {
    listen 25565;
    proxy_pass minecraft_servers;
}

这里我们在服务器端控制负载平衡(通过Nginx),因此我们不再需要担心行为不端的客户端可能更喜欢端口25565到其他两个端口。事实上,现在所有客户端都会与arboristal.com:25565对话!但是该端口上的监听器不再是Minecraft服务器;它是Nginx,秘密地将所有流量代理到同一台机器上的其他三个端口上。

我们根据客户端IP地址(ip_hash)的哈希值进行负载均衡,这样如果客户端断开连接然后重新连接,那么它很可能会出现这种情况。 ;我将重新连接到之前的Minecraft服务器。 (我不知道这对Minecraft有多重要,或者SRV支持的客户如何编程来处理这方面。)

请注意,我们曾经在端口25565上运行Minecraft服务器;我已将其移至端口25568,以便我们可以将端口25565用于负载均衡器。

Nginx方法的一个可能的缺点是它会使Nginx成为系统中的瓶颈。如果Nginx出现故障,则所有三台服务器都无法访问。如果系统的某些部分无法跟上单个端口25565上的流量,那么所有三个服务器都会变得不稳定。更不用说,Nginx是你生态系统中一个重要的新依赖。也许你不想推出另一款带有复杂配置语言和巨大攻击面的大型软件。我可以尊重这一点。

Nginx方法的一个可能的优势是......它使得Nginx成为你系统的瓶颈!您可以通过Nginx应用全局策略,例如拒绝超过特定大小的数据包,或使用静态网页响应端口80上的HTTP连接。您还可以从Internet防火墙端口25566,25567和25568,因为现在它们应该通过环回接口与Nginx进行的讨论。这会稍微减少你的攻击面。

Nginx还可以更轻松地向您的后端添加新的Minecraft服务器;现在,您只需在配置和server中添加service nginx reload行即可。使用旧的基于端口的方法,您必须在DNS提供商处添加新的SRV记录(客户端可能需要86400秒才能注意到更改),然后 记得编辑防火墙(例如/etc/iptables.rules)以允许通过该新端口的外部流量。

Nginx还可以让您在进行操作更改时不必考虑DNS TTL。假设您决定将三台Minecraft服务器拆分为三台具有不同IP地址的不同物理机器。使用Nginx,您可以通过配置更改到server行完全完成,并且可以将这些新机器保留在防火墙内(通过专用接口仅连接到Nginx),并且更改将立即生效,定义。然而,使用SRV记录,您必须将您的区域文件重写为类似的内容...

arboristal.com.                 86400 IN CNAME mc1.arboristal.com.
mc1.arboristal.com.             86400 IN A   <a new machine's IP address>
mc2.arboristal.com.             86400 IN A   <a new machine's IP address>
mc3.arboristal.com.             86400 IN A   <a new machine's IP address>
_minecraft._tcp.arboristal.com. 86400 IN SRV 10 20 25565 mc1.arboristal.com.
_minecraft._tcp.arboristal.com. 86400 IN SRV 10 40 25565 mc2.arboristal.com.
_minecraft._tcp.arboristal.com. 86400 IN SRV 10 40 25565 mc3.arboristal.com.

...并且您必须将所有三台新机器都放在外面防火墙上,以便它们可以从Internet接收连接。 您必须等待86400秒才能让客户注意到更改,这可能会影响您的部署计划的复杂性。如果您在arboristal.com上运行任何其他服务(例如HTTP服务器),,现在您必须将它们移动到mc1.arboristal.com计算机,因为我是如何执行该CNAME的。我之所以这样做只是为了那些不尊重SRV记录且仍会尝试连接到arboristal.com:25565的假想的Minecraft客户。

所以,我认为两种方式(SRV记录和Nginx负载平衡)都是合理的,您的选择将取决于您的个人偏好。我将选项讽刺为:

  • SRV记录:&#34;我只是需要它才能工作。我不想要复杂性。我知道并信任我的DNS提供商。&#34;
  • Nginx:&#34;我预见arboristal.com接管世界,或者至少有一天会搬到更大的机器上。我并不害怕学习新工具。什么是区域文件?&#34;

答案 2 :(得分:1)

使用 SRV 记录。 如果您使用 freenom,请访问 cloudflare.com 并将您的 freenom 服务器连接到 cloudflare(freenom 不支持 srv 记录)使用 _minecraft 作为服务 tcp 作为协议,您的 ip 作为目标(您需要“a”记录才能使用您的 ip。我建议不要使用您的“Arboristal.com”域作为“a”记录。如果您使用“Arboristal.com”作为您的“a”记录黑客可以进入您的路由器设置并入侵您的网络)优先级 - 0,权重 - 0和端口 - 您要使用的端口。(我知道这是因为我处于相同的情况)对任何域提供商执行相同操作。 (对不起,如果我拼写错误)

答案 3 :(得分:0)

可能的解决方案:

  1. 在服务器上使用nginx作为代理,它将侦听端口A并复用到端口B或C。

  2. 如果您使用AWS,则可以使用负载均衡器根据host将请求重定向到特定端口。

答案 4 :(得分:0)

由于我在理解这篇文章时遇到了麻烦,因此这里是对像我这样的人的简单说明。在以下情况下很有用:

  • 您不需要负载均衡。
  • 您不想使用nginx进行端口转发。
  • 您确实想使用SRV记录根据特定子域进行端口转发。

这就是您需要做的:

SRV记录:

_minecraft._tcp.1.12          IN SRV    1 100 25567 1.12.<your-domain-name.com>.
_minecraft._tcp.1.13          IN SRV    1 100 25566 1.13.<your-domain-name.com>.

(我不需要1.14的srv记录,因为我的1.14 minecraft服务器已经在25565端口上,这是minecraft的默认端口。)

A记录:

1.12                          IN A      <your server IP>
1.13                          IN A      <your server IP>
1.14                          IN A      <your server IP>