
我有兩個網路連續網路都隱藏在自己的 NAT 下 192.168.31.0/24
-> 192.168.33.0/24
-> Internet
我有一個 TCP 伺服器192.168.33.35
和一個客戶端192.168.31.32
66.66.66.66
例如,客戶端向位於網際網路上的伺服器發出 TCP 請求。我希望最後一個網關192.168.33.1
發送請求來192.168.33.35
欺騙客戶端。
我嘗試過的最可行的是:
iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35
iptables -t nat -I POSTROUTING -s 192.168.33.35 -j SNAT --to-source 66.66.66.66
伺服器收到Syn資料包並回覆。但伺服器回應的來源IP似乎192.168.33.35
在經過網關後仍然保留。並且網關接收到的資料包遺失192.168.31.1
。
看起來 SNAT 部分不起作用。
我可以做什麼來使用標準 openWrt 工具來模擬/欺騙伺服器?
答案1
發生的情況是這樣的:
- 您的
192.168.33.35
伺服器看到 Syn 封包192.168.33.Z
(它不知道192.168.31.0/24
網絡,看到網關的「WAN」位址192.168.31.1
,我不知道Z
是什麼)並回覆該位址。 - 它的路由表表明該位址屬於本地網絡,因此回應的目標是 MAC 位址
192.168.33.Z
。 - 即使響應物理上穿過機器
192.168.33.1
,網關也不會破壞它,因為它注定是另一台機器的 MAC 位址。 192.168.33.Z
看到來自 的響應192.168.33.35
。它期待著一個66.66.66.66
,但不知道該怎麼做。
192.168.33.Z
請注意,執行 NAT(在其 LAN 端)並不重要192.168.31.1
。失敗的機制與以下情況非常相似:NAT 環回(髮夾 NAT)僅部分設置。
您必須讓192.168.33.35
伺服器向網關的 MAC 位址發送回應192.168.33.1
。
192.168.33.Z
要么為(記住我不知道Z
,你知道;替換真實的數字)甚至整個192.168.33.0/24
網絡設置路由規則:# do this on the 192.168.33.35 machine route add -host 192.168.33.Z gw 192.168.33.1
請注意,它將影響從
192.168.33.35
到 的所有通訊192.168.33.Z
。在192.168.33.35
應該充當192.168.33.35
資料包將被不必要路由的情況下;但它不應該破壞東西。或讓
192.168.33.1
網關不僅執行DNAT,還執行SNAT。此解決方案與已連結答案中的 NAT 環回解決方案基本相同:# do this on the 192.168.33.1 gateway # you already have this line iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35 # this line is new iptables -t nat -I POSTROUTING -d 192.168.33.35 -j SNAT --to-source 192.168.33.1
此片段適用於您的情況:
請注意,中的 NAT 表
iptables
僅用於連接的第一個資料包。使用第一個資料包轉換時建立的內部映射表來處理與連線相關的後續資料包。
iptables … -j SNAT --to-source 66.66.66.66
這表示當您從客戶端啟動連線時,第二行 ( ) 是無關緊要的。後面的資料包將正確進行 SNAT 和 DNAT,因為第一個資料包是這樣的。
我想如果你的第一行
iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35
在192.168.31.1
網關上執行操作,它會為其他客戶端執行您想要的操作,而192.168.31.0/24
無需任何額外的技巧。
你的第二行
iptables -t nat -I POSTROUTING -s 192.168.33.35 -j SNAT --to-source 66.66.66.66
如果您發起連接,則適用從 192.168.33.35
。 Internet 伺服器很少這樣做,因此您可能根本不需要此規則。如果您確實需要它,請記住:
- 只有當封包通過該規則起作用的網關路由時,該規則才會起作用
192.168.33.1
,因此要到達您的本地電腦並向它們呈現,66.66.66.66
您需要調整192.168.33.35
電腦上的路由表,與上面類似; - 您無法
66.66.66.66
與外部主機(超出您的網路)進行通信,因為即使您設法以 的身份聯繫到他們66.66.66.66
,他們的回應也會到達真實的66.66.66.66
,而不是返回給您。
答案2
用路由做的。不幸的是,它在訪問真實伺服器方面不太靈活,但至少它可以工作。像這樣的事情:
[email protected]# route add -host 66.66.66.66 gw 192.168.33.35 dev br-lan
並在伺服器上:
[email protected]# ip link add name s666 type dummy
[email protected]# ifconfig s666 66.66.66.66
[email protected]# ifconfig s666 up