【发布时间】:2011-07-31 10:16:28
【问题描述】:
我想在数据包到达 tcp/ip 层之前捕获一个数据包,并使用 C++ 和 UI 将其提供给用户空间。
我该怎么做? Qt & Netfilter 可以做到这一点吗?
【问题讨论】:
-
我想在从数据链路层收到数据包之前将数据包发送到用户空间并更改它们,然后将更改后的数据包发送到特定的网卡
我想在数据包到达 tcp/ip 层之前捕获一个数据包,并使用 C++ 和 UI 将其提供给用户空间。
我该怎么做? Qt & Netfilter 可以做到这一点吗?
【问题讨论】:
Qt 在那里束手无策。您需要编写一个 netlink NFQueue 处理程序。当您的数据包与 -j NFQUEUE 规则匹配时,您的用户空间程序将接收这些数据包,允许您接受、丢弃或修改(修改)数据包(仅在 mangle 表中)。如果你可以使用 GPLv2 库,你应该使用libnetfilter_queue 来帮助你。
但是请注意,mac 层并不完整。这是因为网络代码需要支持各种设备类型,而一些非以太网设备没有 MAC 地址。在以太网设备上,你得到的通常只是发送者的 MAC 地址。
【讨论】:
您可以使用 NFQUEUE 和 libnetfilter_queue。
iptables -t raw -I PREROUTING -p tcp -j NFQUEUE --queue-num 1
你可以在这个网站上看到一个例子:
【讨论】:
您还可以使用称为数据包套接字的东西。 它们用于在第 2 层发送或接收原始数据包。因此,基本上数据包将直接进入您的程序,您可以在其上实现自己的第 3 层和第 4 层协议。 查看此官方手册页以获取数据包套接字。
【讨论】: