Portál AbcLinuxu, 13. května 2025 20:35

Dotaz: Vyhodnoceni TCP provozu (Linux + ANSI C)

27.3.2007 16:37 ext3fs
Vyhodnoceni TCP provozu (Linux + ANSI C)
Přečteno: 234×
Odpovědět | Admin
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:

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.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Na otázku zatím nikdo bohužel neodpověděl.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.