《Linux下Sniffer程序的实现》这篇文章对其关系表述的比较准确。
另外一篇英文参考Inside the Linux Packet Filter 很深入
1,LINUX中PF_PACKET的协议簇允许应用程序直接利用网络驱动程序发送和接收报文,支持两个稍微有点不同的SOCKET类型,SOCK_DGRAM和SOCK_RAW。前者让内核处理添加或者去除以太网报文头部工作,而后者则让应用程序对以太网报文头部有完全的控制!
2,把过滤过程尽可能早的放报文进程链中,LINUX的内核允许我们把一个名为LPF(Linux Packet Filter)的过滤器直接放到PF_PACKET protocol-processing routines(在网卡接收中断执行后立即执行)中,过滤器将决定哪些包被送到应用程序,哪些包被丢弃!这个过滤程序可以根据使用者的定义来运行,由BPF伪机器码写成的。
3,这个过滤器也不是总是有效的,因为它产生于一般的使用BPF的机器,没考虑到一些特殊结构的机器!在一些特殊情况下,过滤器由PF_PACKET进程运行,也许已经检查过以太协议了!这个根据你在socket()调用初使化的时候指定的那些协议!如果不是ETH_P_ALL(抓所有的报文),那么只有那些符合指定的协议类型的报文会流过过滤器!
4,libpcap提供的一个最有用的函数是pcap_compile(), 它可以把一个输入输出的逻辑表达式变为BPF代码!tcpdump利用这个函数完成在用户输入的命令行和BPF代码之间的转换!tcpdump有个我们很感兴趣但是很少使用的参数 ,-d,可以输出BPF代码!把tcpdump -d中的-d换成-dd,将显示出一段C代码,可以把它复制到自己的程序中,可以通过调用setsockopt()来过滤端口!
阅读(6957) | 评论(1) | 转发(1) |