Я пытаюсь создать анализатор пакетов, который может изменять некоторые пакеты (используя Netfilter Queue и 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-фреймы (без фреймов Ethernet).
Я в замешательстве, потому что sniff()
функция из scapy может легко перехватывать пакеты Ethernet.
Например, 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 ]###
...
Можно ли перехватить (и изменить) например исходный MAC-адрес с помощью nfqueue?Я пробовал с разными типами сокетов, но ничего не получалось.