[python] Vyřešeno
Petr Mach
gsl na seznam.cz
Čtvrtek Listopad 10 08:02:27 CET 2005
Petr Mach napsal(a):
> Potřebuji monitorovat všechny pakety, které přicházejí a odcházejí z
> mého počítače. Zkusil jsem:
>
> s = socket.socket(socket.AF_INET, socket.SOCK_RAW, protocol)
>
> Ale tohle bohužel vede jen k monitorování příchozích paketů. Může mě
> někdo nakopnout správným směrem?
Takže číst všechny přicházející IP pakety přicházející dovnitř i
odcházející ven je možno přes socket vytvořený příkazem:
from socket import AF_PACKET, SOCK_DGRAM
from socket import socket, htons
ETH_P_ALL = 0x003 # linux/if_ether.h
rawSock = socket(AF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL))
Tento rawSocket se dá nabindovat na konkrétní síťové rozhraní příkazem:
rawSock.bind(("ppp0", ETH_P_ALL))
Upozorňuji, že se načítají kompletní IP pakety, tj. paket obsahuje IP
hlavičku a další data podle transportní vrstvy, třeba TCP nebo UDP
hlavičku. Přijatý paket se dá zpracovat např. takto (není to program,
jen upravený výstřižek z delšího programu):
from socket import inet_ntoa as ipN2A
from struct import pack, unpack
...
dgram=rawSock.recv(2**16) # max. mozna delka paketu je 2^16
# zpracovani ip hlavicky
typ_lHead, lDgram, prot, ipSrc, ipDes = \
unpack("!BxH5xB2x4s4s", dgram[:20])
typ = typ_lHead>>4
if typ == 4: # zpracovani IPv4
lHead = (typ_lHead&15) * 4
ipSrc = ipN2A(ipSrc)
ipDes = ipN2A(ipDes)
if prot == 6: # tcp
pSrc, pDes = unpack("!HH", dgram[lHead:lHead+4])
else:
pSrc = pDes = None
# vypisuje delku paketu, zdrojovou a cilovou IP adresu
# id protokolu a v případě TCP protokolu i čísla portů
print lDgram, ipSrc, ipDes, prot, pSrc, pDes
Další informace o konferenci Python