Linux

在不使用 Web 伺服器的情況下在 Linux/CentOS 中“基於名稱”的埠轉發或綁定?

  • September 11, 2012

我在 Centos 6.3 上有一個遊戲伺服器,它有一個靜態 IP,但託管 3 個不同的遊戲,每個遊戲都在不同的埠上。埠4000是遊戲的預設查詢埠,我在後續埠上託管實例。

目前,玩家必須通過輸入 IP/主機名和埠來連接到每個遊戲,如下所示:

  • 123.123.123:4001server1.mygame.com:4001遊戲 1
  • 123.123.123:4002server2.mygame.com:4002遊戲 2
  • 123.123.123:4003server3.mygame.com:4003遊戲 3

我想做的是讓玩家不需要輸入埠,只需要記住主機名:

  • server1.mygame.com對於遊戲 1
  • server2.mygame.com對於遊戲 2
  • server3.mygame.com對於遊戲 3

我知道這(埠重定向/轉發)僅使用 DNS A-Records 或其他方式是不可能的。所以我設置 Apache 監聽遊戲的預設查詢埠,並使用基於名稱的虛擬主機嘗試 301 將連接重定向到相應的埠。server1.mygame.com例如,與埠 4001匹配的虛擬主機名稱是 301。

這在瀏覽器中有效 - 我看到重定向工作正常!但遺憾的是,它在遊戲中並沒有奏效。我的猜測是遊戲無法遵循 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 重定向。

這可能嗎?

TCP和UDP協議中沒有“名稱”這樣的概念,所以你不能這樣做。

替代方案是在應用程序級協議(例如,在 HTTP 1.1 中)實現名稱事物,或者使用不同的 IP 地址或不同的 TCP/UDP 埠。

除非您的遊戲使用 HTTP,否則您放置的整個 Apache 都是無用的,因為 Apache 是一個 HTTP 伺服器。如果你的遊戲聲稱使用 HTTP,那麼它必須理解重定向……否則它只是一個部分的、未完成的 HTTP 客戶端。

(Apache 也可以為其他協議提供服務,但這在這裡無關緊要)

引用自:https://serverfault.com/questions/426455