我在 Centos 6.3 上有一个游戏服务器,它有一个静态 IP,但托管 3 个不同的游戏,每个游戏都在不同的端口上。端口4000
是游戏的默认查询端口,我在后续端口上托管实例。
目前,玩家必须通过输入 IP/主机名和端口来连接到每个游戏,如下所示:
123.123.123:4001
或server1.mygame.com:4001
第一场比赛123.123.123:4002
或者server2.mygame.com:4002
第二场比赛123.123.123:4003
或server3.mygame.com:4003
第三场比赛
我想做的是让玩家不需要输入端口,只需记住主机名:
server1.mygame.com
对于第一场比赛server2.mygame.com
第二场比赛server3.mygame.com
第三场比赛
我知道仅使用 DNS A 记录或其他方式无法实现此目的(端口重定向/转发)。因此,我设置了 Apache 来监听游戏的默认查询端口,并使用基于名称的虚拟主机尝试将连接 301 重定向到其相应的端口。例如,将虚拟主机名称匹配server1.mygame.com
301 重定向到端口 4001。
这在浏览器中有效 - 我看到重定向工作正常!但遗憾的是它在游戏中不起作用。我猜游戏无法遵循 301 重定向。我也尝试通过 Apache 进行反向代理,但这也失败了。
所以我想知道是否有任何方法可以在不使用 Apache 的情况下设置基于名称的端口转发。
概括:
基本上我需要以某种方式实施这些规则:
Connection to 123.123.123 established on port 4000 (query port).
If the hostname is "server1.mygame.com" --> forward to 4001.
If the hostname is "server2.mygame.com" --> forward to 4002.
If the hostname is "server3.mygame.com" --> forward to 4003.
全部无需 Apache 或 301 重定向。
这可能吗?
答案1
TCP 和 UDP 协议中没有“名称”这样的概念,因此您不能这样做。
替代方法是在应用程序级协议中实现名称(例如在 HTTP 1.1 中)或使用不同的 IP 地址或不同的 TCP/UDP 端口。
除非你的游戏使用 HTTP,否则你安装的整个 Apache 东西都是无用的,因为 Apache 是一个 HTTP 服务器。如果你的游戏声称使用 HTTP,那么它必须理解重定向...否则它只是一个部分的、未完成的 HTTP 客户端。
(Apache 也可以提供其他协议,但这与此无关)