sock_filter之bpf
本文最后更新于:2025年11月19日 下午
在linux上,我们创建socket收包时,默认会把指定协议的所有数据包收上来。
如指定的ETH_P_ALL,那么所有包都会收上来,如果指定IPPROTO_ICMPV6,那么只会收icmpv6的报文。
有时我们想过滤部分数据包怎么办呢?
使用setsockopt的SO_ATTACH_FILTER选项设置过滤器到内核。
SO_ATTACH_FILTER使用
通过SO_ATTACH_FILTER选项,可以把我们设置的filter发送到内核,内核运行filter之后再决定是否把数据包收到应用层。
一般性的代码为:
1 | |
重点在于sock_filter这个结构怎么填充,怎么写,语法如何。
使用tcpdump生成过滤器代码
使用tcpdump的-dd参数命令,可以直接生成sock_filter的代码,例如过滤icmpv6的NS和NA报文。
1 | |
这种方法最简单,但是代码不易读,需要写注释用什么产生的。
手写过滤器代码
实例如下:
1 | |
这个规则比较复杂。
其他过滤api
针对icmpv6有一些api可以调用,如
1 | |
参考
[# Linux bpf 3.1、Berkeley Packet Filter (BPF) (Kernel Document)
sock_filter之bpf
https://leon0625.github.io/2024/03/15/098666119136/