如何更改以太网数据包(来自NIC的数据包)?我可以使用Netfilter挂钩吗?

时间:2011-07-31 10:16:29

标签: c++ linux qt netfilter

我希望在该数据包出现tcp / ip层之前捕获一个数据包,并使用C ++和UI将其提供给用户空间。

我该怎么做?是Qt& Netfilter可以做到这一点吗?

3 个答案:

答案 0 :(得分:2)

Qt在那里无助。你需要的是编写一个netlink NFQueue处理程序。当您的数据包与-j NFQUEUE规则匹配时,您的用户空间程序将接收这些数据包,允许您接受,删除或修改(修改)数据包(仅在mangle表中)。如果您可以使用GPLv2库,则应使用libnetfilter_queue来帮助您。

但请注意,mac图层不完整。这是因为网络代码需要支持各种设备类型,而某些非以太网设备没有MAc地址。在以太网设备上,您获得的通常只是发送方的MAC地址。

答案 1 :(得分:0)

您可以使用NFQUEUE和libnetfilter_queue。

iptables -t raw -I PREROUTING -p tcp -j NFQUEUE --queue-num 1

您可以在此网站中看到一个示例:

libnetfilter_queue_samplecode

Iptables flow

答案 2 :(得分:0)

您还可以使用称为“数据包套接字”的数据包。 它们用于在第2层发送或接收原始数据包。因此,基本上,数据包将直接到达您的程序,并且您可以在其上实现自己的第3层和第4层协议。 检查此官方手册页中的数据包套接字。

http://man7.org/linux/man-pages/man7/packet.7.html