防火墙分四代,划分标准只有一个:记得住多少、看得到多深。 记得越多、看得越深,代价就是内存与延迟——没有免费的深度。
前面讲过「软件型」与「硬件型」,那是按实现分;这一节按技术分。 两套分法正交:软件型也可以做深度检测,硬件型也可以只做包过滤。
一、四代的划分标准
包过滤:只看五元组。什么都不记。 应用代理:把连接拆成两段,看完整内容。记两个连接。 状态检测:看五元组加状态。记一条会话。 深度检测:看载荷特征。记会话加重组缓冲。
代次 看什么 记什么
包过滤 五元组 什么都不记 应用代理 完整内容 两个完整连接 状态检测 五元组加状态 一条会话状态 深度检测 载荷特征 会话加重组缓冲
注意表格第三列:四代真正的分水岭是「记的东西越来越多」, 而「看的东西越来越多」是记多了之后才做得到的。 这也是为什么第四代必须建立在第三代的会话表之上。
二、每一条路的代价
按 1000 条并发连接,把四种技术各要多少内存摆出来: 包过滤 0 字节、状态检测 200 字节、应用代理 8 KB、深度检测 64 KB。
换算成倍数:代理是状态检测的四十倍,深度检测是它的三百多倍。
这个倍数解释了三个现象:
一、代理模式天生「撑不住」:同样内存,状态检测能撑 100 万会话,代理只能撑 2 万多。 二、深度检测一定慢:它要等整个流重组出来才能判,所以延迟不是「处理慢」,是「等齐慢」。 三、功能越多的设备标称越虚:规格书上的吞吐是裸转发,开了深度检测往往只剩零头。
三、今天的设备都是混合体
没有一台真实设备只属于某一代。 常见做法是「分层放」:
快路径(芯片):五元组与会话状态,负责绝大多数包。 慢路径(CPU):第一个包、需要深度判断的包、以及特征匹配。
这个结构叫「快慢分离」,它解决的是一个根本矛盾:绝大多数包是重复的、不需要深看的, 把它们的判断结果记住,就能让「深度」只付一次代价。
所以看规格书时,要比的不是「哪一代」,是三个数: 并发会话数、每秒新建数、以及「开启功能后的吞吐」。 前两个受内存限,第三个受架构限。
四、动手 Demo:四代技术,每连接要多少内存
这段按「1000 条并发连接」把四种技术的内存占用列出来,看它们彼此差多少倍,以及这个倍数意味着什么。
per = [
(u"包过滤", 0, u"无状态,零"),
(u"状态检测", 200, u"五元组+序号+时间戳"),
(u"应用代理", 8192, u"两个连接各 4 KB 缓冲"),
(u"深度检测", 65536, u"外加流重组窗口"),
]
for name, b, note in per:
P(u" %-8s 每条 %6d 字节 → 1000 条 %8s 字节(%s)"
% (name, b, format(b * 1000, u","), note))
实跑输出:
--------------------------------------------------------------------
四代技术,每连接要多少内存
--------------------------------------------------------------------
**防火墙的四代技术,本质差别是「记不记事、看到哪一层」。**
代次 看什么 记什么
------------------------------------------------
包过滤 五元组 什么都不记
应用代理 完整内容 两个完整连接
状态检测 五元组加状态 一条会话状态
深度检测 载荷特征 会话加重组缓冲
**按 1000 条并发连接,算它们各自要多少内存**:
包过滤 每条 0 字节 → 1000 条 0 字节(无状态,零)
状态检测 每条 200 字节 → 1000 条 200,000 字节(五元组+序号+时间戳)
应用代理 每条 8192 字节 → 1000 条 8,192,000 字节(两个连接各 4 KB 缓冲)
深度检测 每条 65536 字节 → 1000 条 65,536,000 字节(外加流重组窗口)
**代理模式是状态检测的 41 倍**,
**所以它天生就跑不快、撑不多**——**这是「看得越细,记得越多,撑得越少」的第一次出现。**
200 字节这个数是「裸字段加索引开销」的合理量级,不同设备差得很远,但数量级是一致的。 所以这几行要记的是「倍数关系」,不是精确数字。
代理模式那 41 倍不是缺点,是它的工作方式决定的: 它必须同时维持「客户端到防火墙」和「防火墙到服务器」两个连接,各有一份缓冲、各有一套序号。 这就是为什么「代理最安全,但最慢」——安全来自「它真的站在中间」。
深度检测那 64 KB 更要注意:它不是「每连接固定 64 KB」,是「重组窗口上限」, 实际按流量大小浮动。 所以一台标称支持 10 万会话的深度检测设备,在满负荷时可能连一半都撑不到。
30 秒实验
- 查一台设备的规格书,看它有没有写「开启 IPS 后的吞吐」。
- 算一下:如果每连接 64 KB,10 万会话要多少内存?
- 想一想:为什么代理模式对「长连接」特别不友好?
常见误区
- 以为四代是「替代关系」。今天的高速设备里四代功能同时存在。
- 以为深度检测只是「多查一点」。它要重组整个流,延迟是结构性的。
- 以为代理模式过时了。在需要严格隔离的场景里它仍然是首选。
自测三问(点开对答案)
1. 四代防火墙真正的分水岭是什么? —— 记的东西越来越多:不记 → 记两个连接 → 记一条会话 → 记会话加重组缓冲。 2. 为什么应用代理的内存占用是状态检测的几十倍? —— 因为它维持两个完整连接,各要一份缓冲与序号空间。 3. 「快慢分离」解决的是什么矛盾? —— 多数包重复且不需要深看,把结果记住就能让深度判断只付一次代价。下一节:设备插进网络时,接口到底有几种「身份」。
- ☐ (本节完,下一节 05.05 什么是防火墙的网络接口模式)