Одинаковые IP-адреса при захвате пакетов в Linux (программа C) - PullRequest
0 голосов
/ 26 сентября 2018

Я получаю сетевые пакеты, написав код в c.Пока я правильно получаю пакеты, но единственная проблема, с которой я сталкиваюсь, это то, что у меня одинаковые IP-адреса для Ethernet, TCP и UDP.У меня нет проблем при получении через tcpdump.

Источник Ethernet моей системы: b0:10:41:fc:d7:2f
И IP-адрес моего интерфейса: 192.168.10.145

Это полученные пакеты:

162 >>> Принятый пакет с 66 байтами: Ethernet src: b0: 10: 41: fc: d7: 2f dst: b0: 10: 41: fc: d7: 2f тип: 0x800 Версия IP: 4 ihl: 5 ttl: 64протокол: 6 источник: 192.168.10.145 dst 192.168.10.145 TCP источник: 46888 dst: 80 seq: 3048209837 победа: 4508 ACK 000000: b728 0050 b5af fdad 0e1d 21a1 8010 119c. (. P ......! ..... 0x0010: e258 0000 0101 080a 5a05 1f81 0595 4669

163 >>> Полученный пакет с 66 байтами: Ethernet src: b0: 10: 41: fc: d7: 2f dst: b0: 10: 41:fc: d7: 2f тип: 0x800 IP-версия: 4 ihl: 5 ttl: 64 протокол: 6 src: 192.168.10.145 dst 192.168.10.145 TCP src: 38836 dst: 443 seq: 1969857171 выигрыш: 341 ACK 000000: 97b4 01bb 7569 a2930473 15bc 8010 0155 .... ui ... s ..... U 0x0010: 11f1 0000 0101 080a 4011 29b5 45f5 c4da

164 >>> Полученный пакет с 1024 байтами: Ethernet src: 0:1a: a0: 3f: d6: fc dst: 0: 1a: a0: 3f: d6: fc тип: 0x800 IP vвыпадение: 4: 5: ttl: 64 протокол: 6 src: 110.93.233.24 dst 110.93.233.24 TCP src: 80 dst: 46888 seq: 236790177 победа: 595 ACK 000000: 0050 b728 0e1d 21a1 b5af fdad 8010 0253 .P. (..! ........ S 0x0010: 6e5f 0000 0101 080a 0595 46a1 5a05 199a n _........ FZ .. 0x0020: f107 eb73 1b82 1492 c88f e84c 101a 9416 ... s ....... L .... 0x0030: 9a27 900f 2020 1985 836f 79d5 8a26 15fa. '... ... oy .. & ..

И это мой код:

layer2: {
struct ethhdr *eth = (struct ethhdr*) data;
printf("\tEthernet src: %s dst: %s type: %#04x\n",
    ether_ntoa((const struct ether_addr*) eth->h_source),
    ether_ntoa((const struct ether_addr*) eth->h_dest),
    ntohs(eth->h_proto)
);
protocol = ntohs(eth->h_proto);
next_hdr = (char *) (eth + 1);}

layer3: switch (protocol) {
    case ETH_P_IP: {
        /* Parse IP protocol */
        struct iphdr *ip = (struct iphdr*) next_hdr;
        char buf[32];
        printf("\tIP version: %u ihl: %u ttl: %u protocol: %u src: %s dst %s\n",    
            ip->version,
            ip->ihl,
            ip->ttl,
            ip->protocol,
            inet_ntop(AF_INET, &ip->saddr, buf, sizeof(buf)),
            inet_ntop(AF_INET, &ip->daddr, buf, sizeof(buf))
        );

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Если следовать первому совету, не сработает.Может быть, вам нужен буфер для Ethernet тоже?

Например,

struct ethhdr * eth = (struct ethhdr *) Buffer;

и получите данные с помощью

eth-> h_dest [0], eth-> h_dest [1], eth-> h_dest [2], eth->h_dest [3], eth-> h_dest [4],> eth-> h_dest [5]

?

0 голосов
/ 26 сентября 2018

Вы используете один и тот же buf для хранения обоих IP-адресов:

inet_ntop(AF_INET, &ip->saddr, buf, sizeof(buf)),
inet_ntop(AF_INET, &ip->daddr, buf, sizeof(buf))

Поскольку вы используете одинаковый буфер, и оба вызова inet_ntop() являютсявыполненный до вызова printf(), последний вызов inet_ntop() перезапишет результаты первого вызова.

...