在 Ubuntu 上透過實體網路向自身發送流量

在 Ubuntu 上透過實體網路向自身發送流量

我有一個雙埠乙太網路 NIC,假設我已將兩個連接埠連接成一個環路,並將以下 IP 指派給 2 個乙太網路介面:

  • eth2 -> 192.168.2.1
  • eth3 -> 192.168.3.1

我想透過實體網路將流量從其中一個端口傳送到另一個端口,例如192.168.3.1從ping 192.168.2.1。但是,Linux 核心中的 TCP/IP 堆疊會識別這兩個位址是本機位址,並將流量傳送到環回適配器,因此流量永遠不會到達實體網路。

我最接近的解決方案是阿納斯塔索夫的發送給自己的補丁不幸的是,它自核心 3.6 起就已停止使用,因此它無法在 Ubuntu 13.10(核心 3.11)上運行。我嘗試重寫 3.11 的補丁,但我似乎無法在 Ubuntu 發行版中找到這些補丁:

  • 包括/linux/inetdevice.h
  • 網/ipv4/devinet.c
  • 淨/ipv4/fib_frontend.c
  • 網路/ipv4/route.c
  • 文件/網路/ip-sysctl.txt

有沒有辦法讓“發送給自己”補丁發揮作用,或者有其他解決方案嗎?

答案1

建立一個網路命名空間並將介面之一移入其中:

ip netns add test
ip link set eth1 netns test

在新的命名空間中啟動 shell:

ip netns exec test bash

然後繼續操作,就好像您有兩台機器一樣。完成後退出 shell 並刪除命名空間:

ip netns del test

答案2

我還沒有嘗試過,但我想有幾種可能的解決方法:

虛擬機

透過將至少一個網路卡與主機的 IP 堆疊分開來解決 IP 堆疊問題:將其指派給虛擬機器。不過,對於性能測試來說,這可能是不可取的。但如果有足夠的 CPU 能力,也許額外的軟體層不會成為瓶頸(但你怎麼知道?)。

不同的目標地址

我猜想,您希望在第 2 層傳輸資料包只是為了進行 NIC 效能測試。因此,您可以使用具有不同 IP 位址的 IP 封包(非本機位址,以便封包在任何情況下都會透過線路傳送)。然後你就作弊:你用它ip neigh來建立一個永久的 ARP 條目,將這個假 IP 位址對應到其他 NIC 的 MAC 位址。

您甚至可以透過這種方式建立 IP 連線。但是您必須使用iptablesSNATDNAT以便兩個 NIC 都相信它們正在與兩個必要的假 IP 之一通訊。

原始訪問

如果您願意進行一些重要的編程,那麼您可以打開原始套接字並自行創建乙太網路幀。這可能是最快的解決方案。

相關內容