python - 如何在 vanilla Python 3 中监听原始以太网帧?
问题描述
我正在用 Python 进行一些自学的低级网络编程。我正在使用Ubuntu 18.04和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))
创建套接字时的第三个参数充当我们要捕获的传入帧类型的过滤器(所有这些都在这里)。
ETH_P_ALL
常数来自/usr/include/linux/if_ether.h
。