我想创建分组嗅探器可以修改某些数据包(使用Netfilter的队列和Scapy的)。
首先我的脚本将iptable的规则iptables -t raw -A PREROUTING -j NFQUEUE --queue-num 1
。
第二,我正在使用自定义处理程序创建队列
import netfilterqueue
from scapy.all import *
import socket
def handler(pkt):
hexdump(pkt.get_payload())
pkt.accept()
nfqueue = netfilterqueue.NetfilterQueue()
nfqueue.bind(1, handler)
s = socket.fromfd(nfqueue.get_fd(), socket.AF_PACKET, socket.SOCK_RAW)
try:
nfqueue.run_socket(s)
except KeyboardInterrupt:
pass
s.close()
nfqueue.unbind()
但是我只能从pkt.get_payload()
中获得IP帧(没有以太网帧)。
我很困惑,因为来自scapy的sniff()
函数可以轻松捕获以太网数据包。
例如sniff(prn=lambda pkt:pkt.show())
可以返回
###[ Ethernet ]###
dst= 00:00:00:00:00:00
src= 00:00:00:00:00:00
type= 0x86dd
###[ IPv6 ]###
...
###[ UDP ]###
...
###[ Raw ]###
...
是否有可能使用nfqueue赶上(和修改)例如源MAC地址?我尝试使用不同的套接字类型,但没有任何效果。