首页 > 解决方案 > 如何在 vanilla Python 3 中监听原始以太网帧?

问题描述

我正在用 Python 进行一些自学的低级网络编程。我正在使用Ubuntu 18.04Python 3。使用此代码,我可以发送原始以太网数据包:

from socket import socket as Socket, AF_PACKET, SOCK_RAW

def send_bytes(byte_sequence):
    with Socket(AF_PACKET, SOCK_RAW) as socket:
        socket.bind(("enp0s31f6", 0))
        socket.send(bytes(byte_sequence))

我可以使用此过程发送 ping。我知道它正在工作,因为我可以看到 ping 发出并在 Wireshark 中收到响应。

现在我想监听数据包,比如对我的 ping 的响应。我该如何做到这一点,希望不涉及任何非标准库?我希望代码尽可能“接近金属”,所以理想情况下我想监听整个以太网帧,这样我就可以手动解析它并确定它是否是我正在寻找的数据包为了。

标签: pythonsockets

解决方案


这对我有用

import sys
import socket
ETH_P_ALL=3 # not defined in socket module, sadly...
s=socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(ETH_P_ALL))
s.bind(("eth0", 0))
r=s.recv(2000)
sys.stdout.write("<%s>\n"%repr(r))

创建套接字时的第三个参数充当我们要捕获的传入帧类型的过滤器(所有这些都在这里)。

ETH_P_ALL常数来自/usr/include/linux/if_ether.h


推荐阅读