You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:03:43