將給定連接埠的傳入網路請求路由到不同的應用程式

將給定連接埠的傳入網路請求路由到不同的應用程式

我有一個監聽端口連接的應用程序,但我偶爾會將其關閉以進行更新等。 I'd like a way to configure the system such that if that program is running, requests for that port are sent to the application, but if it's not running the requests are directed to some other application (that can return a "temporarily unavailable"訊息).實現這一目標最簡單的方法是什麼?

我在目標電腦上沒有 root 存取權限,因此我寧願避免諸如iptables.我考慮過一個輔助應用程序,除了將連接路由到其他兩個應用程式之外什麼也不做,但我希望有一種更簡單的方法

答案1

您的問題意味著這兩個程式將在同一台電腦上交替運行,綁定到同一連接埠。這是一個壞主意。如果您嘗試這樣做,您將遇到TIME_WAIT(又稱 2MSL)問題。本文描述了問題。 (它以 Windows 為中心,但它所討論的大部分內容都適用於任何 TCP/IP 堆疊。)

BSD 套接字 API 確實提供了一種方法來破壞這種保護 ( setsockopt(SO_REUSEADDR)),但這並不是這樣做合理的情況之一。

相反,以高可用性人員相同的方式解決問題:放置一個反向代理世界和您的「真實」後端伺服器之間。

在 HTTP 世界中,解決此問題的一種流行方法是nginx。您可以對其進行配置,以便在後端伺服器關閉時,它會向客戶端提供靜態內容。如果您的協定類似於 HTTP、IMAP 或 POP,也許您可以按原樣使用 nginx。如果沒有,您可以建立自訂代理伺服器。

您可能需要兩個 TCP 連接埠才能正常運作。代理程式綁定到公共 IP 上面向公眾的連接埠號碼。您的後端伺服器僅在本機主機介面上綁定到輔助連接埠。這樣,流量只能透過代理從公網到達後端伺服器。

如果兩個程式都被編寫為允許將它們綁定到同一端口,則您可以逃脫綁定。例如,如果您的公用IP是1.2.3.4且您的公用服務連接埠是,如果反向代理僅綁定到IP且「真實」伺服器僅綁定到,2345則兩個程式都可以綁定到連接埠。如果任一綁定到(0.0.0.0),則需要不同的連接埠。23451.2.3.4127.0.0.1INADDR_ANY

這解決了 2MSL 問題,因為您的用戶端始終與相同程式(代理伺服器)通訊。網路堆疊永遠不會對如何處理 2MSL 時間內清除的任何雜散資料包感到困惑。

反向代理的一個變體是負載平衡器,它也可以在這裡工作。負載平衡器旨在智慧地將流量路由到不同的機器。如果您認為您的應用程式有一天可能需要水平擴展,那麼這種代理是有意義的。您將選擇一個負載平衡器,它知道當所有正常應用程式伺服器都關閉時如何將流量傳送到特殊的「服務關閉」主機。

負載平衡器解決方案變體的主要問題是,通用負載平衡器可能會盲目地假設它代理的所有後端服務都使用相同的連接埠號,僅 IP 不同。不過,您也許可以獲得更靈活的負載平衡器,或為共享伺服器取得多個 IP。

相關內容