Модифицировать пакеты на лету с помощью Scapy?
Можно ли сделать это?
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)
2 ответа
Нет никакого способа сделать это, потому что Scapy анализирует пакеты, не вмешиваясь в стек IP хоста.
Вы можете отправить другой пакет, основанный на прослушанном пакете, но вы не можете "отбросить пакет" с помощью Scapy.
Единственное решение, которое я могу придумать, под Linux, включает iptables + libnfqueue и его привязки Python + Scapy. Но очевидно, что если вы просто хотите перенаправить пакет, одного iptables достаточно и намного лучше.
В любой другой операционной системе вам в любом случае нужно иметь какое-то программное обеспечение брандмауэра для передачи пакета в пользовательскую программу (например, libnfqueue под Linux, здесь вы можете использовать магию Scapy) или для изменения самого пакета.
Может быть, вы могли бы взглянуть на программное обеспечение IPS (suricata?), Поскольку вмешательство в пакеты на основе некоторых критериев - это то, что делает IPS.
Нечто подобное должно работать, хотя и не самое красивое:
from scapy.all import *
def action(packet):
if not "203.105.78.163" in packet[0][1].src and not "203.105.78.163" in packet[0][1].dst:
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)