如何使用Scapy实时修改数据包?

2 投票
1 回答
7305 浏览
提问于 2025-04-18 09:04

这样做有可能吗?

from scapy.all import *

def action(packet):
    print packet[0][1].src + "==>" + packet[0][1].dst
    print "Rerouting to localhost"
    packet[0][1].dst = '127.0.0.1'
    print packet[0][1].src + "==>" + packet[0][1].dst
    sendp(packet)

sniff(filter="dst host 203.105.78.163",prn=action)

类似这样的操作,但有没有办法把数据包发送到本地,同时丢掉发送到203.105.78.163的数据包?(不使用iptables)

1 个回答

2

这件事是做不到的,因为Scapy在嗅探数据包时不会干扰主机的IP协议栈。

你可以根据嗅探到的数据包发送另一个数据包,但用Scapy无法“丢弃”一个数据包。

我能想到的唯一解决方案是在Linux下使用iptables + libnfqueue及其Python绑定 + Scapy。不过,显然如果你只是想重新路由一个数据包,单靠iptables就足够了,而且效果更好。

在其他操作系统下,你无论如何都需要一些防火墙软件来将数据包传递给用户程序(像Linux下的libnfqueue,这里你可以施展Scapy的魔法)或者直接修改数据包。

也许你可以看看IPS软件(比如suricata?),因为根据某些标准修改数据包正是IPS的功能。

撰写回答