強製本地 IP 流量到外部介面
我有一台帶有多個介面的機器,我可以根據需要進行配置,例如:
- eth1:192.168.1.1
- eth2:192.168.2.2
我想通過另一個介面轉發發送到這些本地地址之一的所有流量。例如,對 192.168.1.1 的 iperf、ftp、http 伺服器的所有請求不應僅在內部路由,而應通過 eth2 轉發(外部網路將負責將數據包重新路由到 eth1)。
我嘗試並查看了幾個命令,例如 iptables、ip route 等……但沒有任何效果。
我能得到的最接近的行為是:
ip route change to 192.168.1.1/24 dev eth2
它在 eth2 上發送所有 192.168.1.x,但仍在內部路由的 192.168.1.1 除外。也許我可以在 eth1 上對所有定向到假 192.168.1.2 的流量進行 NAT 轉發,在內部重新路由到 192.168.1.1?我實際上正在為 iptables 苦苦掙扎,但這對我來說太難了。
此設置的目標是在不使用兩台 PC 的情況下進行介面驅動程序測試。
我正在使用 Linux,但如果您知道如何使用 Windows 來做到這一點,我會購買它!
編輯:
外部網路只是 eth1 和 eth2 之間的交叉電纜。假設我的機器上有一個 http 伺服器。現在我想從同一台機器訪問這個伺服器,但是我想強制 TCP/IP 流量通過這個 eth1/eth2 電纜。我應該如何為此配置我的介面?
由於看不到響應數據包,因此我擴展了 caladona 的答案。對於這個例子:
- 在我的本地 PC 上,我在不同的子網上有 NIC,192.168.1/24,192.168.2/24
- 有一個外部路由器/PC 可以訪問這兩個子網。
- 我想通過本地 PC 上的 NIC 發送雙向流量。
- 該配置要求每個子網有兩個未使用的 IP 地址。
本地 PC iptable 路由設置為到“假”IP 的 SNAT 和 DNAT 傳出流量。
iptables -t nat -A POSTROUTING -d 192.168.1.100 -s 192.168.2.0/24 -j SNAT --to-source 192.168.2.100 iptables -t nat -A PREROUTING -d 192.168.1.100 -i eth0 -j DNAT --to-destination 192.168.1.1 iptables -t nat -A POSTROUTING -d 192.168.2.100 -s 192.168.1.0/24 -j SNAT --to-source 192.168.1.100 iptables -t nat -A PREROUTING -d 192.168.2.100 -i eth1 -j DNAT --to-destination 192.168.2.1
規則執行以下操作:
- 在傳出數據包上將 192.168.2.1 源重寫為 192.168.2.100
- 在傳入數據包上將 192.168.1.100 目標重寫為 192.168.1.1
- 在傳出數據包上將 192.168.1.1 源重寫為 192.168.1.100
- 在傳入數據包上將 192.168.2.100 目標重寫為 192.168.2.1
總而言之,本地系統現在可以與地址為 192.168.1.100 和 192.168.2.100 的“虛擬”機器通信。
接下來,您必須強制您的本地 PC 使用外部路由器來訪問您的假 IP。為此,您可以通過路由器創建到 IP 的直接路由。您要確保將數據包強製到目標子網的對面。
ip route 192.168.1.100 via $ROUTER_2_SUBNET_IP ip route 192.168.2.100 via $ROUTER_1_SUBNET_IP
最後,為了使這一切正常工作,外部路由器需要知道如何訪問本地 PC 上的偽造 IP。您可以通過為您的系統打開代理 ARP 來進行精簡。
echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/proxy_arp echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
通過此設置,您現在可以將假 IP 視為本地 PC 上的真實係統。將數據發送到 .1 子網將強制數據包從 .2 介面流出。將數據發送到 .2 子網將強制數據包從 .1 介面輸出。
ping 192.168.1.100 ping 192.168.2.100