0

这是我要解决的问题,

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

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

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

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

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

任何有关我如何实现这一目标的帮助将不胜感激..

4

4 回答 4

3

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

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

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

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

于 2012-08-22T12:05:32.323 回答
0

我已经在 Windows 中通过使用两个单独的 NIC 并在此线程中使用它们之间的套接字/管道(无论你喜欢什么)来实现这个模块

于 2012-10-17T13:29:38.637 回答
0

您在这里混淆了几件事:

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

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

  • 您正在处理基于 TCP 的协议 (HTTP) 的过滤,但在数据包方面进行讨论。这是错误的。TCP 连接是一个可以(就套接字读取器和写入器而言)任意拆分为 IP 数据报的流。HTTP 请求标头中的 URL 可以拆分为多个链路层帧。无论如何,您都必须将它们缝合在一起并解析流。那么即使使用 SSL,你也没有机会。

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

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

希望这可以清除一点。

于 2012-08-22T15:08:58.553 回答
0

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

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

于 2012-08-22T14:33:00.370 回答