如何通过 libnet 构建和发送 HTTP 302 重定向数据包?

How to build and send a HTTP 302 redirect packet by libnet?

我正在开发一个系统,可以检测本地网络中的请求。如果客户请求某个站点,系统将发送一个http重定向数据包。我通过libnet构建http重定向包,在Location中设置了新的uri,比如:

HTTP/1.1 302 临时移动
位置:http://www.example.com

但是不行,浏览器不去新站点。客户没有发送新的 GET 请求来重定向 url。

感谢您的所有回答。

您真正想要做的是实现一个 in-line 深度数据包检测设备,它可以检测 TCP 流、HTTP headers 并在检测到对特定内容的访问时执行自己的响应网站。

一般来说,不可能通过使用仅监控流量但流量不会通过的被动设备来执行复杂的application-level响应无源设备。

您很可能需要使用 netfilter 挂钩进行一些 Linux kernel-level 开发。如果您更喜欢进行用户空间编码,则可以将数据包传递到用户空间并再次返回内核空间。我的意见是,最好在用户空间执行复杂的 deep-packet 检查。

为了解析 HTTP header,您很可能需要创建自己的解析器生成器,因为 none 现有的解析器生成器可以满足深度数据包检测的所有需求。特别是,您希望将数据推送到解析器中,而不是让解析器通过调用 returns 一条数据的函数来拉取数据。解析器必须以增量方式工作。所以,yacc 或 bison 不起作用。此外,实际上 none 的网络协议在设计时就考虑到了 two-stage(词法分析器、解析器)解析,因此您很可能需要一种将词法分析器和解析器集成为一体并打开词素的解决方案并根据解析器上下文关闭。这不是一件容易的事。然而,没有解析器生成器来生成 HTTP header 解析代码将是一个完全的维护地狱。之前已经尝试过,简短的总结是:不要这样做。

请考虑深度数据包检测设备具有所谓的规避功能。例如,如果看到 "G"、"E"、"T"、“ ”、“/”、“ ”、"H" 而不是 "GET / HTTP/1.1\nHost: badsite.com\n\n",您会怎么做, "T", "T", "P", "/", "1", ".", "1", "\n", "H", "o", "s", "t", ":", " ", "b", "a", "d", "s", "i" , "t", "e", ".", "c", "o", "m", "\n", "\n" 在不同的TCP段?如果你想在你的系统中处理深度数据包检查规避,你将有很多工作要做。

免责声明:我曾在一家主要的网络安全设备供应商工作,所以我知道这些东西是如何实现的。