问题标签 [icmpv6]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
448 浏览

networking - 如何实现本地ICMPv6邻居发现?

我正在实现自己的 IPv6 网络堆栈,但在让 ICMPv6 邻居发现工作时遇到问题。堆栈的工作原理是捕获现有接口的数据包,挑选寻址到它的数据包并从堆栈的“虚拟”地址发送新数据包。

为了测试这一点,我有一台 Ubuntu 机器,它使用一个 LXC 容器作为测试客户端来发送流量。Ubuntu 主机具有以下用于 LXC 容器的桥接接口:

该容器具有以下网络接口:

如果我从 LXC 容器 ping Ubuntu 主机,它当然可以工作:

我自己的堆栈配置了 mac 地址0c:22:38:4e:9a:bc和 IPv6 地址fe80::216:3eff:fe00:1234

使用 Erlang 实现,处理邻居请求包的代码如下:

Packet是传入的邻居请求请求,{IP6, Mac}是堆栈已配置的 IPv6 地址和 MAC 地址。

ping 它时,数据包到达主机上的接口并被 libpcap 拾取。我生成了对地址解析的响应,但 ping 从未成功:

跟踪显示邻居广告数据包到达容器:

除了地址本身之外,它们看起来与发送到真实界面和从真实界面发送的那些相同。

检查路由表显示虚拟地址的地址解析由于某种原因不起作用:

这里邻居发现失败的原因是什么?我在实现 ICMPv6 协议以使容器接受虚拟地址作为有效路由时缺少什么?

0 投票
2 回答
528 浏览

python-3.x - 如何从套接字(AF_INET6、SOCK_RAW、IPPROTO_ICMPv6)的原始字节串创建 ICMPv6 scapy 对象?

我想使用 Python 在 Python 程序中检查/分析 ICMPv6 路由器广告(RA),我在其中获得(不是这样)原始数据包数据,如下所示:

当收到 ICMPv6 数据包时,数据包 p 将仅包含(!)ICMPv6 部分本身,但不包含任何其他外部元素,因此没有 IPv6 标头,没有以太网标头,...

如何从我的(不是这样的)原始数据包数据中创建正确的 Scapy ICMPv6 派生数据包类?_ICMPv6似乎只是一个后备类。是否有某种工厂可以从中获取正确的子类(例如ICMPv6ND_RA)?

0 投票
0 回答
82 浏览

java - 如何在 JAVA 中监听 ICMPv6 数据包?

具体来说,我正在尝试使用 Java 编写一个应用程序,以用作 IPv6 中的路由器和 DHCPv6 服务器。

应用程序定期发送路由器通告 (RA) 并响应来自客户端的路由器请求数据包。然后它可以依次响应 DHCP 请求信息。

我知道在 DHCPv4 中,DHCP 发现、请求...数据包都在 UDP 上并具有特定的端口,这样我就可以打开一个 UDP 套接字来监听这些数据包。但是 UDP 套接字无法捕获路由器和主机之间通信使用的 ICMPv6 数据包。

因此,我想知道如何在 JAVA 上收听 ICMPv6 数据包或 IPv6 多播(因为目标数据包的目标地址为:FF01:0:0:0:0:0:0:2)

注:搜索了一会,发现纯JAVA只支持网络接口下到传输层(TCP、UDP)。我现在想知道有没有办法解决这个问题?

0 投票
2 回答
2919 浏览

implementation - 为什么在 UDP 上运行时,traceroute 在最后一跳期望“Destination Unreachable”而不是“Echo Reply”?

摘自 Wikipedia page 的traceroute实现部分:

. . . 直到到达目的地,如果正在使用 UDP 数据包,则返回 ICMP Destination Unreachable 消息;如果正在使用 ICMP Echo 消息,则返回 ICMP Echo Reply 消息。

它说,当我期望它使用 ICMP“Echo 回复”时,在最后一跳 traceroute 期望 ICMP“Destination Unreachable”。

我看到了页面的历史,它被一个名叫“盖伊哈里斯”的人改变了。他说:

. . . 如果您使用 UDP 数据包,就像 traceroute 默认情况下所做的那样,最后一跳将返回 ICMP Destination Unreachable(除非您不幸将 UDP 数据包发送到带有侦听器的端口),而不是 ICMP Echo Reply。

有人可以对此有所了解吗?

0 投票
0 回答
67 浏览

c++ - 为什么在等待 ICMPv6 ping 回复时调用 recv 超时?

我正在尝试以编程方式从 Windows 7 机器发送和接收 ICMPv6 ping 数据包。我使用的代码改编自成功用于发送/接收 IPv4 ping 数据包的现有代码。我能看到的唯一区别是我使用的是 IPv6 而不是 IPv4,并且我对源地址和目标地址都使用链接本地地址。

我正在 ping 的目标地址是 fe80::b617:80ff:fe40:fe21%12,其中 %12 选择了适当的接口。运行 ipconfig 会在我的机器上显示几个网络适配器:

我正在使用 %12 范围 ID 来选择 ARM-dev-board-10.xxx 适配器上的 fe80::e540:1d52:7bf7:3e4%12 链接本地地址。

我使用wireshark监控网络数据包,我可以看到我的代码正确发送了ping请求,并且目标发送了ping回复。问题是我的代码从未收到回复数据包。对 recv() 的调用超时(返回 SOCKET_ERROR 并且 WSAGetLastError 返回 10600)。

我需要设置一些魔术套接字选项来让 Windows 将回复数据包传递给我吗?

