如何用Python捕获IP接口数据包并创建监听器拦截本地UDP/TCP数据包?
嘿,没问题!针对你想在Python里实现的这两个网络功能,我给你整理了简单易懂的方案,就算网络知识不多也能轻松上手~
一、捕获IP接口上的数据包
最方便的工具当属scapy库了,它封装了底层抓包的复杂逻辑,用起来特别省心。
首先先安装它:
pip install scapy
然后就能写个简单的抓脚本来捕获数据包了,比如捕获所有经过指定网卡的数据包,还能自定义处理逻辑:
from scapy.all import sniff, IP, TCP, UDP def packet_handler(packet): # 只处理带IP层的数据包 if IP in packet: src_ip = packet[IP].src dst_ip = packet[IP].dst protocol = packet[IP].proto # 打印基础信息 print(f"来源IP: {src_ip} -> 目标IP: {dst_ip}") # 区分TCP/UDP if protocol == 6 and TCP in packet: print(f"TCP 端口: {packet[TCP].sport} -> {packet[TCP].dport}") elif protocol == 17 and UDP in packet: print(f"UDP 端口: {packet[UDP].sport} -> {packet[UDP].dport}") print("---") # 开始抓包,iface指定网卡名称(比如Windows的"以太网",Linux的"eth0"),prn是处理每个包的函数 sniff(iface="你的网卡名称", prn=packet_handler, store=0)
注意:抓包需要管理员/root权限,Windows要打开管理员命令行运行脚本,Linux要加
sudo。
二、创建监听器拦截本地UDP/TCP数据包
这个用Python自带的socket库就能实现,不用额外装包,非常基础实用。
1. UDP监听器
UDP是无连接的,所以监听器直接绑定端口就能接收数据包:
import socket # 创建UDP套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定本地地址和端口(0.0.0.0表示监听所有本地IP) local_addr = ("0.0.0.0", 12345) # 换成你要监听的端口 udp_socket.bind(local_addr) print(f"UDP监听器已启动,监听端口 {local_addr[1]}...") while True: # 接收数据包,bufsize是最大接收字节数 data, client_addr = udp_socket.recvfrom(1024) print(f"收到来自 {client_addr} 的UDP数据: {data.decode('utf-8')}")
2. TCP监听器
TCP是面向连接的,需要先监听端口,再接受客户端连接:
import socket # 创建TCP套接字 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定本地地址和端口 local_addr = ("0.0.0.0", 12345) # 换成你要监听的端口 tcp_socket.bind(local_addr) # 开始监听,backlog表示最大等待连接数 tcp_socket.listen(5) print(f"TCP监听器已启动,监听端口 {local_addr[1]}...") while True: # 接受客户端连接,返回新的套接字和客户端地址 conn, client_addr = tcp_socket.accept() print(f"已连接客户端: {client_addr}") while True: # 接收数据 data = conn.recv(1024) if not data: # 客户端断开连接 print(f"客户端 {client_addr} 已断开") break print(f"收到来自 {client_addr} 的TCP数据: {data.decode('utf-8')}") conn.close()
小提示:如果要拦截本地进程之间的数据包,上面的基础监听器只能捕获发送到对应端口的包。如果需要更底层的拦截(比如不指定端口,捕获所有本地TCP/UDP流量),可以结合
scapy的过滤规则,比如sniff(filter="host 127.0.0.1", prn=packet_handler),这样就能捕获本地回环的所有数据包。
如果还有细节想调整,比如过滤特定IP/端口,或者处理数据包的逻辑,随时问就行~
内容的提问来源于stack exchange,提问作者Kamal
相关产品推荐
相关产品推荐

