在 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 之一进行通信。

原始访问

如果您愿意进行一些重要的编程,那么您可以打开原始套接字并自己创建以太网帧。这可能是最快的解决方案。

相关内容