三个相关问题:
原始套接字是否具有与内核 BPF(由 libpcap 使用)等效的过滤方法?
打开原始套接字是否意味着它会接收计算机上的每个 IP 数据包?
iptables 如何与原始套接字交互 - 原始套接字是否能看到 iptables 丢弃的数据包?
最佳答案
- Do raw sockets have any method of filtering equivalent to the in-kernel BPF (used by libpcap)?
他们确实这么做了,而且不仅仅是等价的:他们本身支持 BPF 过滤器。您可以像这样附加一个套接字:
setsockopt(socket, SOL_SOCKET, SO_ATTACH_FILTER, &bpf_filter, sizeof(bpf_filter));
(this question中有完整的示例)。
在过去的几年中,BPF 在 Linux 上经历了很多变化,现在您可以将其附加到各种网络 Hook :套接字,还有 tc 入口/导出接口(interface)、XDP(在具有兼容驱动程序的 NIC 上) 。另外:kprobes、tracepoints、perf events、cgroups,也许还有更多……用于跟踪/监控。
抱歉,我不太确定回答问题 2 和 3。
关于linux - 如何使用原始套接字仅监听想要的流量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25017987/