我有一個具有特定靜態 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