![Linux tun/tap 上的 IPv6:NDP 不起作用](https://linux22.com/image/732346/Linux%20tun%2Ftap%20%E4%B8%8A%E7%9A%84%20IPv6%EF%BC%9ANDP%20%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我正在研究一个旧代码,该代码用于通过不同类型的网络(电力线网络 PLC,与 802.15.4 非常相似)连接不同的 IPv6 设备。为此,它使用 C 代码在每个设备(实际上是 Tun,而不是 Tap)上创建了 Linux tun/tap 接口,它可以从 tun 接收出站数据包并将其传送到 PLC,在另一个方向上,它可以从 PLC 读取入站数据包并注入 tun 接口。
系统基本运行正常,但我发现 NDP 功能似乎无法正常工作。首先我注意到,对于两个这样的设备,我无法通过它们的 IPv6 链路本地地址 (fe80::.../10) 相互 ping 通。然后我使用 tcpdump 监控 tun 流量,发现根本没有邻居请求/广告消息。我发现的另一个奇怪的事情是,网络中的一台设备(主 PLC 设备,即所谓的协调器节点)发出了路由广告,但网络中的任何其他设备都没有发出路由广告。
我想了解根据 IPv6 NDP 我应该对这种网络期望什么正确的行为以及如何实现它。
如果有人能给我一些想法我将不胜感激。
-木质
答案1
预期行为是 NDP 在 TAP 接口上使用,但不在 TUN 接口上使用。
TAP 模拟以太网,因此内核会将以太网帧传送到您的代码并期望从您的代码中接收以太网帧。因此,它必须首先执行 NDP 才能知道要将哪个目标 MAC 地址用于它交给您的代码的 IP 数据包。
另一方面,TUN 不使用以太网层来处理 IP。您的代码将接收没有附加报头的 IP 数据包,并且它将期望从您的代码接收 IP 数据包。可以选择将其配置为在 IP 数据包前面有一个小报头,以区分 IPv4 和 IPv6 数据包,但是您也可以使用 IP 版本字段来区分(除非您使用的是非常过时的内核版本)。
我希望链路本地地址可以在两种接口上使用。与其他地址一样,NDP 将在 TAP 上使用,但不会在 TUN 接口上使用。