发送邻居请求而不是ICMPV6回应请求

时间:2014-02-04 12:04:56

标签: c ipv6

我正在尝试发送ICMPV6回应请求。我的代码:

        struct icmp6_hdr icmp6;
        int sock;
        struct icmp6_filter filterv6;
        struct ifreq ifr;

        sock = socket(AF_INET6, SOCK_RAW,IPPROTO_ICMPV6);

        ICMP6_FILTER_SETBLOCKALL(&filterv6);
        ICMP6_FILTER_SETPASS(ICMP6_DST_UNREACH, &filterv6);
        ICMP6_FILTER_SETPASS(ICMP6_PACKET_TOO_BIG, &filterv6);
        ICMP6_FILTER_SETPASS(ICMP6_TIME_EXCEEDED, &filterv6);
        ICMP6_FILTER_SETPASS(ICMP6_PARAM_PROB, &filterv6);  
        ICMP6_FILTER_SETPASS(ICMP6_ECHO_REPLY, &filterv6);
        ICMP6_FILTER_SETPASS(ND_REDIRECT, &filterv6);

        setsockopt(sock, IPPROTO_ICMPV6, ICMP6_FILTER, &filterv6, sizeof (filterv6));
        ...
        setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof ifr);
        ...

        icmp6.icmp6_type = ICMP6_ECHO_REQUEST;
        icmp6.icmp6_code = 0;
        icmp6.icmp6_cksum = 0;
        icmp6.icmp6_id = id;
        icmp6.icmp6_seq = 100;

       if( (sendto(sock, &icmp6, sizeof(struct icmp6_hdr), 0, (struct sockaddr *)dest, socklen)) != sizeof(struct icmp6_hdr))

但是,由于未知原因,发送的数据包是NDS:

[root@jingo ~]# tcpdump -v -i any  -s0 | grep icmp6
tcpdump: WARNING: Promiscuous mode not supported on the "any" device
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes

11:57:08.397368 IP6 (hlim 255, next-header: ICMPv6 (58), length: 32) 2001:db8:0:85a3::ac1f:8003 > ff02::1:ff1f:8009: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has 2001:db8:0:85a3::ac1f:8009
11:57:09.397331 IP6 (hlim 64, next-header: ICMPv6 (58), length: 112) 2001:db8:0:85a3::ac1f:8003 > 2001:db8:0:85a3::ac1f:8003: [icmp6 sum ok] ICMP6, destination unreachable, length 112, unreachable address 2001:db8:0:85a3::ac1f:8009

我正在使用2.6.18-308.el5PAE内核,红帽企业Linux服务器版本5.1(Tikanga)。

1 个答案:

答案 0 :(得分:2)

这是正常行为。

由于在拥有正确的MAC地址来引导数据包之前无法发送IP流量,因此必须找到该MAC地址。在IPv4中,您会看到一个ARP数据包。 NDP(邻居发现协议)取代了IPv6中的ARP,这就是您看到NDP流量的原因。

这里真正的问题是无法访问目标主机。它可能已关闭,或路由器可能不知道如何到达它。您的路由器可能配置不正确,但这似乎不太可能。

尝试ping一个已启动的主机,您将看到NDP流量,然后是您的ICMP回应请求。