如何在20亿个IP地址上实现IP过滤?

时间:2017-07-06 07:15:08

标签: node.js network-programming

我们有不同的项目,其中一个是white label DSP solution。 我们的客户要求启用IP过滤所有传入流量。 他们向我们提供了包含 20.5亿记录的地址列表,它应该可以实时运行。

这些地址可以压缩到600万个范围。我们只有 10毫秒来进行此检查。

此任务应使用 NodeJS

实施

您对如何完成此任务或哪种机制适合此任务有任何建议吗?

2 个答案:

答案 0 :(得分:0)

将已排序的IP加载到这种结构中必须很容易。只需向下走过数十亿即可填写:

{
    100: {
        150: {
            200: [250, 251],
            205: [250]
        }
    },
    105: {
        110: {
            115: [120]
        },
        115: {
            150: [200]
        }
    }
}

然后只检查必须过滤的IP的每个八位字节的密钥存在 JavaScript优化整数字典并对它们使用二进制搜索 我不知道NodeJS中是否有无符号字节,或者你需要几十GB的内存。

答案 1 :(得分:0)

目前尚不清楚“所有传入流量”是什么意思。如果你正在过滤IP数据包而你需要一个可扩展的解决方案,我强烈建议不要这样做。有一些SDN硬件可以用来做他们想做的事情,但我想这不属于项目的范围。

无论如何,我会尝试回答你的问题(至少部分)并给你一些一般的提示(不是node.js特定的)。首先,有一些事情应该澄清,其中包括:

  1. 我们只谈论IPv4吗?
  2. 列表是否动态(将是它们 添加/删除列表中的IP)
  3. 无论如何,您可以应用路由器在进行路由查找时所做的类似操作。您可以构建patricia trie(Radix tree)并在其中进行搜索(如果您认真对待,请查看this文章)。请记住,在路由世界中,10ms被认为是一生,因此即使是“慢速”CPU(1GHz以下)的基于软件的路由器也可能在10ms的时间范围内进行数百次IPv4查找。 hedgar2017为您提供了类似的示例,根据您拥有的资源量(以及流量),您可能不需要担心性能(如果您仅在建立用户会话时检查IP)。

    如果你也在做IPv6(并且你至少应该做好计划),那么这种方法是类似的。我唯一要提的是,即使IPv6有128位,ISP也会为每个用户分配一个/ 48(或最差情况/ 64)前缀。您可以将树构建到/ 48并获得更快的查找速度。