python - 使用 Python + 套接字构建数据包嗅探器
问题描述
所以我尝试用 Python 构建一个数据包嗅探器来加深我对网络的理解。事情是,事实证明它比我最初预期的更令人困惑。问题是所有具有详尽解释的资源都涵盖了为客户端/服务器数据发送/接收目的创建套接字的场景。
至此,我已经成功创建了一些处理 IPv4 和 ICMP 数据包头解码的类。现在,由于我的套接字代码似乎只捕获 ICMP 数据包,我一直在尝试对其进行配置,以便我可以捕获所有到达我的 wifi 接口的流量,但我仍然几乎只看到 ICMP 数据包(以 localhost 作为源和目标) .
所以,我有一些问题想得到解答。但首先,我的代码:
import socket
import sys
from protocols.ipv4 import IPv4
PACKET_SIZE = 65535
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
sock.bind(("0.0.0.0", 0))
try:
while True:
# read in a packet
raw_buffer = sock.recvfrom(PACKET_SIZE)[0]
# create an IP packet object
ip_header = IPv4(raw_buffer)
# print the packet
print(ip_header)
except KeyboardInterrupt:
print("\nExiting...")
sock.close()
sys.exit(0)
我是这样理解的:
首先,我创建一个带有 的套接字
socket.socket
,我在其中指定地址族、套接字类型和协议。就我而言,我选择了AF_INET
我不太了解的系列,但它似乎会从网络层产生数据包。套接字类型设置为SOCK_RAW
意味着我想要原始套接字,而不是SOCK_STREAM
用于 TCP 连接和SOCK_DGRAM
UDP。最后一个参数IPPROTO_IP
只是表明我只想要 IP 数据包。然后,我将套接字绑定到该套接字,该套接字
0.0.0.0
据称意味着“任何地址”,如此处所述。
我不明白的是:
最初,我看到了一些使用
AF_PACKET
地址族创建嗅探器套接字的示例。我很快发现这个地址系列在 macos(我正在使用)上不可用。这是为什么?什么是地址族它与套接字有何关系?是否有另一种方法可以从较低级别捕获数据包?在 Wireshark 中我可以看到以太网数据报,所以这似乎是可能的。正如我所说,我想嗅探所有到达我的 wifi 接口的流量。套接字如何知道我希望它在哪个接口上操作?我还了解到网络接口可以设置为不同的模式,如监控或混杂,这与套接字和我捕获数据包的目标有何关系?
为什么我几乎只捕获 ICMP 数据包?这些以 localhost 作为目标和源的数据包的目的是什么?
我知道我目前对此的理解存在很多差距。我不确定我是否能够让这个工作,但我很好奇,我会很感激任何类型的答案,甚至只是一些好的资源来检查。
编辑:我的主要问题是我在哪里可以找到更多关于数据包嗅探上下文中的套接字的信息?
解决方案
推荐阅读
- excel - Excel中如何避免公式中的重复表达式
- python - 从具有相同关键字的关键短语中删除关键字频率
- ios - 当我的应用程序最初由系统启动到后台时如何终止它
- java - BigDecimal 添加函数显示值不正确
- reactjs - default.props 的覆盖是如何发生的
- mysql - 使用 ON DUPLICATE KEY UPDATE 在父表上检测到重复项时如何更新子表
- database - 如何确定事务是否可冲突序列化?
- c++ - DLL 注入适用于某些进程,但不适用于其他进程
- python - 使用属性装饰器时类属性不更新
- reactjs - 从 axios 获得空响应