2012-02-05 7 views
0

Я пытаюсь захватить входящие, а также исходящие пакеты icmpv6, выходящие с хоста в Linux. Для этого я написал следующую программу. В этой программе мы можем улавливать входящие пакеты, а не исходящие пакеты. Trapping отлично работает для пакетов icmpv4 (прокомментированная часть кода), но для icmpv6-пакетов это проблема. Я не заинтересован в использовании фильтра фильтрации пакетов (Berkley Packet Filter), который немного интрузивен по сравнению с методом, который я использовал ниже. Можете ли вы сообщить мне, есть ли что-то еще, что можно было бы использовать для этого? Или Linux предоставляет какой-либо другой механизм для этого?Ловушка исходящих пакетов icmpv6 на linux с использованием RAW-сокетов

int main(int argc,char *argv[]) 
{ 
    char buf[500]; 
    struct icmp6_hdr *icmpv6_hdr; 
    int raw_socket = socket(AF_INET, SOCK_RAW,IPPROTO_ICMPV6); 
    //int raw_socket = socket(AF_INET, SOCK_RAW,IPPROTO_ICMP); 
    if(raw_socket <=0) 
    { 
     perror("Could not create raw socket"); 
     exit(1); 
    } 
    while(1) 
    { 
     if(recvfrom(raw_socket, buf, 500, 0,NULL,NULL)<0) 
     { 
      perror("error in recvfrom"); 
      break; 
     } 
     else 
     { 
      icmpv6_hdr = (struct icmp6_hdr *)buf; 
      switch(icmpv6_hdr->icmp6_type) 
      { 
       case ND_ROUTER_SOLICIT: 
        printf("ND_ROUTER_SOLICIT"); 
        break; 
       case ND_ROUTER_ADVERT: 
        printf("ND_ROUTER_ADVERT"); 
        break; 
       case ND_NEIGHBOR_SOLICIT: 
        printf("ND_NEIGHBOR_SOLICIT"); 
        break; 
       case ND_NEIGHBOR_ADVERT: 
        printf("ND_NEIGHBOR_ADVERT"); 
        break; 
       default: 
        printf("icmpv6_type:%x\n",icmpv6_hdr->icmp6_type); 
      } 
     } 
    } 
    return 0; 
} 

ответ

0

Существует библиотека, которая предназначена для захвата любого сетевого трафика, проходящего через ваш сетевой адаптер PCAP. Он имеет внутренний фильтр, который вы можете настроить в соответствии с icmpv6. Это библиотека, которую Wireshark и tcpdump используют для обнюхивания трафика. http://www.tcpdump.org/pcap.html

Если вы не хотите быть «навязчивым», обязательно отключите беспорядочный режим.

0

Ну, я знаю только о ICMPv6. Поскольку ICMPv6 содержит гораздо больше сообщений, чем ICMPv4, они создают фильтр sockopt. Вы можете прочитать о деталях в соответствующем документе RFC:

http://tools.ietf.org/html/rfc2292#section-3.2

Это все там. В принципе, у вас есть структура, определите маску фильтра с некоторыми макросами и задайте опцию сокета. Это работает только для IPv6.

Кроме того, вы хотите создать сокет, как это: гнездо (AF_INET6, SOCK_RAW, IPPROTO_ICMPV6)