Linux

使用 IPTables NAT 將原始 IP 失去到另一台伺服器

  • July 8, 2015

我正在嘗試將所有 HTTP 流量從一台 EC2 linux 伺服器(外部 IP 11.11.11.11)轉發到另一台(外部 IP 22.22.22.22),這些規則設置:

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 22.22.22.22:80
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
sudo service iptables save
sudo service iptables restart

但是從客戶端執行 CURL 時,目標伺服器將 11.11.11.11 視為請求的源 IP。所以我嘗試了類似問題中提供的內容,-d 11.11.11.11在第一個命令中添加了一個,所以它看起來像這樣:

sudo iptables -t nat -A PREROUTING -d 11.11.11.11 -p tcp --dport 80 -j DNAT --to-destination 22.22.22.22:80

但是現在嘗試 CURL 到 11.11.11.11 會導致Connection refused錯誤。

知道為什麼第二個命令失敗以及如何正確執行此操作嗎?

更改 IP 地址是 NAT 的工作方式。這本質上就是網路地址轉換的目的。如果源地址沒有改變,目標機器將嘗試直接回復原始客戶端,這會失敗,因為客戶端會看到該回復來自意外的地方(來自“錯誤”IP地址的回复)並拒絕它,否則有狀態的防火牆會阻止它(將其檢測為從未建立的會話的延續),或者目標主機將沒有返回發送者的路由。

要保留原始主機的身份,您必須在其他地方保留該資訊,而不是 IP 數據包。

可能最常見的方法是 HTTP 反向代理。HAProxy、squid、varnish、apache、nginx 和許多其他解決方案都存在。它們通過插入一個新的標頭來工作,通常是X-Forwarded-For:在 http 請求標頭中,標識連接客戶端到目標 Web 伺服器。

這是您最簡單的解決方案。NAT 似乎不適合您的需要。

或者,HAProxy 和可能的其他一些平台支持稱為PROXY協議的東西,它在通過連接切斷實際有效負載之前,以偽帶外格式傳輸客戶端 IP 和埠(以及原始目標 IP 和埠)。與X-Fowarded-For:解決方案不同,如果實際 Web 伺服器不支持,您的應用程序可以解釋(通過訪問 http 請求標頭),PROXY協議要求目標伺服器理解該協議。從好的方面來說,這種替代方案適用於大多數基於 TCP 流的協議(除了 http),因為它不需要修改實際請求本身。

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