Linux 原始套接字 : Block Packets?

标签 linux packet-sniffers raw-sockets raw-ethernet

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

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

到目前为止一切正常。

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

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

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

但是,基本上,我希望如果我发现数据包有问题 - 不是来自正确的 MAC 地址,以某种方式存在格式错误,或者只是违反了安全策略 - 我可以“使用”该数据包,并且它不会进一步传递到网络服务器上。

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

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

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

换句话说,我有一个数据包嗅探器 - 但如果它嗅到了一些难闻的东西,那么我希望它能够阻止该数据包。尽早丢弃它,这样它就不会进一步传递到任何地方。

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

最佳答案

您正在寻找的是libnetfilter_queue 。该文档仍然非常糟糕,但是 the code in this example应该可以帮助您入门。

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

关于Linux 原始套接字 : Block Packets?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57192698/

相关文章:

python - 在 python 中执行时 autossh 不工作

linux - 检查可用的处理核心

Java网络嗅探器错误问题

c# - 嗅探网络事件的最简单方法

c - 原始套接字 : sendto() and recvfrom() not working

c - 使用 ioctl TIOCOUTQ 进行套接字编程

c - SOCK_RAW 套接字中缺少 ARP 数据包

c++ - 处理客户端连接的最有效方式(套接字编程)

c - 按下键时如何准备好标准输入文件描述符?

networking - 如何查看 Windows 应用程序通过我的网络发送哪些数据?