如何正确发送路由器广告?

Yif*_*Sun 7 linux router drivers ipv6

我正在开发没有设备的IPv6 linux设备驱动程序.所以我现在试图用假的路由器广告消息欺骗内核.

unsigned char c[] = {0x33, 0x33, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 61, 0x86, 0xdd, //IPv6 type
            0x60, 0x00, 0x00, 0x00, //Version, ...
            0x00, 24, //payload length
            58,         //next header 
            255,        //hop limit 
            0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x3d, //source
            0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //destination
            134, //type
            0, //code,
            0x7a, 0x2c, //checksum
            255, //current hop limit
            0x80, //flag
            0xff, 0xff,
            0x00, 0x00, 0x00, 0x00, //reachable timer
            0x00, 0x00, 0x00, 0x00,
            0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 61, //source link-layer address   
            };
Run Code Online (Sandbox Code Playgroud)

我试图使用Tcpdump来抓取我发送给内核的这个数据包.我发现内核确实得到了这个数据包.

13:32:59.989851 00:00:00:00:00:3d (oui Ethernet) > 33:33:00:00:00:02 (oui Unknown), ethertype IPv6 (0x86dd), length 78: (hlim 255, next-header ICMPv6 (58) payload length: 24) fe80::200:ff:fe00:3d > ip6-allnodes: [icmp6 sum ok] ICMP6, router advertisement, length 24
    hop limit 255, Flags [managed], pref medium, router lifetime 65535s, reachable time 0s, retrans time 0s
      source link-address option (1), length 8 (1): 00:00:00:00:00:3d
        0x0000:  0000 0000 003d
Run Code Online (Sandbox Code Playgroud)

但之后我ip -6 neigh用来检查内核是否在邻居表中有假节点.我找不到它了.

我的问题是什么?任何的想法?

jfg*_*956 1

为什么要伪造路由器广告?

在你的情况下,我会做的是将第二个Linux放在同一个以太网链路上(在VMWare或任何其他虚拟环境中,如果你没有物理设置),在这第二个Linux上安装radvd,并让radvd在第二个Linux上发送路由器通告关联。