1

我已经在 Linux 中编写了自己的数据包嗅探器。

我打开一个套接字,socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))然后处理以太网数据包——解包 ARP 数据包、IP 数据包(以及其中的 ICMP / TCP / UDP 数据包)。

到目前为止,这一切都很好。

现在我可以像这样读取数据包 - 我还可以通过包装合适的以太网数据包并发送它来注入数据包。

但我想要的是一种阻止数据包的方法——可以说是消耗它们,这样它们就不会被进一步传递到系统中。

也就是说,如果一个 TCP 数据包被发送到端口 80,那么我可以用我的数据包嗅探器看到这个数据包,它会以通常的方式传递到 Web 服务器。

但是,基本上,我希望如果我发现数据包有问题——不是来自正确的 MAC 地址、格式不正确或只是破坏了安全策略——我可以“消费”数据包,然后不会进一步传送到 Web 服务器上。

因为我可以读取数据包和写入数据包 - 如果我也可以阻止数据包,那么我将拥有我需要的一切。

基本上,我不只是想监控网络流量,有时还可以控制它。例如,通过消耗原始传入数据包,然后将新的稍微改变的数据包写入不同的地址来“重新路由”数据包。或者只是根本不应该发送的普通块数据包。

我的应用程序是一个通用的“网络流量管理”程序。监控和记录流量。但也可以控制它 - 阻止数据包作为防火墙,重新路由数据包作为负载平衡器。

换句话说,我有一个数据包嗅探器——但如果它嗅到了难闻的东西,那么我希望它能够阻止那个数据包。尽早丢弃它,因此它不会进一步交付任何地方。

(能够在途中更改数据包也可能很方便 - 但如果我可以阻止,那么总是有可能完全阻止原始数据包,然后在其位置写出一个新的更改数据包。)

4

1 回答 1

1

您正在寻找的是libnetfilter_queue。文档仍然非常糟糕,但本示例中的代码应该可以帮助您入门。

我使用这个库开发了一个项目,该项目将网络数据包排队并在稍后重放它们。

于 2019-07-25T00:28:12.327 回答