我拥有域名“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。
我刚才刚刚了解到互联网在上周的运作方式,所以我不确定这里是否有任何可行的东西。我也可能没有关于互联网如何实际运作的正确信息。请原谅我有关互联网的任何虚假信息。
答案 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负载平衡)都是合理的,您的选择将取决于您的个人偏好。我将选项讽刺为:
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)
可能的解决方案:
在服务器上使用nginx作为代理,它将侦听端口A并复用到端口B或C。
如果您使用AWS,则可以使用负载均衡器根据host将请求重定向到特定端口。
答案 4 :(得分:0)
由于我在理解这篇文章时遇到了麻烦,因此这里是对像我这样的人的简单说明。在以下情况下很有用:
这就是您需要做的:
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>