在欺騙源 IP 時直接從 IPIP 端點隧道將流量發送回客戶端
我在 Linux (Ubuntu 18.04) 上製作了一個 C 程序,通過 IPIP 將流量轉發到另一台伺服器。當 IPIP 端點發回回复時,程序也會在剝離外層 IP 標頭後將數據發回給客戶端。機器流量上的應用程序和 IPIP 隧道端點被轉發到位於網路命名空間內,IPIP 隧道是預設路由。這一切都很好。但是,我想實現一些東西,以便應用程序通過
POSTROUTING
IPTables 中的鏈將源 IP 地址欺騙到轉發機器 IP 直接將流量發送回客戶端。這將減少轉發機器上的負載,因為應用程序不需要通過 IPIP 隧道將流量發送回客戶端,我相信它會使其更加一致。為此,我嘗試設置一個 veth 對,其中一個 veth 在預設網路命名空間中,而對等 veth 在應用程序的自定義網路命名空間中。我還在主網路命名空間上設置了一個網橋,為其分配了一個 IP 地址,並在
POSTROUTING
鏈中創建了一個 SNAT 規則,以將流量作為特定 IP 輸出。然後,我在主網路命名空間上橋接了 veth 介面。應用程序仍然綁定到 IPIP 隧道,但是當它需要發送出站流量時,它會通過預設路由發送流量。因此,我將預設路由設置為網路命名空間內的 veth 介面。所有這些大部分都在起作用。來自應用程序的流量直接發送回客戶端,客戶端響應轉發伺服器。然後將流量發送回伺服器,流量通過 IPIP 轉發到。我通過
tcpdump
. 但是,我正在執行的應用程序沒有處理回复。我相信這樣做的原因是應用程序期望響應返回到veth
介面(預設路由),因為這就是它用來將回復發送回客戶端的方式。不幸的是,該應用程序是閉源的,所以我無法檢查程式碼。但是,我可能會創建一個測試 C 程序,該程序使用預設路由發送出站連接並進行進一步的故障排除。我只是想知道是否有人對此有建議。我已經閱讀了一些關於通過 IPTables 標記數據包的內容。我不完全確定在客戶端回复並將其發送到轉發伺服器後該標記是否會保留。
我相信在 IPIP 隧道上會出現某些流量,然後在預設路由上會出現其他流量。在我的例子中,連接到應用程序的客戶端正在向 IPIP 隧道發送流量,而 IPIP 隧道正在等待它。但是,該應用程序還與骨幹網建立出站連接,我相信這是網路命名空間內預設介面上預期的流量類型。
在預設路由上預期所有流量的情況下,是否可以將流量從轉發伺服器轉發到此特定介面,同時刪除 IPIP 協議(剝離外部 IP 標頭等)?我認為這需要在流量到達 IPIP 隧道後發生。
話雖如此,我想使用 IPIP 的原因是因為我可以在目標機器上執行 NAT(使用內部 IP 標頭的目標地址將流量轉發到 IPIP 隧道)。因此,我寧願不要擺脫 IPIP 隧道。
非常感謝任何幫助,如果您需要更多資訊,請告訴我!
我只是想提供一個更新。在發布這個問題大約一周後,我通過創建一個自動將出站 IPIP 數據包直接發送回客戶端的 TC BPF 程序解決了這個問題。對於那些感興趣的人,請隨時在這裡查看。
謝謝!