更改傳入數據包源 IP
如何在傳入數據包到達正在執行的服務之前更改其源 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>
任何幫助表示讚賞。
NAT 依賴於iptables “詢問”並由**conntrack子系統提供的服務。在做出路由決定之前,SNAT 不可用,但在選擇將數據包路由到主機後仍然可用:在很少使用的nat/INPUT鏈中,如手冊頁中所述:
SNAT
此目標僅在 nat 表、
POSTROUTING
and **INPUT
**鍊和僅從這些鏈呼叫的使用者定義鏈中有效。$$ … $$
因此,只要伺服器正在接收流量(不進一步路由),當通過介面eth0在伺服器的 IP 目標地址 <B> 上接收來自 IP 源地址 <X> 的數據包時,它就可以被 SNATed 顯示為源地址<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