如何在普通 Python 3 中监听原始以太网帧?

2023-12-13

我正在用 Python 进行一些自学的低级网络编程。我在用着乌班图18.04 and Python 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 的响应。我该如何做到这一点,希望不涉及任何非标准库?我希望代码尽可能“接近金属”,所以理想情况下我想监听整个以太网帧,这样我就可以手动解析它并找出它是否是我正在寻找的数据包为了。


这对我有用

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))

创建套接字时的第三个参数充当我们要捕获的传入帧类型的过滤器(此处全部)。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在普通 Python 3 中监听原始以太网帧? 的相关文章

随机推荐