Image

Imageonorua wrote in Imageru_python

ARP+python

Кто-то писал на питоне ниже 3-го уровня? Я нашел http://www.monkey.org/~dugsong/dpkt/ . Идея запретить смену IP в сети. Когда приходит любой ARP request демон перехватывает его и отправляет ARP reply с MAC адресом который мне нужно. Если кто-то сталкивался уже с таким и мой алгоритм не правильный - с удовольствием выслушаю советы. Пока что делаю вот так:

def buildArp(sha, spa, tha, tpa):
arp_p = arp.ARP()
arp_p.sha = eth_aton(sha) # sender hardware addr
arp_p.spa = spa # sender ip addr
arp_p.tha = tha # dest hardware addr
arp_p.tpa = tpa # ip addr of request
arp_p.op = arp.ARP_OP_REPLY

packet = ethernet.Ethernet()
packet.src = eth_aton(sha)
packet.dst = tpa
packet.data = arp_p
packet.type = ethernet.ETH_TYPE_ARP

if debug: print dpkt.hexdump(str(packet))
return packet

s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW)
s.bind((iface,ethernet.ETH_TYPE_ARP))

while 1:

data = s.recv(1024)
if debug: print dpkt.hexdump(data)
sys.stdout.flush()


answer = ethernet.Ethernet(data)
arp_p = answer.data

spa = arp_p.spa
sha = arp_p.sha
tpa = arp_p.tpa

if debug:print dpkt.hexdump( str(arp_p) )

if arp_p.op == arp.ARP_OP_REQUEST:
#Sending packet
packet = buildArp('00:15:00:4A:8F:86', tpa, sha, spa)
s.send(str(packet))

Но вот незадача:
Диалог который получается в результате работы с моим демоном:
============================
14:43:50.283978 arp who-has 172.16.1.190 tell 172.16.1.76
0x0000: ffff ffff ffff 000d 87af ca33 0806 0001
0x0010: 0800 0604 0001 000d 87af ca33 ac10 014c
0x0020: 0000 0000 0000 ac10 01be 0006 0000 0001
0x0030: 0000 0000 0000 2043 4b41 4141
14:43:50.284363 arp reply 172.16.1.190 is-at 00:15:00:4a:8f:86
0x0000: ac10 014c 0000 0015 004a 8f86 0806 0001
0x0010: 0800 0604 0002 0015 004a 8f86 ac10 01be
0x0020: 000d 87af ca33 ac10 014c
=============================

А вот что получается когда reply отсылает не мой демон а машина:
16:15:58.508378 arp who-has 172.16.3.33 tell 172.16.3.1
0x0000: 0007 e92a 9486 0007 e92a eca8 0806 0001 ...*.....*......
0x0010: 0800 0604 0001 0007 e92a eca8 ac10 0301 .........*......
0x0020: 0000 0000 0000 ac10 0321 .........!
16:15:58.508727 arp reply 172.16.3.33 is-at 00:07:e9:2a:94:86
0x0000: 0007 e92a eca8 0007 e92a 9486 0806 0001 ...*.....*......
0x0010: 0800 0604 0002 0007 e92a 9486 ac10 0321 .........*.....!
0x0020: 0007 e92a eca8 ac10 0301 0000 0000 0000 ...*............
0x0030: 0000 0000 0000 0000 0000 0000 ............


В общем когда отвечаю я, arp кеш не перезаписывается, вопрос почему? Было подозрение что пакет маленький (я как не считал 28 байт не получается) но почему когда я REQUEST отправляю - мне все хорошо отвечается без проблем? Значит возможно проблема не в этом. Если есть идеи - подскажите пожалуйста. Спасибо.