在Linux中模拟网络接口上的传入数据包

11

如果您通常通过一个接口(比如eth0)发送pcap的tcpreplay,那么数据包是出站的,即将通过网络卡发送出去。有没有办法让pcaps变成入站的,以便我的系统将其处理为入站数据包呢?

可能的场景

我有一个应用程序,从eth0接收数据包,提取一些数据并通过eth1发送。现在,如果网络设置正确,并且真实的数据包实际上流入我的系统,那么情况就很好。但是出于测试目的,我没有将任何东西连接到我的eth0或eth1端口,但我仍然希望从一个pcap文件中创建类似的流量(可能通过脚本),这样我就不必依赖外部物理网络连接来测试应用程序。


你是否需要让数据包像“真实”流量一样进入iptables INPUT/FORWARD链,或者忽略防火墙也可以?你只需要数据包的目标MAC与eth0匹配,还是需要内核“认为”数据包是通过eth0接收的,即数据包的内部结构指向eth0作为发起者? - Ihor Kaharlichenko
我希望内核“认为”数据包是通过eth0接收的...也就是说,数据包的内部结构指向eth0作为发起者... - woodstok
3个回答

7

eth0替换为lo

  1. 运行接收从lo发送到eth1的数据包的应用程序
  2. 运行另一个程序(数据包生成器),向lo发送数据包

每个发送到lo的数据包都将再次被lo接收,因此您的应用程序将接收来自数据包生成器的数据包。

如果您的lo忙于处理其他数据包,您可以通过内核参数max_loop=x添加更多的环回设备。


+1 这在我的系统上似乎可以工作。话虽如此,lo 不是一个以太网接口,因此可能存在某些问题。事实上,tcpreplay 长时间以来都不能与环回接口一起使用,即使现在也会输出警告... - thkala
@user956030,你能举个例子吗? - Space Rocker

5
有几种可能的解决方案:
  • 快速而简单的解决方案:由于您有两个物理连接,您是否考虑使用补丁线来连接计算机上的两个以太网端口?然后,您将能够通过eth1发送数据包并通过eth0接收数据包。当然,此解决方案需要访问计算机的物理位置,并且您还将失去正常使用这些连接的能力。

  • 正确的解决方案:我认为您正在寻找一种模拟通过物理网络接口的流量的方法。在Linux(可能是其他类Unix系统)上执行此操作的典型方法是创建TAP虚拟接口。在此处查看此处,了解有关TUN/TAP接口的简单教程。

    不幸的是,tpcreplay似乎尚不支持TUN/TAP接口。您或许可以想办法使其工作,但我怀疑这将非常笨拙。

  • 中庸之道:在例如VirtualBox上使用Linux虚拟机。我不确定所需的确切网络配置,但据我所知,这应该可以工作。


1

您想通过特定的网络卡/接口在同一台计算机上发送和接收数据包吗?
我所知道的唯一方法是设置一个反弹/回显服务器。


好的,这让我清楚了,我的方法(我所知道的唯一方法)对你没有用。抱歉。 - Germann Arlington
你尝试过使用iptables将出站流量(eth0)重定向到入站接口(eth1)吗? - Satish
@Satish,你能告诉我你会怎么做吗?我想做类似于将流量从一个接口重定向到另一个接口的事情,比如LAN流量通过路由规则进入TAP接口,然后我想将其重定向到ppp接口,我该怎么做? - Space Rocker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接