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