Linux

使用 iptables 代理數據包

  • January 28, 2021

問題:從 Web 應用程序伺服器到主伺服器的請求應該被代理回 Web 應用程序伺服器。因此,如果我從 web 應用程序伺服器向應用程序的域(或主伺服器的公共 ip)執行請求,我希望得到一個實際的 web 應用程序,以及在執行來自 Internet 的請求時得到它。

帶網路圖的圖片

當請求來自外部時,一切正常。

從 Internet 到埠 80、443 的請求通過 Web 應用程序代理到伺服器。防火牆現在看起來像這樣:

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE  
iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 -j DNAT --to-destination 20.20.20.21:80  
iptables -t nat -A PREROUTING -p tcp --dport 80 -s 20.20.20.21 -d 10.10.10.10 -j DNAT --to-destination 20.20.20.21:80  
iptables -A FORWARD -p tcp -d 20.20.20.21 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

據我了解,我需要向 iptables 添加一條規則,以便從 20.20.20.21 到 10.10.10.10 的請求也被代理到 10.10.10.10。

如果我是對的,請告訴我如何執行此操作或如何解決此問題。

你在做一些奇怪的事情。可以做你想做的事,但你可能有一個XY 問題,即這不是你需要解決的根本問題,但你正在嘗試修復其他問題的錯誤解決方案。


我想第三條規則是你解決這個問題的嘗試。

您的第三條規則有效,它將一個數據包(src=20.20.20.21:x dst=10.10.10.10:80)轉換為一個數據包(src=20.20.20.21:x dst=20.20.20.21:80),然後將其路由到新目的地。

當數據包到達 20.20.20.21 時,它立即被丟棄,因為反向路徑過濾器考慮了這種欺騙。讓我們假設它仍然被接受,但我們回复誰呢?有一個數據包(src=20.20.20.21:x dst=20.20.20.21:80),所以會有一個回复(src=20.20.20.21:80 dst=20.20.20.21:x)。即使創建,這樣的回複數據包也永遠不會離開 web 盒子到達 NAT 盒子並被翻譯回來。

解決方案是為這些數據包轉換目標和源,因此 20.20.20.21 不會看到它是來自自身的數據包。必須更改數據包,以便回復將被路由回 NAT 框。可以使用以下附加規則:

iptables -t nat -A POSTROUTING -s 20.20.20.21 -d 20.20.20.21 --dport 80 -j SNAT --to-source 10.10.10.10

筆記:

  • 它正在執行 SNAT,因此在 POSTROUTING 鏈中
  • 它通過已用 DNAT 翻譯的目標地址匹配數據包(您的第三條規則 - 它仍然需要!)
  • 源地址更改為 NAT 框的某個地址。20.20.20.20 代替 10.10.10.10 也同樣有效。

20.20.20.21 會將此視為一個新數據包 (src=10.10.10.10:x dst=20.20.20.21:80),因此它會接受並且回復將正確到達 NAT 框。然後 NAT 將替換這兩個地址並將轉換後的數據包返回到 Web 伺服器框。所以溝通會成功。


正如我所說,這是一個非常奇怪的情況。雖然這會起作用,但請避免它。不尋常的防火牆規則,難以理解,低效的設計。

為什麼 20.20.20.21 必須通過另一個系統通過它不擁有的地址與*自己通信?*DNS問題?你有一些hostname,一些(外部)DNS 伺服器回答 10.10.10.10?然後你最好讓內部 DNS 伺服器只為本地網路回答 20.20.20.21,或者讓 20.20.20.21 從不做這樣的 DNS 查詢,並且“只知道”ahostname由 20.20.20.21 提供服務,方法是在其/etc/hosts文件中添加一行。該解決方案是可靠的(我提供了某個名稱?那麼該名稱屬於我);這很容易理解。它還將繞過網路硬體並減少系統負載,並且工作速度更快,因為本地數據包跳過了許多網路堆棧層。


最後一點:如果這真的是一個完整的防火牆並且過濾器 FORWARD 策略是 ACCEPT(預設值),那麼您的第四條規則就沒有任何作用。在任何一種情況下,最好將其刪除。即使它不是一個完整的防火牆,最後一條規則看起來也很奇怪。為了提供更好的建議,我需要查看完整的防火牆(的輸出iptables-save)。

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