Linux系统抓取数据包

原创 2015年07月10日 11:49:34

  这篇文章介绍了Linux下如何实现定制化的类wireshark程序的一些要点(不需要装pcap,利用Linux 的 socket 自带的一些功能)。

Ethernet frame

参考资料:
  https://en.wikipedia.org/wiki/Ethernet_frame
  http://www.cnblogs.com/uvsjoh/archive/2012/12/31/2840883.html

  以太网链路(Ethernet link )上的数据包(data packet)叫作以太网数据包(Ethernet packet),它包含(装载)了以太网帧(Ethernet frame)。
  真正通过Linux的Raw Socket得到的Ethernet包是到Ethernet frame这个层次(并且不包含CRC,因为系统会对其进行校验,能传给socket接收缓冲区的都是有效的frame,也不需要用CRC信息了),能否到整个Ethernet packet这个层次没有经过验证,不太清楚。
  Ethernet frame前面是preamble 和start frame delimiter (SFD)一共8个字节,属于Ethernet packet 在 physical layer的一部分。而Interpacket gap也不属于Frame的范畴,所以真正有用的信息也就是Frame就够了。可以看到payload 的大小可以到1500 octets(MTU)。可以看如下的表格,加深理解(Markdown编辑器还不太会弄,凑合看吧 - -#):


802.3 Ethernet packet and frame structure:

Layer Preamble Start of frame delimiter MAC destination MAC source 802.1Q tag(optional) Ethertype (Ethernet II) or length (IEEE 802.3) Payload Frame check sequence (32‑bit CRC) Interpacket gap
7 octets 1 octet 6 octets 6 octets (4 octets) 2 octets 46(42)–1500 octets 4 octets 12 octets
Layer 2 Ethernet frame From MAC destination To Frame check sequence (32‑bit CRC) ← 64–1518(1522) octets →
Layer 1 Ethernet packet From Preamble To Frame check sequence (32‑bit CRC)← 72–1526(1530) octets →

AF_INET 与 PF_PACKET

  平常所用到的网络编程都是在应用层收发数据,某些情况下我们需要执行更底层的操作,比如监听所有本机收发的数据、修改报头等。

  通过原始套接字,我们可以抓取本机收到的IP包(包括IP头和TCP/UDP/ICMP包头),也可以抓取本机收到的帧(包括数据链路层协议头)。SOCK_RAW提供了这种可能,利用原始套接字,我们可以自己构造IP头。

  有两种原始套接字:
  一种是处理IP层即其上的数据,通过指定socket第一个参数为AF_INET来创建这种socket。
  另一种是处理数据链路层即其上的数据,通过指定socket第一个参数为AF_PACKET来创建这种socket。

AF_INET表示获取从网络层开始的数据
  socket(AF_INET, SOCK_RAW, …)
当接收包时,表示用户获得完整的包含IP报头的数据包,即数据从IP报头开始算起。
  当发送包时,用户只能发送包含TCP报头或UDP报头或包含其他传输协议的报文,IP报头以及以太网帧头则由内核自动加封。除非是设置了IP_HDRINCL的socket选项。
  如果第二个参数为SOCK_STREAM, SOCK_DGRAM,表示接收的数据直接为应用层数据。

PF_PACKET表示获取的数据是从数据链路层开始的数据
  socket(PF_PACKET,SOCK_RAW,htos(ETH_P_IP)):表示获得IPV4的数据链路层帧,即数据包含以太网帧头。14+20+(8:udp 或 20:tcp)。
  ETH_P_IP: 在 <linux/if_ether.h>中定义,可以查看该文件了解支持的其它协议。
  SOCK_RAW, SOCK_DGRAM两个参数都可以使用,区别在于使用SOCK_DGRAM收到的数据不包括数据链路层协议头。


 socket(AF_INET,SOCK_RAW,IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP)发送接收ip数据包。
能:该套接字可以接收协议类型为(tcp udp icmp等)发往本机的ip数据包。
不能:收到非发往本地ip的数据包(ip软过滤会丢弃这些不是发往本机ip的数据包)。
不能:收到从本机发送出去的数据包。
发送的话需要自己组织tcp udp icmp等头部.可以setsockopt来自己包装ip头部。
这种套接字用来写个ping程序比较适合。

socket(PF_PACKET,SOCK_RAW|SOCK_DGRAM,htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))发送接收以太网数据帧。

这种socket可以监听网卡上的所有数据帧。

能: 接收发往本地mac的数据帧
能: 接收从本机发送出去的数据帧(第3个参数需要设置为ETH_P_ALL)
能: 接收非发往本地mac的数据帧(网卡需要设置为promisc混杂模式)

