python - Python 中的数据包嗅探器

标签 python sockets networking sniffer

我想在 Python 3.5 中做一个数据包嗅探器来捕获 UDP、TCP 和 ICMP。这是一个简短的例子:

 import socket
 import struct

# the public network interface
HOST = socket.gethostbyname(socket.gethostname())
# create a raw socket and bind it to the public interface
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)

s.bind((HOST,0))

# Include IP headers
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# receive all packages
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

# receive a package
n=1
while(n<=400):
    print('Number ', n)
    data=s.recvfrom(65565)
    packet=data[0]
    address= data[1]
    header=struct.unpack('!BBHHHBBHBBBBBBBB', packet[:20])
    if(header[6]==6): #header[6] is the field of the Protocol
        print("Protocol = TCP")
    elif(header[6]==17):
        print("Protocol = UDP")
    elif(header[5]==1):
        print("Protocol = ICMP") 
    n=n+1

问题是它只捕获UDP数据包:( 输出:

Number  1 Protocol = UDP Number  2 Protocol = UDP Number  3 Protocol = UDP Number  4 Protocol = UDP Number  5 Protocol = UDP Number  6 Protocol = UDP Number  7

有两个选项:

  • 嗅探器只能抓到UDP包。
  • 我正在接收 UDP 数据包。

我认为最合乎逻辑的答案是我的嗅探器无法正常工作,它只是捕获 UDP。有什么想法吗?

最佳答案

我自己正处于创建 python 数据包解析器/嗅探器的阶段,在我的研究中我发现,为了能够解析所有传入的数据包,如 TCP、ICMP、UDP、ARP 等,你不能使用下面的套接字类型因为 socket.IPPROTO_IP 只给出 IP 数据包并且是一个虚拟协议(protocol)

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)

相反,您必须使用它并且最适合 Linux 系统

s = socket.socket( socket.AF_PACKET , socket.SOCK_RAW , socket.ntohs(0x0003))

关于python - Python 中的数据包嗅探器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37634494/

相关文章:

python - 基于属性表达式的对象列表排序

c - 写入关闭的本地 TCP 套接字不会失败

sockets - Golang 写入套接字而不用担心数据不完整

java - socket.outputStream 为什么要花这么多时间?

linux - 获取 IPv6 配置状态

python - GTK 弹出菜单未出现在鼠标位置

python - 如何让 pandas 的 groupby 命令返回 DataFrame 而不是 Series?

linux - 将主机端口转发到 docker 容器

python - 运行Curl Command并使用该状态后在RUNDECK中使用python编写条件来获取200 Ok状态

c - rt linux中如何从用户程序访问内核内存?