我已经在互联网上搜索了这个问题几个小时,但似乎找不到解决方案,或者我所尝试的方法是否可行。
我采用双 NAT,但目前为止还没有出现问题。
我的域名是我的域名并且其关联的 IP 是动态的。我托管各种不同类型的服务器(游戏、网络、语音、聊天)。域名注册商允许我为我的域名设置 10 个子域名,所有子域名都使用相同的 IP 进行更新。
我很乐意使用这些子域名在逻辑上区分服务。例如,将 game.mydomain.com 用于我的所有游戏服务器,将 voice.mydomain.com 用于 VoIP 服务,将 chat.mydomain.com 用于我的聊天服务。
目前,我可以使用所有子域访问我的 Minecraft 服务器,因为它们都解析到同一个 IP,这是预期的行为。
现在回答我的问题: 有没有办法让 Minecraft 仅在连接所用的地址为“game.mydomain.com”时做出响应?同样适用于其他服务。
我研究过反向代理,但了解到它们根据标头中的协议进行重定向,因此通常仅用于 HTTP/HTTPS。
感谢您花时间回复。
附言:我知道在这种情况下(动态 IP)托管服务不是良好的实践方式,但我不知道没有人访问这些服务,他们也不介意 IP 改变时的短暂断开连接。
答案1
这适用于 HTTP,因为您的浏览器在标头中明确地告诉服务器用于请求资源的地址Host
。
当然,其他协议也可能支持类似的机制。但是,一般来说,网络协议则不然。一个值得注意的例外是带有 SNI 的 TLS。客户端仍然必须明确支持它。
没有办法做到这一点。
不过,您仍然可以拥有各种子域名,只是为了让它看起来更美观。
答案2
在联系级别,所使用的域名根本不会传输 - 它仅基于解析的 IP 地址,而不是用于解析它们的名称。这意味着,服务器不可能只响应一个域名。
在协议级别不同,情况有所不同:某些协议(HTTP[S] 是典型示例)会传输请求的名称,从而使服务器能够在不同服务之间切换。在其他协议(例如 FTP 或 SMTP)上,请求的名称不是协议的一部分。
据我所知,Minecraft 不使用协议内的名称,因此您想要的构造不受网络组成允许。
答案3
我研究过反向代理,但了解到它们根据标头中的协议进行重定向,因此通常仅用于 HTTP/HTTPS。
但这正是问题所在。如果你的协议没有在标头中发送域名,那么你的服务器也无法区分“域”请求!
所以,除非您获得第二个 IP 地址(或者除非 Minecraft 实际开始发送域名),否则这是不可能的。
答案4
由于与设备的连接是通过 IP 地址进行的,并且只有部分协议保留原始域名,因此您或许可以使用端口来解决问题。
您的不同服务器使用不同的端口进行通信,因此您需要将不同的子域映射到其不同的端口。映射将类似于“game.mydomain.com:port1 => IP:port2”。IP 始终相同,但端口不同。这将通过路由器上的这些端口的端口转发来增强,从而将连接定向到正确的服务器。
您将为每种类型的服务器设置一个映射。您还可以为错误的连接设置一个映射,以避免游戏访问错误的游戏服务器并导致其崩溃。
如果您的 ISP 不提供这样的选项,一些动态 DNS 服务会提供该选项,一些是免费的,一些是收费的。