不使用 Web 服务器的情况下在 Linux/CentOS 中进行“基于名称”的端口转发或绑定?

不使用 Web 服务器的情况下在 Linux/CentOS 中进行“基于名称”的端口转发或绑定?

我在 Centos 6.3 上有一个游戏服务器,它有一个静态 IP,但托管 3 个不同的游戏,每个游戏都在不同的端口上。端口4000是游戏的默认查询端口,我在后续端口上托管实例。

目前,玩家必须通过输入 IP/主机名和端口来连接到每个游戏,如下所示:

  • 123.123.123:4001server1.mygame.com:4001第一场比赛
  • 123.123.123:4002或者server2.mygame.com:4002第二场比赛
  • 123.123.123:4003server3.mygame.com:4003第三场比赛

我想做的是让玩家不需要输入端口,只需记住主机名:

  • server1.mygame.com对于第一场比赛
  • server2.mygame.com第二场比赛
  • server3.mygame.com第三场比赛

我知道仅使用 DNS A 记录或其他方式无法实现此目的(端口重定向/转发)。因此,我设置了 Apache 来监听游戏的默认查询端口,并使用基于名称的虚拟主机尝试将连接 301 重定向到其相应的端口。例如,将虚拟主机名称匹配server1.mygame.com301 重定向到端口 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 也可以提供其他协议,但这与此无关)

相关内容