停止网卡上的数据包

时间:2012-08-22 11:53:01

标签: python c networking

这是我要解决的问题,

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

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

我已经对此进行了一些搜索..

libpcap / pcap.h允许我在网卡上读取数据包,但是我还没有找到一种方法来阻止这些数据包或将新数据包注入网络。

某些东西,如python中的twisted或scapy,允许我设置一个正在侦听某个本地端口的服务器,然后我可以使用代理配置将我的浏览器配置为连接到它。这个应用程序可以做这些东西..但我滥用的主要目的是在这里击败..

我将非常感谢任何有关如何实现这一目标的帮助。

4 个答案:

答案 0 :(得分:3)

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

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

但是,如果您仍希望继续进行数据包拦截,则可以使用netlink中的netfilters在用户空间中执行此操作。我相信libnl周围有python包装。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

你在这里混淆了几件事:

  • “Promiscuous”通常是指硬件以太网网卡的一种模式,它在其冲突域中将所有数据包传送到内核网络堆栈并对其进行排序(vs只需单播给定MAC,订阅多播,并在卡的正常操作模式下进行广播)。 这是在接收路径上。

  • 从你的机器出站的所有数据都将通过机器上的网卡(其中一个),所以“混杂”在这里根本不适用。

  • 您正在尝试过滤基于TCP的协议(HTTP),但请谈谈数据包。这是错的。 TCP连接是一个可以(就插槽读取器和编写器而言)被任意拆分为IP数据报的流。来自HTTP请求标头的URL可以跨多个链路层帧分割。无论如何,你必须将它们拼接在一起并解析流。如果正在使用SSL,那么你甚至没有机会。

如果您对HTTP过滤感兴趣,请阅读HTTP RFCs,并阅读现有的开源代码,例如squidnginx

如果您正在挖掘网络堆栈以获得更好的理解,请阅读W. Richard Stevens books,查看开源操作系统中的现有代码,查看BPFnetlink

希望这清楚一点。

答案 3 :(得分:0)

我已经在Windows中使用两个独立的NIC并在它们之间使用套接字/管道(无论你喜欢什么)in this thread

实现了这个模块