如何仅为多个 Minecraft 服务器打开 TCP 端口 25565?

如何仅为多个 Minecraft 服务器打开 TCP 端口 25565?

我想要创建多个 Minecraft 服务器,它们将在我的网络中的多台服务器上运行。

主要目的是只有一个面向 Internet 的端口 (TCP 25565),然后将请求主机名 (mc.example.com) 传递到正确的后端服务器。

有什么方法可以实现这一点吗?我知道可以使用反向代理,但它是用于 HTTP 的,那么有什么方法可以实现 Minecraft 的这一功能吗?

编辑:正如@attie 所说,不可能将单个 IF 端口用于多个 Minecraft 服务器。

现在,假设我为这些服务器开放了 10 个端口(25565 到 25575)。接下来我应该怎么做才能让这个功能更加方便用户使用?我的意思是,当用户进入 mc.example.com 时直接将用户重定向到 IF 端口?

答案1

这种方法对 HTTP 有效的唯一原因是Host:协议中有一个可以检查的标头。如果协议中没有指示连接应路由到何处的内容,则无法通过监听单个端口来执行此操作。

我不相信 Minecraft 协议中包含这些额外信息...如果您 100% 受限于单个面向互联网的端口,那么您的选项就不方便用户使用:

  • 隧道(例如:VPN / SSH / SOCKS)- 用户需要在他们那边设置软件。连接后,他们就可以连接到实际的 Minecraft 服务器。笔记:这也可能会影响可玩性(即增加延迟)
  • 基于源的数据包路由 - 每个用户可以访问一台服务器,但根据用户的连接位置,他们可能会看到不同的服务器。

我建议您监听多个端口。

答案2

你可以尝试Bind9Linux(我使用 Debian 和 raspberrypi [Raspbian])SVR 记录

  • 在Linux中安装Bind9:sudo apt-get 安装 bind9 bind9-doc -y
  • 安装完成后重新启动Bind9的守护进程:/etc/init.d/bind9 重新启动

您需要创建您的第一个域,为此您需要执行以下操作:

zone "origensone.net" {
        type master;
        file "/var/lib/bind/origensone.net.hosts";
};

上面的文字是这个域名的 DNS 数据库的配置文件链接。(这是你需要在文件中输入我告诉你的内容才能继续)
例如我的域名是这样的:origensone.net

文件:/etc/bind/named.conf.local
//
// Do any local configuration here
//

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";

// This is a new area for our domain:
zone "origensone.net" {
        type master;
        file "/var/lib/bind/origensone.net.hosts";
};
  • 文件“/var/lib/bind/origensone.net.hosts”是带有子域的 DNS 的位置,是此域和子域的 DNS 数据库、ALIAS、CNAME 等。

这是我在本地 DNS 服务器中拥有 Minecraft 服务器的方式:

文件:/var/lib/bind/origensone.net.hosts
$ttl 3600
origensone.net.    IN    SOA    DnsServer. (
            1616892692 ; Serial
            3600 ; Refresh
            600 ; Retry
            1209600  ; Expire
            3600 ) ; Minimum
origensone.net.    IN    NS    DnsServer. ; --// DnsServer is the hostname of the machine == 127.0.0.1 or 192.168.1.10 == DnsServer.local //--
origensone.net.    IN    A    <PublicIP (of IP Router)>

; --// Subdomain to IP Directions: //--
dnsservidor        IN    A    <PrivateIP-1_for_DNSServerHosting> ; --// 192.168.1.10 for example for the DNSServer. //--
mcservidor        IN    A    <PrivateIP-2_for_MinecraftServerHosting>  ; --// 192.168.1.11 for the server of minecraft hosting servers. //--
mcservidortorouter        IN    A    <PublicIP (of IP Router)>

; --// The Canonical Names: //--
mcmods                    IN    CNAME    mcservidor
mcsurvi                    IN    CNAME    mcservidor

; --// This're the SVR records: //--
_minecraft._tcp.mcsurvi.origensone.net. SRV 0 5 25566 mcservidortorouter.origensone.net. 
_minecraft._tcp.mcmods.origensone.net. SRV 0 5 25567 mcservidortorouter.origensone.net.

_服务_协议.名称。 生存时间 班级 服务车辆 优先事项 重量 港口 目标_minecraft_tcpmcsurvi.origensone.net。 服务车辆 0 5 25566 mcservidortorouter.origensone.net。

  1. _服务 =_minecraft
  2. _协议.名称 =_tcp
  3. TTL 与生存时间相同(在默认)。
  4. 等级 =韓國
  5. 服务车辆
  6. 优先级 =0
  7. 重量 =5
  8. 端口 =25566
  9. 目标 →mcservidortorouter.origensone.net。

localhost 是 IP:127001

这是一个例子SVR 记录;在这种情况下,我使用两个子域名别名可以获得两个服务器: origensone.net(领域):

  1. 麦克苏维(子域名)→ 为了生存 =麦克苏维origensone.net
  2. 麦克莫德斯(子域名)→ 对于 mods =麦克莫德斯origensone.net

当你拥有 Bind9 DNS 服务器并完成所有部分后,请在此处找到说明以确认哪些部分可以正常工作将 DNS 端口设为这里!

或者当您完成确认一切正常后,您需要执行以下操作:

  1. 在 Linux 终端中输入以下命令:
  • nslookup
     # Press Enter.
    set query=srv
    _minecraft._tcp.mcsurvi.origensone.net
    

这是在 Windows CMD 中:[灰色区域是我被谴责的公共 IP] 在此处输入图片描述

这是在 Raspbian (DnsServer) 中:[灰色块是我对受到谴责的事物的称呼] 在此处输入图片描述

要尝试执行此操作,您可以在同一台服务器中或在该主机的网卡上连接该 DNS 服务器的其他计算机上执行此操作。

如果一切正常,当我们对此 subdomain.domain 执行 PING 时,控制台会正确地显示以下信息192.168.1.11或者与 Minecraft 托管服务器的 IP 相同。

答案3

有一个名为“Minecraft 重定向代理”的项目(https://github.com/RenegadeEagle/minecraft-redirect-proxy) 正是您想要的。

@attie Minecraft 协议确实包含请求的主机名。它与服务器收到的第一个数据包一起发送。

配置也非常简单。这里有一个未经测试的例子:

{
  "versionName": "ProxyCup",
  "maxPlayers": 0,
  "onlinePlayers": 0,
  "motd": "Couldnt connect to requested backend server. If you believe this to be an issue, contact the administrator of this proxy.",
  "port": 25565,
  "nodes": [
    {
      "hostname": "domain1.com",
      "remoteHostname": "localhost",
      "remoteHostPort": 25566
    },
    {
      "hostname": "domain2.com",
      "remoteHostname": "localhost",
      "remoteHostPort": 25567
    }
  ]
}

相关内容