[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