如何在Python中识别数据包的目标与来源URL
在Python中判断数据包的目标与来源URL
首先得明确一点:你提供的这个数据包是TCP/IP层的原始数据包,里面只包含了源IP、目标IP、端口这些网络层/传输层的信息,并没有直接的URL——URL属于应用层(比如HTTP、HTTPS)的内容,只有当数据包承载了HTTP这类应用层协议的数据时,才能提取出URL。
下面分两种情况来解决你的问题:
一、从现有数据包提取基础网络端点信息
如果只是想从你给出的这类IP/TCP数据包中获取对应的网络地址和端口,可以用scapy这个常用的网络数据包处理库来解析:
1. 先安装scapy
pip install scapy
2. 解析你提供的数据包示例
我们可以把你给出的数据包信息构造为scapy的IP+TCP包,或者直接解析实际捕获的原始数据包:
from scapy.all import IP, TCP # 构造你提供的数据包(实际场景中可以替换为捕获到的真实数据包) ip_layer = IP(src="196.45.51.39", dst="10.0.9.137") tcp_layer = TCP(sport=3128, dport=52662) packet = ip_layer / tcp_layer # 提取源/目标网络信息 src_ip = packet[IP].src dst_ip = packet[IP].dst src_port = packet[TCP].sport dst_port = packet[TCP].dport print(f"来源IP: {src_ip},来源端口: {src_port}") print(f"目标IP: {dst_ip},目标端口: {dst_port}")
二、提取应用层的URL(以HTTP为例)
如果数据包是HTTP请求/响应,我们可以进一步解析应用层的 payload 来获取URL:
1. 捕获并解析HTTP数据包
from scapy.all import sniff, IP, TCP, Raw def extract_http_url(packet): # 检查数据包是否包含TCP层和应用层原始数据 if packet.haslayer(TCP) and packet.haslayer(Raw): payload = packet[Raw].load.decode(errors="ignore") # 判断是否为HTTP请求(匹配常见请求方法) if payload.startswith(("GET", "POST", "PUT", "DELETE")): # 从请求行中拆分出URL request_line = payload.split("\n")[0] method, url, _ = request_line.split(" ", 2) src_ip = packet[IP].src dst_ip = packet[IP].dst print(f"来源IP {src_ip} 请求的URL: {url}") print(f"请求的目标IP: {dst_ip}") # 捕获指定网卡上的HTTP数据包(可替换iface为你的网卡名称,比如"eth0") sniff(prn=extract_http_url, filter="tcp port 80", store=0)
2. 补充说明
- 对于HTTPS(443端口)的数据包,因为内容是加密的,直接解析原始数据包无法获取URL,需要借助中间人代理(如mitmproxy)或者证书解密的方式处理。
- 如果是其他应用层协议(比如FTP、DNS),需要对应解析协议的特定字段来获取类似资源路径的信息。
总结
你当前提供的数据包没有携带应用层数据,只能获取IP和端口信息;要获取URL,必须确保数据包包含HTTP等应用层协议的明文数据,再通过解析应用层内容提取。
内容的提问来源于stack exchange,提问作者sdq
相关产品推荐
相关产品推荐

