在Linux机器上使用BPF和SOCK_DGRAM

weixin_38072204 2019-09-12 12:56:00
是否可以在数据报套接字上使用BPF过滤数据包? 我尝试连接过滤器时没有错误,但我没有收到任何数据包.我使用libpcap编译了一个过滤器,过滤器与tcpdump一起使用. 这是我的代码的缩短版本: static const char filter[] = "udp[8] == 0x00"; int sock = socket(AF_INET, SOCK_DGRAM, 0); pcap_t *pcap = pcap_open_dead(DLT_RAW, 1024); struct bpf_program bpf_prog; pcap_compile(pcap, &bpf_prog, filter, 0, PCAP_NETMASK_UNKNOWN); struct sock_fprog linux_bpf = { .len = bpf_prog.bf_len, .filter = (struct sock_filter *) bpf_prog.bf_insns, }; setsockopt(sock, SOL_SOCKET, SO_ATTACH_FILTER, &linux_bpf, sizeof(linux_bpf)); 我的机器是ubuntu 12.04 x86.
...全文
100 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38073691 2019-09-12
  • 打赏
  • 举报
回复
好吧,经过一些测试和试验,这是可能的.但是,libpcap不直接支持它. 应该做的是打开指定以太网数据类型的pcap处理程序,然后访问udp数据包中的字节,就像访问以太网数据包一样.过滤器偏移从数据包的开头开始,但“数据包”取决于您打开套接字的层.如果用SOCK_DGRAM打开套接字,bpf指令ldb 0将加载udp头的第一个字节.因此,当访问过滤器中的ether [0]时,libpcap会将其编译为ldb 0,这就是我们想要的. 所以,更正的代码应该是这样的: static const char filter[] = "ether[8] == 0x00"; int sock = socket(AF_INET, SOCK_DGRAM, 0); pcap_t *pcap = pcap_open_dead(DLT_EN10MB, 1024); struct bpf_program bpf_prog; pcap_compile(pcap, &bpf_prog, filter, 0, PCAP_NETMASK_UNKNOWN); struct sock_fprog linux_bpf = { .len = bpf_prog.bf_len, .filter = (struct sock_filter *) bpf_prog.bf_insns, }; setsockopt(sock, SOL_SOCKET, SO_ATTACH_FILTER, &linux_bpf, sizeof(linux_bpf));

435

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