如何在傳入資料包到達正在運行的服務之前更改其來源 IP
我有兩台設備,一台管理器和一台伺服器,透過 VPN 連接,而且它們之間有 NAT。
管理器介面 IP:A 伺服器介面 IP:B
管理器使用 NAT IP Y 連接到伺服器,並且當管理器連接時伺服器會看到 IP X
當封包到達來源 IP X 時,如何在伺服器上設定 iptables,將其變更為 IP。
我知道在設計良好的網路和產品中這應該不是問題,但我們暫時需要一個解決方法,直到它在軟體方面得到修復。
到目前為止,以下 iptables 規則沒有幫助:
iptables -t nat -A POSTROUTING -s <X> -o eth0 -j SNAT --to <A>
任何幫助表示讚賞。
答案1
NAT 取決於「請求」的服務iptables並由提供連線子系統。 SNAT 在做出路由決策之前不可用,但在選擇將資料包路由到主機後仍然可用:在很少使用的情況下自然/輸入鏈,如記錄在手冊頁:
SNAT
這個target只在nat表中有效,在
POSTROUTING
和INPUT
鏈,以及僅從這些鏈中呼叫的使用者定義鏈。 [...]
因此,只要伺服器正在接收流量(不進一步路由),當透過介面在伺服器的 IP 目標位址 <B> 上接收來自 IP 來源位址 <X> 的封包時乙太網路0,可以對其進行 SNAT 處理,使其顯示為來源位址 <A>(這是原始 IP 來源位址,但此資訊遺失),如下所示:
iptables -t nat -A INPUT -s <X> -d <B> -i eth0 -j SNAT --to <A>
或使用更簡單的版本:
iptables -t nat -A INPUT -s <X> -j SNAT --to <A>
您可以新增更多限制,例如-p tcp --dport XXXX
(XXXX 表示實際達到的服務),您可能應該這樣做:如果您遇到下面描述的問題,您可能會阻止自己透過 VPN 存取系統。擁有備用存取方法,或除非確定,否則不要遠端執行。
由於路由的原因,上述規則可能還不夠。如果 IP 位址 <A> 不在到伺服器的已知路由中(僅當伺服器沒有預設路線)。雖然系統永遠不會將封包(IP 甚至 ARP)傳回此目的地(回覆未經過 SNAT),但仍需要到該目的地的路由,以便路由堆疊(不知道發生了 SNAT)進行正確處理。
所以如果iptables上面的規則還不夠(可能如果伺服器沒有預設路由),您可以新增:
ip route add <A>/32 dev eth0