如何在Ubuntu下捕获原始IP数据包?

时间:2016-06-19 18:18:37

标签: python linux ubuntu network-programming

我想使用Python捕获Ubuntu网络上的所有IP数据包。通过使用下面的代码,我得到了所有带有以太网头的数据包。如何摆脱以太网报头并直接获取IP数据包?

s = socket.socket( socket.AF_PACKET , socket.SOCK_RAW , socket.ntohs(0x0003))
while True:
    packet = s.recvfrom(65565)

2 个答案:

答案 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