Linux

強製本地 IP 流量到外部介面

  • March 22, 2022

我有一台帶有多個介面的機器,我可以根據需要進行配置,例如:

  • 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 的答案。對於這個例子:

  1. 在我的本地 PC 上,我在不同的子網上有 NIC,192.168.1/24192.168.2/24
  2. 有一個外部路由器/PC 可以訪問這兩個子網。
  3. 我想通過本地 PC 上的 NIC 發送雙向流量。
  4. 該配置要求每個子網有兩個未使用的 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

規則執行以下操作:

  1. 在傳出數據包上將 192.168.2.1 源重寫為 192.168.2.100
  2. 在傳入數據包上將 192.168.1.100 目標重寫為 192.168.1.1
  3. 在傳出數據包上將 192.168.1.1 源重寫為 192.168.1.100
  4. 在傳入數據包上將 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

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