讓Linux伺服器將發送到其外部IP的封包路由到本機

讓Linux伺服器將發送到其外部IP的封包路由到本機

我有一個具有特定靜態 IP 的路由器a.b.c.d,該路由器一側連接到 Linux 伺服器,另一側連接到互聯網。

使用 IP 位址從外部存取 Linux 伺服器上安裝的軟體a.b.c.d:portxx效果很好。

但是,如果某人從伺服器本身打開的瀏覽器嘗試存取相同的軟體,則會 a.b.c.d:portxx失敗。再試localhost:portxx一次效果很好。

所以我的診斷是 DSL 路由器很愚蠢並且沒有意識到它a.b.c.d本身。

有沒有辦法解決這個問題,最好不要在路由器上進行任何更改?即Through /etc/hosts或伺服器上的某些其他機制可以將任何資料包a.b.c.d重新路由到嗎localhost

這可能會破壞其他東西嗎?

答案1

問題不在路由器中。路由器執行已設定的操作 - 它將流量目標 abcd:portxx 轉換到您的 Linux 伺服器。它不起作用,但為了理解,你必須看看網路上發生了什麼。例如,您的 Linux 伺服器是 192.168.1.2,您的 LAN 網路上的路由器是 192.168.1.1

  • 從伺服器發送資料包
  • 來源位址 192.168.1.2:1024 目的地 abcd:portxx
  • 在路由器上進行翻譯(返回伺服器)
  • 源 192.168.1.2:1024 目標 192.168.1.2:portxx
  • 數據包到達伺服器應用程序,它回复 - 並發送回复數據包
  • 源 192.168.1.2:portxx 目標 192.168.1.2:1024
  • 封包在伺服器上到達(停留)到客戶端應用程序,但此連接不知道,因為您啟動到abcd 的連接並收到來自192.168.1.2 的回复,而不是來自(abcd) 的回复- 數據包被丟棄。

所以可能的解決方案:

1) 在路由器上,如果可以的話,將來自本地網路的封包設定為 SNAT 到您的 NAT 公用 IP。如果你有 Linux 路由器,請嘗試一下

iptables -t nat -I PREROUTING -s 192.168.0.0/24 -d a.b.c.d -j SNAT --to-source 192.168.1.1

您變更了封包從內部網路通過路由器的來源封包位址,伺服器應用程式回覆回 192.168.1.1,以及接收回覆時的 SNAT 規則,正確地將封包對應回伺服器上的用戶端應用程式。此解決方案適用於所有內部網路計算機,但在伺服器上您會看到來自路由器位址 192.168.1.1 的所有請求。

2)在伺服器上,您可以透過 iptables 重定向流量

 iptables -t nat -I OUTPUT -d a.b.c.d -p tcp --dport portxx -j REDIRECT --to-ports portxx

它將傳出連接從您的伺服器重新導向到伺服器上的本機連接埠。我認為,這可能是適合您情況的最佳解決方案

3)在伺服器上新增abcd位址可能是某些情況下的解決方案,但有時伺服器守護程式(並且它是特定於應用程式的)不會偵聽所有IP位址或對其他位址給出另一個答案。

4)如果您使用主機名稱而不是IP位址,您可以在Linux伺服器上重新定義/etc/hosts - 這是最簡單的,有時也有幫助(DNS返回:linuxserver abcd),因此在/etc/hosts中您可以寫行

192.168.1.2 linuxserver

從linux伺服器到「linuxserver」的連線直接轉到192.168.1.2

相關內容