使用socket BPF
Linux内核工程导论——网络:Filter(LSF、BPF、eBPF)
注意(文中描述的内容):
此外,这段BPF代码还存在的一个问题是,一般情况下tcpdump只返回所捕获包的头96字节,也就是0×60字节,可见代码的倒数第二行是ret #96。对于需要完整的包处理还是不行的,因此你需要将其设置为0×0000ffff,或者在用tcpdump生成的时候用tcpdump -s 65535 -dd … 来生成
1、我的tcpdump 生成BPF code时,长度直接就是0x0000ffff 而非0x60,可能与tcpdump版本有关系
[root@dvrdvs nfs] # ./tcpdump udp -dd device eth0 entered promiscuous mode { 0x28, 0, 0, 0x0000000cdevice eth0 left promiscuous mode }, { 0x15, 0, 5, 0x000086dd }, { 0x30, 0, 0, 0x00000014 }, { 0x15, 6, 0, 0x00000011 }, { 0x15, 0, 6, 0x0000002c }, { 0x30, 0, 0, 0x00000036 }, { 0x15, 3, 4, 0x00000011 }, { 0x15, 0, 3, 0x00000800 }, { 0x30, 0, 0, 0x00000017 }, { 0x15, 0, 1, 0x00000011 }, { 0x6, 0, 0, 0x0000ffff }, { 0x6, 0, 0, 0x00000000 }, [root@dvrdvs nfs] # ./tcpdump -dd ether proto 0x8033 device eth0 entered promiscuous mode { 0x28, 0, 0, 0xdevice eth0 left promiscuous mode 0000000c }, { 0x15, 0, 1, 0x00008033 }, { 0x6, 0, 0, 0x0000ffff }, { 0x6, 0, 0, 0x00000000 }, [root@dvrdvs nfs] # ./tcpdump --help ./tcpdump: invalid option -- - tcpdump version 4.5.1 libpcap version 1.5.2
BPF(BSD Packet Filter)--应用和理念扩展
Linux下PF_PACKET的使用,RARP的server和client程序 (转)
.在使用SOCK_RAW, SOCK_DGRAM和SOCK_PACKET的区别
在socket的第一个参数使用PF_PACKET的时候,上述三种socket的类型都可以使用。但是有区别。
(1)使用SOCK_RAW发送的数据必须包含链路层的协议头,接受得到的数据包,包含链路层协议头。而使用SOCK_DGRAM则都不含链路层的协议头。
(2)SOCK_PACKET也是可以使用的,但是已经废弃,以后不保证还能支持,不推荐使用。
(3)在使用SOCK_RAW或SOCK_DGRAM和SOCK_PACKET时,在sendto和recvfrom中使用的地址类型不同,前两者使用sockaddr_ll类型的地址,而后者使用sockaddr类型的地址。
(4)如socket的第一个参数使用PF_INET,第二个参数使用SOCK_RAW,则可以得到原始的IP包。