我想使用Python捕获Ubuntu网络上的所有IP数据包。通过使用下面的代码,我得到了所有带有以太网头的数据包。如何摆脱以太网报头并直接获取IP数据包?
s = socket.socket( socket.AF_PACKET , socket.SOCK_RAW , socket.ntohs(0x0003))
while True:
packet = s.recvfrom(65565)
答案 0 :(得分:2)
我建议您查看scapy
,这是一个使用户能够发送,嗅探,剖析和伪造网络数据包的工具。 sniffing段可能是您正在寻找的内容。这是一个示例,我捕获10个IP数据包,显示其信息摘要,然后将它们存储到pcap文件中:
$ scapy
Welcome to Scapy (2.3.2)
>>> pkts = sniff(filter='ip', count=10)
>>> print len(pkts)
10
>>> pkts.nsummary()
0000 Ether / IP / TCP 31.13.90.2:https > 192.168.1.14:63748 PA / Raw
0001 Ether / IP / TCP 192.168.1.14:63748 > 31.13.90.2:https A
0002 Ether / IP / TCP 192.168.1.14:63748 > 31.13.90.2:https PA / Raw
0003 Ether / IP / TCP 31.13.90.2:https > 192.168.1.14:63748 PA / Raw
0004 Ether / IP / TCP 192.168.1.14:63748 > 31.13.90.2:https A
0005 Ether / IP / UDP 192.168.1.21:48007 > 192.168.1.255:32412 / Raw
0006 Ether / IP / UDP 192.168.1.21:49808 > 192.168.1.255:32414 / Raw
0007 Ether / IP / UDP 192.168.1.11:64817 > 192.168.1.255:32412 / Raw
0008 Ether / IP / UDP 192.168.1.11:64819 > 192.168.1.255:32414 / Raw
0009 Ether / IP / UDP 192.168.1.11:49670 > 239.255.255.250:ssdp / Raw
>>> wrpcap("temp.cap",pkts)
>>>
答案 1 :(得分:0)
socket (AF_INET, SOCK_RAW, IPPROTO_RAW)
将为您提供IP图层原始套接字
socket (PF_PACKET, SOCK_RAW, htons (ETH_P_ALL))
将为您提供第2层原始套接字
有一些例子(在C中)here。