我尝试在 sendto() 之前添加对 bind() 的调用,但这没有任何区别(我认为我不需要调用 bind(),因为我认为 sendto() 应该为我隐式绑定接口) .

我用address = "fe80::b617:80ff:fe40:fe21%12"and调用下面的代码timeoutInMs = 1000

于 2019 年 4 月 10 日编辑添加:

在 Windows 事件查看器中查看安全部分中 ID 为 5152 的事件,我可以看到:

看起来 Windows 防火墙阻止了 ping 回复。关闭防火墙(并暂时禁用 Sophos Endpoint)后,我不再看到 ID 5152 事件显示数据包已被过滤。但是我的程序仍然没有收到 ping 回复数据包:-(

0 投票
1 回答
69 浏览

c - 如何使用 ICMPv6 套接字接收 vlan 标头/l2 标头

在我的 ND 守护程序中,我使用rbos_socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);接收 ICMPv6 标头来接收 NS 和其他 ND 消息(l3消息)。使用此选项,内核将剥离l2标头(带有 VLAN 信息)。我应该使用哪个选项来避免这种剥离?

我的意图是接收带有 VLAN 信息的 ICMPv6 消息。

已经尝试使用以下内容:1)rbos_socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6); 2)rbos_socket(AF_INET6, SOCK_RAW, PROTO_ND)

我的期望是接收带有l2信息(特别是 VLAN 标头)的 ICMPv6 消息。

0 投票
0 回答
357 浏览

ip - 数据包太大 ICMPv6 消息中有效负载的目的是什么

我已经阅读了 RFC 44438201,也许我不明白,因为我对这些 RFC 中描述的一些术语不熟悉,但我想了解在 ICMP 数据包中使用有效负载对大消息的含义?

根据 RFC 4443 Linkt 到 4443 RFC

有效负载将包含尽可能多的调用数据包,不超过数据包到大消息的最小路径 MTU。

我不了解此类有效负载的用例,即使在 RFC 8201 中也没有提及有效负载的用法。只有一条评论是

在第 4 节“协议要求”中添加了说明,即节点应根据 RFC 4443 验证 ICMP PTB 消息的有效负载,并且节点应尽快检测到 PMTU 的降低。

在 PTB 消息中验证有效负载可能意味着什么?我们应该如何验证有效负载以及基于什么条件?

根据 RFC 4443 的数据包太大消息。

0 投票
0 回答
157 浏览

ip - IPv6 Logo 认证测试用例 v6LC.4.1.12: Validate Packet Too Big

我已经问过一个问题,该问题与 Packet Too Big ICMPv6 消息中有效负载的用途是什么有关。为什么_PTB_payload

根据最新的 IPv6 徽标认证,我遇到了这个测试案例,其中发送方将 ICMPV6 回显请求消息发送到中间有一些路由器的目的地,而接收方(目的地)收到回显请求。然后,

  1. 接收方发送 ICMPv6 回显应答,但从路由器之间收到 ICMPV6 数据包太大消息,错误/伪造的回显应答标头附加到(PTB)数据包太大消息作为有效负载。(故意发送错误的有效载荷)。

  2. 再次是发送方发送的 ICMPv6 回显请求,现在接收方由于上述步骤 1 开始对回显回复进行分段(即,在没有验证 PTB 有效负载的情况下,接收方更改了它的 MTU 值)。

根据测试用例,我们不应该在 PTB 消息上接收到错误或伪造的有效载荷时更改 MTU(有效载荷将是由于路径 MTU 较少而无法转发的原始数据包)

但这看起来是不必要的工作来验证 PTB 的回声回复,而且似乎没有合适的用例,这个测试用例对我来说看起来无效,因为我们从不存储内核发送的回声回复状态以验证 PTB,以防 PTB 携带错误其有效负载上的 ICMPv6 回复标头。

如果这是有效案例,那么我想知道我们如何实现这一点的逻辑,或者如果不是,那么为什么这个测试用例甚至在 IPV6 徽标认证中存在。

链接到包含测试用例IPv6LogoCertificationTestCases的文档(测试用例编号 v6LC.4.1.12)

0 投票
1 回答
78 浏览

c++ - 套接字 - sendto() 截断 ICMPv6 选项

出于好奇,我试图为CVE-2020-16898编写一个简单的概念验证漏洞利用。我使用了 RFC(RFC 4861 和 RFC 6106)来获得正确的格式,并且我已经成功地使用下面的代码发送了一个精心设计的 ICMPv6 路由器广告数据包。但是,在 Wireshark 中查看数据包发现实际发送的数据包中缺少数据包选项 25(有效负载)。

我怀疑它与数据包长度有关 - 我尝试将其转换为 Big Endian(同时使用 htons() 并手动插入十六进制数字),但在这些情况下,sendto() 失败并显示“消息太长”错误。有效负载应为 56 字节长,应远低于限制。

我在下面包括我的代码。我会很感激任何帮助。

0 投票
1 回答
108 浏览

ip - Contiki os如何将IP地址映射到MAC地址

Contiki os 如何将 IP 地址映射到 MAC 地址,它存储在哪里?

我知道 ICMPv6 和 RPL 的基础知识,但是一旦网络建成,当发送 IPv6 数据包时,如何知道下一跳的 MAC 地址?我假设不是每次都发送邻居请求消息。此外,在 Cooja 上,我看到的唯一 ICMPv6 消息是 RPL 消息。

我试图通过 grep、谷歌搜索和在文档中找到答案,但我找不到。