7

我想检测一个地址是否是临时 ipv6 地址,我使用 getifaddrs 来获取地址列表,但不知道如何从那里获取该信息。如果可能的话,我希望它适用于 linux、osx、solaris 和 windows。

我似乎在 Linux IFA_F_TEMPORARY 中设置了 inet6_ifaddr->ifa_flags,但不确定如何从 getifaddrs 返回的 ifaddrs 中获取它。

似乎在 OSX 上我需要带有 SIOCSIFINFO_FLAGS 的 octl,而且我不知道 Solaris 或 Windows。

有任何正文可以做到这一点的示例代码。

4

1 回答 1

5

更新(2016 年 8 月 3 日):在过去几个月里断断续续地搜索这个问题之后(因为我自己实际上需要这个答案)。我相信我已经找到了以 Windows 为中心的答案。我只在 Windows 10 上测试过,所以我不知道旧版本。但是如果有人想为我验证它,这个 API 不应该改变 :-)

所有_IP_ADAPTER_UNICAST_ADDRESS结构都有地址前缀和后缀的枚举。我现在已经费心去看它们了,它们是解决这个问题的全部关键!

什么是临时 IPv6 地址……它是一个带有随机后缀的地址!因此,对于 IP_ADAPTER_UNICAST_ADDRESS 中的所有 IPv6 地址,请查看IP_SUFFIX_ORIGIN是否为IpSuffixOriginRandom。而已。

我仍然对网上关于这个主题的内容如此之少感到震惊,如果没有人知道如何为服务器端应用程序(即使是在消费类 PC 上运行的应用程序)解决这个问题,这对于网络应用程序开发人员来说将是几年后的一个大问题)

你先在这里听到了答案!!!


(原始答案):我也一直在研究跨平台应用程序的确切主题。我想我找到了在 Windows 中过滤 IPv6 临时地址的“一种”方法。基本上 RFC 4941 要求临时地址必须:

  1. 有效生命周期小于“公共”地址
  2. 有一个小于“公共”地址的首选生命周期

因此对于 C++,当使用 GetAdaptersAddresses 之类的函数时,您可以在 PIP_ADAPTER_ADDRESSES 结构中查找 _IP_ADAPTER_UNICAST_ADDRESS 结构并评估 ValidLifetime 和 PreferredLifetime 成员。过滤地址类型后(如果您需要了解本地链接与公共),您可以保持最长生命周期的运行记录。最长的生命周期(每个适配器)应该是公共地址!

要快速查看地址生存期信息,请运行 Windows 终端命令:netsh interface ipv6 show address

您可以看到所有临时地址都远小于默认的 SLAAC 生命周期。

我现在正在处理这个假设,直到测试证明不是这样。所有临时地址都是基于公众的,因此无法生存。

希望这可以帮助

于 2015-10-14T05:22:41.940 回答