我有一个双端口以太网 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 之一进行通信。
原始访问
如果您愿意进行一些重要的编程,那么您可以打开原始套接字并自己创建以太网帧。这可能是最快的解决方案。