Nowe posty

Autor Wątek: czytanie danych z interfejsu sieciowego  (Przeczytany 3633 razy)

cysioo85

  • Gość
czytanie danych z interfejsu sieciowego
« dnia: 2010-03-03, 17:10:03 »
Cześć,

Chciałbym się podpiąć do interfejsu sieciowego (np. eth0) i zczytać z niego dane. Nie chcę się podpinać pod jakiś konkretny port jak przy tworzeniu serwera ani czytać wszystkiego, co tylko doleci do NIC-a (jak w trybie promiscous). Chcę widzieć wszystkie dane, jakie przechodzą przez interfejs (i są dla mojego hosta przeznaczone).


Nie jestem linuxowym ekspertem (właściwie to dopiero zaczynam). Przypuszczam, że powinienem znaleźć jakiś deskryptor pliku, z którym interfejs jest skojarzony, ale nie mam najmniejszego pojęcia jak go uzyskać, a cały dzień googlowania przyniósł raczej mierne rezultaty.


Właściwie to nie korzystam z eth0, ale z wirtualnych interfejsów tun/tap. Chciałem zrobić coś w oparciu o przykłady, jakie prezentują twórcy (konkretnie: http://tun.sourcearchive.com/documentation/1.1/br__select_8c-source.html). Ich przykład powinien tworzyć most między dwoma interfejsami tun/tap, ale chyba jest skopany (chociażby dlatego, że w katalogu /dev/ nie tworzą się interfejsy).

W katalogu /dev/net/ jest urządzenie tun, które wykorzystuję do tworzenia i konfigurowania interfejsu

Poniższy kod niestety blokuje się na select() zamiast wypisać to, co przyszło do interfejsu (np. gdy pinguję go)
struct ifreq ifr;
int f1, l;
fd_set fds;
char buf[1600];

sprintf(tun,"/dev/net/tun");
   f1 = open(tun, O_RDWR);
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags=IFF_TUN;
strcpy(ifr.ifr_name, "tun%d");
//create tun interface
   if ( ioctl(f1, TUNSETIFF, (void*)&ifr) != 0)
   {
  close(f1);
  err(1, "configuring /dev/net/tun");
   }

//...ustawienie adresu IP i podniesienie interfejsu...

while(1)
  FD_ZERO(&fds); //czyścimy zbiór deskryptorów
       FD_SET(f1, &fds); //dodajemy do tego zbioru deskryptor opisujący tun

ret = select(f1+1, &fds, NULL, NULL, NULL);

if( FD_ISSET(f1, &fds) )
{
  l = read(f1,buf,sizeof(buf));
  sprintf(buf,"%s\\0",buf);
  printf ("%s",buf);
}
}
Tak więc: wyciągnąć dane przechodzące przez interfejs?

arctgx

  • Gość
czytanie danych z interfejsu sieciowego
« Odpowiedź #1 dnia: 2010-03-03, 18:20:24 »
Nie mam praktycznie o tym pojęcia, ale strzelę: czy nie wystarczy podpatrzyć źródeł programu tcpdump?

cysioo85

  • Gość
czytanie danych z interfejsu sieciowego
« Odpowiedź #2 dnia: 2010-03-04, 10:20:42 »
hmm... nie pomyślałem o tym, dzięki:>

A tak dla ścisłości: tcpdump korzysta z pcap/libpcap i wykorzystanie tego jest niezłą opcją.

Nie jestem takim kozakiem, by sprawdzać, jak pcap to robi (a właściwie nie mam czasu), ale jak by był ktoś mimo wszystko wiedział, gdzie trafiają dane przechodzące przez interfejs, to chętnie posłucham