🛡️ 第二章 针对网络的攻击
📄 一句话概括

防火墙的全部智慧,其实压缩成两句话:默认拒绝,逐条放行;以及规则是从上往下逐条比对的,命中了就停——顺序就是策略。

📝 本节和前面几节的关系

上一节(应当在哪里防御)讲了"防御的位置该摆在哪里"。这一节落到边界这个位置上的第一个具体手段——防火墙与数据包过滤。

它同时是第一章两条原则的落地:默认关闭(权限只交给合适的人)和最小权限。在防火墙上,"默认关闭"就是那条兜底的拒绝规则;"最小权限"就是把源地址也写细。

一、数据包过滤在做什么

把它想成门口的登记簿检查。每个要进出的数据包都带着一张"信封",上面写着:

包过滤就是只看信封,不看信。它按规则表逐条比对,命中哪条就按哪条办,然后不再往下看。

这个"只看信封"的特点决定了它的两个面:

二、三种形态:包过滤、状态检测、应用识别

按"能看多深"排三代:

形态 看什么 例子 局限
包过滤 只看单个信封(地址、端口、协议) 只允许 443 进来 不知道这个连接是新开的还是回应的
状态检测 看会话(这个包属于已建立的连接吗) 只放行"内部先发起、外部回应"的包 看不了内容,管不了伪装成正常端口的攻击
应用识别(下一代防火墙) 看是什么应用,不管它用哪个端口 不管它套哪个端口,都能认出这是哪个应用 复杂度高、成本高;加密流量难办

"状态检测"这一代的价值值得单独说。 光包过滤是有漏洞的:你允许 443 进来(为了对外提供服务),但攻击者也可以借这个口子发起连接。状态检测加了一条判断——"这是回应,还是新的主动连接?" 只放行回应,把"外面主动连进来"这条路堵上。

而"应用识别"这一代的出发点是:攻击者早就不老实待在规定端口上了(把不合法的东西伪装成正常的网页流量)。所以不看端口,直接看应用。

三、规则表怎么读

规则表是有序的,从上往下、命中即停。这带来两条纪律:

  1. 最后一条必须是"默认拒绝"。 前面所有规则都没命中时,兜底的那条决定一切。如果兜底是"允许",那前面写得再细也没意义。
  2. 宽规则不能放在细规则前面。 否则细规则永远轮不到执行,成了摆设——这是配置里最常见的错误,而且不报错。

配套的两条"最小权限"要求:

四、动手 Demo:一张规则表,八个测试包

rules = [
    (1, "允许", "tcp", "任意", "任意", "443", "对外提供 HTTPS"),
    (2, "允许", "tcp", "内网段", "任意", "80", "内网出网浏览"),
    (3, "允许", "tcp", "任意", "数据库", "3306", "▲ 源写成【任意】,等于全球都能连"),
    (4, "拒绝", "ip", "任意", "任意", "任意", "默认拒绝(兜底)"),
]
packets = [
    ("外部用户", "官网服务器", 443),
    ("办公机", "外部网站", 80),
    ("外部任意主机", "数据库", 3306),
    ("外部主机", "内网机器", 3389),
    ("外部主机", "内网机器", 445),
    ("办公机", "外部主机", 22),
    ("外部主机", "内网机器", 8080),
    ("内网机器", "内网机器", 445),
]

实跑输出:

  规则表(自上而下逐条比对,命中即停)
  序号    动作      协议      源           目的          端口      说明
  ------------------------------------------------------------------------------------------------
  1       允许        tcp       任意            任意            443       对外提供 HTTPS
  2       允许        tcp       内网段           任意            80        内网出网浏览
  3       允许        tcp       任意            数据库           3306      ▲ 源写成【任意】,等于全球都能连
  4       拒绝        ip        任意            任意            任意        默认拒绝(兜底)

  逐包判定
  源                     目的                    端口      结果
  ----------------------------------------------------------------------
  外部用户                  官网服务器                 443     允许(规则 1)
  办公机                   外部网站                  80      允许(规则 2)
  外部任意主机                数据库                   3306    允许(规则 3)
  外部主机                  内网机器                  3389    拒绝(规则 4 兜底)
  外部主机                  内网机器                  445     拒绝(规则 4 兜底)
  办公机                   外部主机                  22      拒绝(规则 4 兜底)
  外部主机                  内网机器                  8080    拒绝(规则 4 兜底)
  内网机器                  内网机器                  445     拒绝(规则 4 兜底)

  八个包里放行 3 个、拒绝 5 个。

  ① 规则 3 是这张表里的真问题:源地址写【任意】,
     等于把数据库端口开放给全世界。
     应改成只允许内网段访问该数据库。
     教科书里叫【最小权限】,在防火墙上的体现就是【源也要写死】。
  ② 规则 4 那条兜底才是这张表的价值所在。
     把它换成【允许任意】,同样八个包会全部被放行、
     一个都拒不了——安全等级完全不是一回事。
  ③ 规则自上而下命中即停,所以顺序就是策略:
     把宽规则放前面,后面的细规则永远轮不到执行,成了摆设。
  ④ 包过滤只看信封(地址、端口、协议);
     要看会话要看会话状态,要看应用要看下一代防火墙——
     但因为现在九成以上流量是加密的,一层层往上看会越来越难。

