4

我需要为 IPv6 创建白名单/阻止名单。

在 IPv6 中,有哪些内存选项可用于在每个主机或每个网络的基础上维护信息?

我目前HashTable<UInt32>为 IPv4 使用 a,但从未真正掌握子网跟踪、CIDR 等。IPv6 有许多不同的方式来表示 IP 范围,这使我将 IP 组合在一起并解释它们的工作变得复杂。

话虽如此..拥有这样一个阻止列表/白名单的最有效方式(搜索速度或内存紧凑性)是什么?

TL;DR 问题

  • 如何查找 aUInt128是否在列表/btree/哈希表中?哪种数据结构适合这个?

  • 如何找到彼此“接近”的 IP。这通常称为 CIDR,但我们也可以将其表示为 BigInt 的值比较。

我刚刚想到的一种方法是加密累加器的工作原理。也许有一种方法可以利用累加器的“成员资格”能力来确定一个数字是否是集合的成员

4

1 回答 1

2

我将 IPv6 地址存储在std::pair<in6_addr, uint8_t>. 那是网络和 CIDR 位的一对。

在检查白名单时,我只需迭代关联的网络,并进行 CIDR 匹配:

bool cidr6_match(const in6_addr &address, const in6_addr &network, uint8_t bits) {
#ifdef LINUX
  const uint32_t *a = address.s6_addr32;
  const uint32_t *n = network.s6_addr32;
#else
  const uint32_t *a = address.__u6_addr.__u6_addr32;
  const uint32_t *n = network.__u6_addr.__u6_addr32;
#endif
  int bits_whole, bits_incomplete;
  bits_whole = bits >> 5;         // number of whole u32
  bits_incomplete = bits & 0x1F;  // number of bits in incomplete u32
  if (bits_whole) {
    if (memcmp(a, n, bits_whole << 2)) {
      return false;
    }
  }
  if (bits_incomplete) {
    uint32_t mask = htonl((0xFFFFFFFFu) << (32 - bits_incomplete));
    if ((a[bits_whole] ^ n[bits_whole]) & mask) {
      return false;
    }
  }
  return true;
}

改编自 xfrm 的addr_match

更多关于与 CIDR 匹配的信息:IP cidr 匹配功能

我很高兴听到其他人可以提出更多奇特的数据类型。对于我自己的用例,我有一堆左右的 IP 可以针对每个帐户进行验证,所以一个简单的列表对我来说就足够了。

于 2014-08-14T11:25:51.760 回答