第三章 包过滤防火墙原理:静态包过滤的工作机制

包过滤防火墙,说白了就是网络世界的门卫。它站在网络的入口,检查每一个进出的数据包。符合规则的放行,不符合的拦下。就这么简单。

我刚开始接触防火墙时,总觉得这东西很神秘。后来拆开一看,核心就是一张规则表——ACL(访问控制列表)。你给它什么规则,它就怎么干活。没有花哨的算法,没有复杂的计算,就是一条一条地比对。

静态包过滤的工作机制

静态包过滤,也叫无状态包过滤。它只看数据包本身,不关心这个包属于哪个连接。每次来一个包,它就独立判断一次。

判断的依据是什么?五个关键字段:

  • 源IP地址——包从哪里来
  • 目的IP地址——包要去哪里
  • 源端口号——发送方的端口
  • 目的端口号——接收方的端口
  • 协议类型——TCP、UDP还是ICMP

我记得有一次帮客户排查问题,他们觉得防火墙坏了,因为某些应用能通,某些不能。我一看规则,发现只配了TCP的规则,UDP的流量全被默认拒绝了。嗯,这就是典型的静态包过滤问题——它不会帮你自动处理协议间的关联。

核心要点:静态包过滤工作在OSI模型的网络层和传输层。它不解析应用层数据,也不维护连接状态。每个包都是独立的个体。

ACL(访问控制列表)基础

ACL就是防火墙的规则集。每条规则告诉防火墙:什么样的包该放行,什么样的包该拒绝。

一条典型的ACL规则长这样:

access-list 100 permit tcp 192.168.1.0 0.0.0.255 any eq 80
access-list 100 deny ip any any

这条规则的意思是:允许来自192.168.1.0/24网段的流量,访问任意主机的80端口(HTTP)。其他所有流量全部拒绝。

你可能会问:为什么要有两条规则?因为ACL的默认行为是拒绝所有。如果你只写允许规则,没写拒绝规则,那匹配不到的流量怎么办?

答案是:隐含拒绝。每条ACL的最后都有一条看不见的规则——deny any any。这是防火墙的自我保护机制。

ACL规则类型 作用 示例
标准ACL 只检查源IP地址 access-list 1 permit 192.168.1.0 0.0.0.255
扩展ACL 检查源/目的IP、端口、协议 access-list 100 permit tcp any any eq 443
命名ACL 用名字代替数字,更易读 ip access-list extended WEB-INBOUND

我的习惯:写ACL时,我永远把最具体的规则放在前面,最宽泛的规则放在后面。为什么?因为ACL是顺序匹配的,一旦匹配就停止检查。把精确规则放前面,能减少不必要的比对。

规则匹配顺序与隐含拒绝

ACL的匹配顺序,是很多新手栽跟头的地方。我见过太多案例,规则写了一大堆,结果流量全被拒绝了。原因就是顺序搞错了。

规则匹配遵循三个原则:

  1. 顺序匹配——从上到下,逐条检查
  2. 首次匹配——匹配到第一条规则就执行,不再继续
  3. 隐含拒绝——所有规则都不匹配时,默认拒绝

举个例子,你写了这么两条规则:

access-list 100 deny tcp any any eq 22
access-list 100 permit tcp 10.0.0.0 0.255.255.255 any eq 22

你本意是只允许10.0.0.0/8网段访问SSH,其他都拒绝。但顺序写反了——先拒绝了所有SSH流量,后面的允许规则永远没机会执行。结果就是所有人都连不上SSH。

我曾经在一个金融客户那里遇到类似问题。他们想开放某个端口给合作伙伴,结果把拒绝规则写在了允许规则前面。排查了整整一个下午,最后发现就是顺序问题。从那以后,我每次写ACL都会先画个流程图。

避坑指南:我曾经见过有人把ACL规则写了100多条,最后一条是permit ip any any。你想想看,前面99条规则的意义在哪里?隐含拒绝才是防火墙的底线,不要轻易用permit any any去覆盖它。

包过滤的决策流程

为了让你更直观地理解,我画了一张流程图。它展示了防火墙收到一个数据包后,是如何一步步做出决策的。

静态包过滤决策流程图 静态包过滤决策流程 收到数据包 提取五元组信息 匹配第一条ACL规则 是否匹配? (permit/deny) 是 执行规则动作 (放行/拒绝) 否 取下一条ACL规则 还有规则吗? 是 循环匹配 否 隐含拒绝 (deny any any) 说明:所有规则都不匹配时,防火墙执行隐含拒绝,丢弃数据包

这张图把整个流程串起来了。你注意看那个循环——防火墙会一条一条地比对规则,直到找到匹配项。如果所有规则都不匹配,就执行隐含拒绝。

我刚开始学的时候,总觉得隐含拒绝是个很冷酷的机制。后来做安全审计才发现,正是这个机制保护了无数网络。如果没有隐含拒绝,漏配一条规则就可能让攻击者长驱直入。

实战建议:写ACL时,先把要拒绝的流量写清楚,再把要允许的流量写清楚。最后留一条deny any any作为兜底。不要偷懒写permit any any,那是给自己挖坑。

静态包过滤的优缺点

任何技术都有两面性。静态包过滤也不例外。

优点 缺点
处理速度快,延迟低 无法检测应用层攻击
对硬件要求低,成本可控 不支持动态端口协议(如FTP)
配置简单,容易上手 容易被IP欺骗绕过
透明性好,不影响应用 规则数量多时管理困难

我记得有一次,客户用静态包过滤保护内网。一切正常,直到他们部署了一个FTP服务器。FTP的数据连接使用动态端口,静态包过滤根本不知道要开放哪些端口。折腾了两天,最后换成了状态检测防火墙才解决。

我的建议:静态包过滤适合边界清晰、流量简单的场景。比如公司出口只开放80和443端口。如果业务复杂,涉及动态端口或多协议交互,还是上状态检测防火墙更靠谱。

好了,这一章的内容就到这里。静态包过滤虽然基础,但它是理解所有防火墙技术的起点。你把这些搞明白了,后面学状态检测、应用层过滤都会轻松很多。