读这个输出:注意"被拒绝的那五个"里有一行很特别——内网机器访问内网机器 445 端口也被拒了。这条规则看起来"管得太宽",实际上很有价值:它顺手挡住了内网横向传播的一个主要通道(文件共享端口正是勒索软件在内网扩散最常用的路径)。这说明一条好规则常常同时挡住好几类攻击。

五、防火墙挡不住什么

这一点比"能挡什么"更重要,因为它决定了后面的章节为什么存在:

  1. 挡不住"合法的东西干坏事"——用一个偷来的有效账号登录,防火墙看到的是正常连接。
  2. 挡不住"从里面发起的攻击"——边界设备看的是内外之间,内部机器互相攻击它看不见(这就接到 2-13 分段和 2-11 的检测)。
  3. 挡不住加密流量里的内容——因为看不到内容,伪装成正常应用的攻击很难分辨。
  4. 挡不住"被人主动连出去"——出口方向的默认行为通常是放行,这正好是 2-8 讲的出口防御问题。
  5. 规则配错时,它什么都不挡——而且不报错。

所以防火墙的定位应该是:一道必要的、但远远不够的防线。

六、⚠️ 2026 现状

30 秒实验

如果你家里用的是普通路由器,做一次"默认动作检查":

  1. 登录路由器后台(一般是 192.168.1.1),找"端口转发""虚拟服务器""端口映射"这类菜单。
  2. 看有没有你设不出来的映射(尤其是往内网的 3389 远程桌面、445 文件共享、22 远程登录、3306 数据库这些端口)。
  3. 如果有,删掉。 这就是最小权限原则在家里那一层的落地——你不需要它,它给攻击者用。

这一节要带走的一句是:防火墙的价值不在你放行了什么,而在你没放行什么——所以那条"默认拒绝"才是它的灵魂。

常见误区

  1. 错误:我设了"允许 443",所以很安全。——纠正:"允许什么"只是规则表的一半,另一半是"默认动作是什么"。 如果兜底规则是"允许任意",那么前面写的规则基本没有意义——因为所有没被明确拒绝的流量都会被放行。看一张规则表,先看最后一行。

  2. 错误:规则越多越安全。——纠正:恰恰相反。 规则越多,越容易出现"宽规则排在被细规则前面"、"上线的临时规则忘了删"、"业务早就下线了但规则还在"这类问题。合规要求里也明确写了要删除多余或无效的规则、保证规则数量最小化。规则表要定期做减法。

  3. 错误:有了防火墙,里面就不用再管了。——纠正:防火墙只看得见"内外之间"。它看不见内部机器之间的通信(东西向),也挡不住用合法凭据发起的操作,更看不到加密流量里的内容。所以它是一层,不是全部——这也是为什么后面还有 2-11(检测)和 2-13(分段)。

  4. 错误:装了防火墙就不用管出网方向了。——纠正:出网方向通常是默认放行的,而这正是最容易出事的一侧。一台被攻陷的机器要回连控制服务器、要外传数据,走的都是出口——如果出口没有任何策略,攻击者在里面的所有动作都不会被拦。合规要求里也明确包含"对内部用户非授权联到外部网络的行为进行检查或限制"。

自测三问(点开对答案) 1. 为什么"默认拒绝"这条兜底规则,比前面所有规则都重要? --- 因为**它是决定"未列出的情况怎么办"的那一条**。前面所有规则都是"逐条例外",而**没有任何规则表能穷举所有情况**——所以真正决定安全等级的,是那条"剩下的一律怎么办"。如果兜底是允许,那么**所有"没被想到"的情况都是默认放行的**——包括新的攻击手法、临时打开的端口、配错的策略。**默认拒绝的意义在于:把'没想到'变成'不允许'。** 2. "状态检测"相比纯包过滤,多判断了什么?为什么这个判断很关键? --- 纯包过滤只看单个信封,**它不知道这个包是"新开的连接"还是"对已有连接的回应"**。状态检测加了这个判断:**是不是内部先发起、外部在回应?** 关键性在于——你对外提供服务时(比如允许 443 进来),光看端口是无法区分"正常的访问请求"和"攻击者主动发起的连接尝试"的;而加上会话状态之后,**可以只放行"回应"而拒绝"新的主动连接"**,把一个容易误伤的口子收紧。 3. 为什么防火墙"看不见"内部机器之间的攻击?这带来什么后果? --- 因为**边界设备的位置就在内外之间**,它的视角天然只覆盖"进出"这一条线;**内部机器之间的通信根本不经过它**(这是"东西向流量")。后果是:**攻击者一旦进入内网,就可以在不触发任何边界规则的情况下横向移动**——扫描其他机器、读取共享文件、寻找更有价值的系统。这正是后面要用**内部分段(2-13)**和**东西向检测(2-11)**去补的那块空白。

相关笔记