协议类型一共有四个:
ETH_P_IP 0x800 只接收发往本机mac的ip类型的数据帧
ETH_P_ARP 0x806 只接受发往本机mac的arp类型的数据帧
ETH_P_RARP 0x8035 只接受发往本机mac的rarp类型的数据帧
ETH_P_ALL 0x3 接收发往本机mac的所有类型ip arp rarp的数据帧,

  接收从本机发出的所有类型的数据帧.(混杂模式打开的情况下,会接收到非发往本地mac的数据帧)。

  理解一下SOCK_RAW的原理,比如网卡收到了一个 14+20+8+100+4 bytes的udp的以太网数据帧。
  首先,网卡对该数据帧进行硬过滤(根据网卡的模式不同会有不同的动作,如果设置了promisc混杂模式的话,则不做任何过滤直接交给下一层输入例程,否则非本机mac或者广播mac会被直接丢弃)。按照上面的ip例子,如果网卡关通过的话,会进入ip输入例程。但是在进入ip输入例程之前,会检查ip是否跟系统相匹配,另外系统会检查数据中是否有该socket所需要的套接字的协议。如果有,系统就给每个这样的socket接收缓冲区发送一个数据拷贝。然后进入下一步,用户便可以使用这块数据。
  ps:如果校验和出错,内核会直接丢弃该数据包。不会拷贝给sock_raw的套接字,因为校验和都出错了,数据肯定有问题,其包括所有信息都没有意义了。

Tips:设置网卡混杂模式的命令为:
在终端输入 sudo ifconfig eth0 promisc
并且重新启动电脑之后,网卡就取消了混杂模式,开机需要重新设置它为混杂模式。
可以使用ifconfig 查看eth0是否有了promisc这个混杂模式的标志。
取消混杂模式的命令为:sudo ifconfig eth0 -promisc

版权声明:本文为博主原创文章,未经博主允许不得转载。

网络数据包分析与抓取

多年的网络数据包分析与抓取经验,闲话少说,上干货。 先列举数据包的种类:1、Http数据包;2、UDP数据包;3、TCP数据包;4、ARP数据包;其实数据包的概念是很泛的,在软件可逆领域,数据包抓取、...
  • liao__yong
  • liao__yong
  • 2017年03月31日 09:48
  • 2148

抓取模拟器中的数据包

之前一直用的是Fiddler进行真机抓包,设置真机的wifi代理指向自己的电脑,这个好像是4.1之后才有的功能。现在手上没4.1的真机了,只能用模拟器了。网上找了一番,总结如下: 1、设置模拟器的-h...
  • ttdevs
  • ttdevs
  • 2013年12月02日 15:42
  • 1589

Linux 系统应用编程——网络编程(TCP/IP 数据包格式解析)

图中括号中的数字代表的是当前域所占的空间大小,单位是bit位。 黄色的是数据链路层的头部,一共14字节 绿色的部分是IP头部,一般是20字节 紫色部分是TCP头部,一般是20字节 ...
  • zqixiao_09
  • zqixiao_09
  • 2016年01月16日 10:01
  • 1269

使用tcpdump抓取Android系统手机数据包

一说到抓包工具大家可能会想到wireshark、tcpdump、fiddle等工具。wireshark功能很强大在windows下使用很方便,对linux下进行抓包可以使用tcpdump进行抓包后用w...
  • jiujiu372
  • jiujiu372
  • 2017年06月28日 14:37
  • 502

Fiddler 详尽教程与抓取移动端数据包

转载自:http://blog.csdn.net/qq_21445563/article/details/51017605 阅读目录 1. Fiddler 抓包简介     1). 字段说明 ...
  • weixin_35757704
  • weixin_35757704
  • 2017年07月26日 15:07
  • 1221

C#版数据包抓取过滤监控器

using System; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; names...
  • bjtbjt
  • bjtbjt
  • 2013年11月23日 18:35
  • 3761

网络抓包工具: 提供界面,可抓取网络数据包并显示

package DisplayNetInterface2;import java.awt.Button; import java.awt.Color; import java.awt.Dimensio...
  • u014257192
  • u014257192
  • 2016年10月16日 20:43
  • 1014

如何使用WireShark抓取数据包?

怎样设使用wireshark
  • venusic
  • venusic
  • 2015年12月16日 17:28
  • 4269

利用Fiddler抓取手机数据包

1、 在你的计算机上安装Fiddler并设置 2、 设置一台安卓手机是其通过你的计算机上网 3、 通过Fiddler抓取安卓手机上网数据包并分析 4、完成开始表格.doc文件...
  • shaynerain
  • shaynerain
  • 2016年12月08日 21:22
  • 60460

sniffer网络数据包抓取(Winpcap+MFC+vs)

主要分为以下几个步骤:  一:vs对于Winpcap的相关配置:              所需文件:http://pan.baidu.com/s/1i4DAvcx              配置步骤...
  • wkd_ywf
  • wkd_ywf
  • 2017年03月03日 18:44
  • 815
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux系统抓取数据包
举报原因:
原因补充:

(最多只允许输入30个字)