1. 前言
在实际防火墙中,可能存在着海量的安全策略,传统的逐个规则进行检查不再能满足防火墙在高性能方面的需求。因此,需要提出一种快速匹配算法来提升安全策略的匹配性能,这种快速匹配算法需要解决如下问题:
- 功能正确:功能与逐个规则匹配结果一致;
- 匹配高效:匹配性能不能随配置量增加而明显降低;
- 快速生效:配置变更后需要做到立刻生效;
- 增量构建:配置变更时不需要完全重新构建;
安全策略中的过滤条件大体可以分为IP地址类、服务端口类、对象类等,我们将分别进行探讨其加速机制,并尝试逐步完成加速代码的实现(CentOS C++)。理论上,同等功能的C代码实现能做到更优性能,但由于业余时间有限而采用C++实现也是一种无奈的妥协。受水平所限,文章观点未必为此问题之最优解,文章和代码也难免可能会存在错误或纰漏,还请不吝指出。本文先从对象加速机制入手。
2. 抛出问题
在讨论正题前,我们先假设防火墙上存在如下配置:
策略名称 | 优先级 | IP地址 | 端口 | 用户 | 动作 |
policy1 | 1 | 192.168.1.0/24 | 80 | user1 | permit |
policy2 | 2 | 192.168.1.0/24 | 80 | user2,user3 | deny |
policy3 | 3 | 192.168.1.0/24 | 443 | user2,user5 | permit |
... | ... | ... | ... | ... | ... |
policy49999 | 49999 | 192.168.1.0/24 | 23 | user1,user49999 | pass |
policy50000 | 50000 | 192.168.1.0/24 | 23 | any | deny |
我们设定每个用户都有唯一标识ID,关于流量如何识别用户身份不在本文的讨论范围。关于IP地址类、服务端口类快速匹配算法,以及多种匹配条件之间如何协作,我们会在后面的专题中逐一讨论。本文要解决的问题是:如何根据用户ID快速找到所有此能匹配此用户的安全策略。
针对上述配置我们需要解决如下问题:
输入用户ID | 输出此用户能匹配的规则列表 |
user1(ID) | policy1, policy49999, policy50000 |
user2(ID) | policy2, policy3, policy50000 |
user3(ID) | policy2, policy50000 |
... | ... |
user49999(ID) | policy49999, policy50000 |
user50000(ID) | policy50000 |
待续(2024/4/29)