停止网卡上的数据包



这是我试图解决的问题,

我想写一个应用程序,它将读取同一台机器的网卡上的出站http请求数据包。这将能够从中提取GET url。基于这些信息,我希望能够停止数据包,或重定向它,或让它通过。

然而,我希望我的应用程序以混杂模式运行(就像wireshark一样),并且能够吃掉(停止)出站数据包。

关于这个我到处找了一下。。

libpcap/pcap.h允许我在网卡上读取数据包,但我还无法找到停止这些数据包或将新数据包注入网络的方法。

某些东西,比如python中的twisted或scapy,允许我设置一个在某个本地端口上侦听的服务器,然后我可以使用代理配置将浏览器配置为连接到它。然后这个应用程序就可以做这些事情了。。但我滥交的主要目的在这里被打破了。。

如果能为我实现这一目标提供任何帮助,我将不胜感激。。

我建议您在应用程序层处理此问题,并使用透明代理(例如squid)和基于iptables的出站port-80流量拦截。

我建议这样做的原因是,它将避免在数据包之间分割请求的问题。

然而,如果您仍然想继续进行数据包拦截,您可以在用户空间中使用netlink中的netfilter来完成。我相信libnl有python包装器。

本质上,您为要拦截的流量创建了一个指向"QUEUE"的iptables规则,并使用netlink库编写程序来处理队列,接受、拒绝和/或修改数据包。

使用pcap无法停止数据包,如果您在windows下,则必须转到驱动程序级别。。。但你只能停止你的机器发送的数据包。

一个解决方案是充当通往目标机器的管道:您需要两个网络接口(可能没有地址),当您在源网卡上收到一个不感兴趣的数据包时,只需在目标网卡上发送即可。如果数据包很有趣,你就不发送它,所以你充当了一个过滤器。我已经做了多媒体性能测试(添加抖动,噪声等视频流)

您混淆了以下几点:

  • "混乱"通常指的是硬件以太网网卡的一种模式,在这种模式下,它将冲突域中的所有数据包发送到内核网络堆栈,并让它进行分类发送(而不是仅单播到给定的MAC、订阅的多播和卡的正常操作模式下的广播)这在接收路径上

  • 从你的机器输出的所有数据都将通过机器上的网卡,所以"混杂"在这里根本不适用。

  • 您正在过滤基于TCP的协议(HTTP),但谈论的是数据包。这是错误的。TCP连接是一种可以(就套接字读取器和写入器而言)任意拆分为IP数据报的流。来自HTTP请求标头的URL可以在多个链接层帧之间进行拆分。无论如何,您都必须将它们重新缝合在一起并解析流。如果SSL正在使用,那么您甚至没有机会做到这一点。

如果您对HTTP过滤感兴趣,请阅读HTTP RFC,并阅读现有的开源代码,例如squid、nginx等。

如果你在网络堆栈中挖掘以更好地理解,那么阅读W.Richard Stevens的书,研究开源操作系统中的现有代码,查看BPF和netlink。

希望这能稍微澄清一下。

我在Windows中实现了这个模块,方法是使用两个独立的NIC,并在它们之间使用套接字/管道(无论您喜欢什么)在这个线程中

最新更新