Linux kernel tc多管道操作结果性能受到影响,寻求更好的方法

Linux kernel tc多管道操作结果性能受到影响,寻求更好的方法,linux-kernel,network-monitoring,trafficshaping,Linux Kernel,Network Monitoring,Trafficshaping,我一直在尝试使用tc、tc nat和tc pedit来执行无状态nat操作。我的目标是将数据包从一个接口(eth0)镜像到另一个接口(eth1),但我还想更改目标IP和目标MAC,以便将数据包传送到另一个主机 主机A[Eth0->Eth1(更改IP dst,更改MAC dst)]------>主机B 因为我有其他应用程序在Eth0上侦听,所以我无法在Eth0上的入口/出口上执行tc-nat或tc-pedit。这就是我所做的 创建一个虚拟接口 将数据包从Eth0镜像到虚拟接口 在虚拟机的出口侧运行

我一直在尝试使用tc、tc nat和tc pedit来执行无状态nat操作。我的目标是将数据包从一个接口(eth0)镜像到另一个接口(eth1),但我还想更改目标IP和目标MAC,以便将数据包传送到另一个主机

主机A[Eth0->Eth1(更改IP dst,更改MAC dst)]------>主机B

因为我有其他应用程序在Eth0上侦听,所以我无法在Eth0上的入口/出口上执行tc-nat或tc-pedit。这就是我所做的

  • 创建一个虚拟接口
  • 将数据包从Eth0镜像到虚拟接口
  • 在虚拟机的出口侧运行tc nat(更改目标IP),将管道导入tc pedit(更改目标MAC),并将管道镜像到Eth1
  • 上述装置工作正常,但性能很差(尤其是与基于libpcap的应用程序(如tcpbridge)相比)


    我开始使用这种方法是希望在内核空间中获得比在用户空间中基于libpcap的应用程序更好的性能。我很好奇有没有更好的方法。

    更好地解释一下你想要实现的目标可能会有所帮助。例如,为什么不能在入口更改IP地址,然后让正常的数据包处理路由数据包并设置mac地址,然后在出口应用nat?我正在尝试使用nat创建一个tap解决方案,因此在入口不能更改数据包,因为存在活动的客户机/服务器应用程序。我发现的唯一的另一种可能性是镜像到一个iptables条目,在那里执行NAT。我很难理解您正在尝试做什么。eth0上有一些帧,一些应用程序正在处理部分/全部?是的。那你想把所有的东西都照出来吗?将帧转换为eth1并更改mac地址ip地址,然后更改NAT。因此,似乎您希望镜像到eth1的帧是可路由的,而且,由于NAT,您希望一些应用程序处理帧并响应。如果你想让一个本地应用程序处理这些帧,同时又想将这些帧镜像到另一个同样会处理这些帧的应用程序,那么,说清楚一点,你为什么需要NAT?这很不寻常,但这正是我的使用案例。基本上,我希望在不干扰应用程序堆栈的情况下将数据包镜像到其他地方。因为我是在虚拟环境中进行此操作的,所以我需要NAT将其路由到目的地。