
我有一個雙埠乙太網路 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 連線。但是您必須使用iptables
和SNAT
,DNAT
以便兩個 NIC 都相信它們正在與兩個必要的假 IP 之一通訊。
原始訪問
如果您願意進行一些重要的編程,那麼您可以打開原始套接字並自行創建乙太網路幀。這可能是最快的解決方案。