4

IPv6 のホワイトリスト / ブロックリストを作成する必要があります。

IPv6 でホストごとまたはネットワークごとに情報を維持するために、どのようなメモリ内オプションがありますか?

私は現在HashTable<UInt32>、IPv4 に を使用していますが、サブネット トラッキングや CIDR などを実際にマスターしたことはありません。

そうは言っても..そのようなブロックリスト/ホワイトリストを作成するための最も効率的な方法(検索速度、またはメモリ内のコンパクトさ)は何ですか?

TL;DR 質問

  • UInt128a が list/btree/hashtable にあるかどうかを調べるにはどうすればよいですか? これに適したデータ構造はどれですか?

  • 互いに「近い」IP を見つける方法を教えてください。これは通常 CIDR と呼ばれますが、BigInt の値比較として表現することもできます。

ちょうど私の頭に浮かんだ 1 つのアプローチは、暗号アキュムレータがどのように機能するかです。おそらく、アキュムレータの「メンバーシップ」機能を活用して、数値がセットのメンバーであるかどうかを判断する必要があるかもしれません

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 に答える