Centos

更改傳入數據包源 IP

  • December 19, 2020

如何在傳入數據包到達正在執行的服務之前更改其源 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 表、POSTROUTINGand **INPUT**鍊和僅從這些鏈呼叫的使用者定義鏈中有效。

$$ … $$

因此,只要伺服器正在接收流量(不進一步路由),當通過介面eth0在伺服器的 IP 目標地址 <B> 上接收來自 IP 源地址 <X> 的數據包時,它就可以被 SNATed 顯示為源地址<A> (這是原始 IP 源地址,但此資訊失去)改為:

iptables -t nat -A INPUT -s &lt;X&gt; -d &lt;B&gt; -i eth0 -j SNAT --to &lt;A&gt;

或者使用更簡單的版本:

iptables -t nat -A INPUT -s &lt;X&gt; -j SNAT --to &lt;A&gt;

您可以添加更多限制,例如-p tcp --dport XXXX(XXXX 表示達到的實際服務),您可能應該:如果遇到下面描述的問題,您可能會阻止自己通過 VPN 訪問系統。有一個備份訪問方法,或者除非確定,否則不要遠端進行。

由於路由,上面的規則可能還不夠。如果 IP 地址 <A> 不在通往伺服器的已知路由中(僅當伺服器沒有預設路由時才會發生這種情況)。雖然系統永遠不會將數據包(IP 甚至 ARP)發送回此目的地(回复未經過 SNAT),但仍然需要到它的路由才能由不知道發生 SNAT 的路由堆棧進行正確處理。

所以如果上面的iptables規則還不夠(可能是如果伺服器沒有預設路由),你可以添加:

 ip route add &lt;A&gt;/32 dev eth0

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