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

我们有不同的项目,其中之一就是白标签DSP解决scheme 。 我们的客户端请求启用IP过滤所有传入stream量。 他们给了我们地址列表,其中包含20.5亿条logging,它应该实时工作。

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

这个任务应该使用NodeJS来实现。

你有什么build议如何完成这个任务,或者哪个机制适合这个任务?

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

无论如何,我会尝试回答你的问题(至less部分),并给你一些一般的技巧(不是node.js特定的)。 首先,有几点需要澄清,那就是:

  1. 我们只谈论IPv4吗?
  2. 列表是否是dynamic的(他们是否会从列表中添加/删除IP)

无论如何,您可以应用路由器在进行路由查找时所做的类似工作。 你可以build立帕特里夏树 ( 基数树 ),并在其中进行search(如果你认真对待,也可以看看这篇文章)。 请记住,在路由世界中,10ms被认为是终生的,所以即使是“慢速”CPU(低于1GHz)的基于软件的路由器,也可能在10ms的时间范围内进行数百个IPv4查找。 hedgar2017给了你类似的例子,取决于你有多less资源(和多lessstream量),你可能不需要担心性能(如果你只在build立用户会话时检查IP)。

如果你也在做IPv6(你至less应该计划),这种方法是相似的。 唯一我要提到的是,即使IPv6有128位,ISP正在为每个用户分配一个/ 48(或在最坏的情况下/ 64)前缀。 你可以build立你的树高达/ 48,并得到更快的查找。

将已分类的IP加载到这种结构中一定很容易。 只要走过你的数十亿,填写:

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

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