Перехватывать исходящие пакеты icmpv6 в linux с помощью сокетов RAW - PullRequest
0 голосов
/ 05 февраля 2012

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

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;
}

Ответы [ 2 ]

0 голосов
/ 15 февраля 2013

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

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

Все это есть.По сути, у вас есть структура, определите маску фильтра с некоторыми макросами и установите опцию сокета.Конечно, это работает только для IPv6.

Также вы хотите создать сокет следующим образом: сокет (AF_INET6, SOCK_RAW, IPPROTO_ICMPV6)

0 голосов
/ 17 февраля 2012

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

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

...