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)