monitoring site na urovni TCP/UDP v Linuxu

Antonín Kolísek antonin.kolisek na centrum.cz
Úterý Březen 27 16:30:52 CEST 2007


Dobry den,
 ackoli sem asi tak uplne dotaz nepatri, hodne
souvisi s GNU/Linux, protoze prave v nem pisi program, ktery
nedela uplne co by mel. 

Problematika:
- pro jiste potreby odchytavam IP packety a z nich dale urcuji jestli
jsou TCP nebo UDP a dalsi veci...

Problem:
- pracuji-li na urovni Looback (proste se pripojuji od sebe k sobe, bezi u mne 
klient i server) je vse v poradku. Chci-li navazat treba ftp spojeni (ftp 
localhost) odchytim, ze se jedna o TCP spojeni (klient poslal serveru 
pozadavek o spojeni - SYN flag a server odpovedel SYN ACK)

- pokud pracuji na urovni internetu (napr ze sve stanice se chci pripojit na 
ftp, tedy ftp ftp.linux.cz) tak prvni co odchytim je SYN ACK od serveru, ale
nijak netusim kam se stratil SYN odemne jako od klienta putujici k serveru, 
ten proste nezaznamenam.

Viz demonstracni priklad:

#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>

#define PKT_LEN 8192

int main(){
	struct iphdr *ip;		//IP header
	struct tcphdr *tcp;	//TCP header
	struct udphdr *udp;	//UDP header
	int sd_tcp, sd_udp;
	char *buffer;

	buffer = (char *) malloc(PKT_LEN);
	memset(buffer, 0, PKT_LEN);
  
	sd_tcp = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);
	if (sd_tcp < 0)
		perror("Socket error()");
	
	 while((read(sd_tcp, buffer, 8192) > 0)){ 
		ip = (struct iphdr *) buffer;
    
		printf("-- IP Header --\n");
                printf("Zdrojova IP: %s\n", inet_ntoa(ip->saddr));
                printf("Cilova IP: %s\n", inet_ntoa(ip->daddr));
		
		tcp = (struct tcphdr *) (buffer + ip->ihl*4);	//init header TCP
		
		printf("-- TCP Header --\n");
		printf("Zdrojovy port: %d\n", ntohs(tcp->source));
		printf("Cilovy port: %d\n", ntohs(tcp->dest));
		printf("Cislo ACK: %u\n", ntohl(tcp->ack_seq));
		printf("Flag FIN: %d\n", tcp->fin);
		printf("Flag SYN: %d\n", tcp->syn);
		printf("Flag RST: %d\n", tcp->rst);
		printf("Flag PSH: %d\n", tcp->psh);
		printf("Flag ACK: %d\n", tcp->ack);
		printf("Flag URG: %d\n", tcp->urg);
		printf("-----KONEC-----");

		memset(buffer, 0, PKT_LEN);
	}
	return 0;
}

  Priklad je jen ciste demontracni, jde mi o to jestli je postup dobry a proc 
to zlobi.
  Budu vdecny za kazdou radu, protoze uz to resim nekolik dni a netusim kde je
bota.

Dekuji.

A.K.

-- 
Antonín Kolísek akolisek na linuxx.hyperlinx.cz
http://linuxx.hyperlinx.cz



Další informace o konferenci Linux