1988 年的 Morris 蠕虫让整个互联网停了两天,人们第一次意识到「连在网上」本身就是风险。 防火墙的发展史就是一部「记性越来越好」的历史。
上一节讲它做什么,这一节讲它怎么变成现在这个样子。 注意这条主线:无状态 → 有状态 → 看内容。每一步都是「多记一点东西」。
一、从「互信」到「设岗」
早期的互联网是「互信网络」:连上去的都是大学与研究机构,默认彼此可信, 路由器的职责只有「把包送到」。
1988 年 11 月,Morris 蠕虫在几小时内感染了约六千台主机,占到当时联网主机的十分之一。 它靠的是三个当时的常见配置问题:弱口令、信任关系配置过宽、以及一个可以被利用的程序缺陷。
这件事之后,工程界得出了两个结论: 一是「网络边界需要一个统一的检查点」,二是「检查点必须能拒绝,不能只是记录」。 这就是防火墙的起点。
二、第一代:包过滤
第一代的做法非常直接:在路由器的转发路径上加一张表,按五元组决定放行还是丢弃。 因为不需要改网络结构,它传播得极快。
但它有两个绕不过去的缺陷:
一、它不记事。 出去的连接和回来的连接在它眼里是两个毫无关系的包, 所以「允许返回流量」只能靠「放行所有高位端口」。
二、它只看包头。 载荷里的东西一概不知,所以「允许 80 端口」就等于「允许 80 端口上的一切」。
第一条缺陷的代价可以算:放行 1024 以上端口,等于打开了 64512 个端口,占全部端口的 98.4%。
三、第二代:记住会话
1990 年代中期,状态检测出现了。 它的做法是:第一个包来时建一条「会话」,记住五元组与序号,后续的包只要属于这条会话就直接放行。
这一改,规则数直接减半(不用再写反向规则),但真正的变化不在数量,在粒度: 「允许返回」从「端口级」收到了「会话级」。
而它带来一个新问题:会话表要占内存,而且必须老化。 这就把「安全」和「资源」绑在了一起——从这一代开始,防火墙的规格书里出现了「并发会话数」这个指标。
再往后是「看内容」的一代:把载荷重组出来,按特征匹配。 代价是内存(要缓冲)与延迟(要等齐),这也解释了为什么深度检测设备总是最贵、最慢的那一档。
四、动手 Demo:没有状态表的时候,返回流量怎么放
这段算第一代防火墙「放行高位端口」到底打开了多少端口,再对比无状态与有状态两种写法各要多少条规则。
P(u" 大于 1023 的:%d 个,占 %.1f%%。"
% (65535 - 1023, (65535 - 1023) * 100.0 / 65535))
for n in (10, 50, 200):
T([u"%d 个" % n, u"%d 条(双向)" % (n * 2), u"%d 条(单向)" % n], [0, 0, 0])
实跑输出:
--------------------------------------------------------------------
没有状态表的时候,返回流量怎么放
--------------------------------------------------------------------
**第一代防火墙只会看单个包,不记前因后果。**
**于是「出去容易、回来难」——返回流量没法判断。**
**当年最省事的做法是放行「所有大于 1023 的高位端口」。**
端口总数:65535 个。
大于 1023 的:64512 个,占 98.4%。
**等于把 98.4% 的端口全打开了**,**安全上基本等于没有防火墙。**
**有状态之后,规则只写一个方向**:
服务数 无状态规则 有状态规则
------------------------------------------------
10 个 20 条(双向) 10 条(单向)
50 个 100 条(双向) 50 条(单向)
200 个 400 条(双向) 200 条(单向)
**规则减半只是表面,真正的差别是「允许返回」变成了「允许这条会话的返回」**——
**粒度从端口级收到会话级。**
98.4% 这个数字要记住:它说明「没有状态表的防火墙」在原理上就只能是漏的, 不是配置没写好,是那一代技术做不到。
规则数减半只是表面。 真正的差别是「允许这条会话的返回」与「允许所有高位端口的进入」——前者是精确的,后者是敞开的。
这也解释了为什么「状态检测」会成为分水岭:它第一次让防火墙「记得住上下文」, 而后面所有的功能(NAT、VPN、DoS 防御)都建立在这张会话表上。
30 秒实验
- 查一下你手上设备的并发会话数指标,和它的内存大小对一下。
- 想一想:如果没有会话表,NAT 还能不能做?
- 对比一下「丢弃」与「拒绝」在排障时的差别。
常见误区
- 以为第一代防火墙「配置没写好」。它根本不知道返回流量和出去的关系。
- 以为状态检测只是「少写几条规则」。它改变的是判断的粒度。
- 以为防火墙越新越好。老设备在纯转发场景下反而更快。
自测三问(点开对答案)
1. 第一代包过滤防火墙的两个根本缺陷是什么? —— 不记事(分不清返回流量)与只看包头(管不了载荷)。 2. 状态检测带来的最大变化是什么? —— 把「允许返回」的粒度从端口级收到会话级,规则数减半且更精确。 3. Morris 蠕虫给工程界留下了哪两个结论? —— 网络边界需要统一检查点,且检查点必须能拒绝而不是只记录。下一节:先看「软件型」——跑在通用操作系统上的防火墙。
- ☐ (本节完,下一节 05.03.01 软件型防火墙)