在软考网络工程师与网络规划设计师的命题体系中,访问控制列表(Access Control List,简称ACL)与IP前缀列表(ip-prefix)是两个经常被放在同一道题里对比考查的工具。它们表面上都能做"过滤",但底层机制完全不同,考试一旦混淆,几乎没有回旋余地。本文从定义出发,先把二者的边界划清楚。
ACL是一组由管理员手工编排的有序规则集合,网络设备在收到或转发数据报文时,逐条将报文与规则进行比对,命中即按规则指定的动作执行放行或丢弃,未命中则继续匹配下一条。标准文档对ACL的定义强调的是"有序"与"逐条匹配",这决定了ACL的语义天然带有顺序敏感的特征:同一条报文,规则排列顺序不同,最终的处理结果可能截然相反。
软考教材中,ACL按匹配字段的丰富程度分为两类。第一类是基本ACL,编号范围通常为2000到2999,它只能依据报文的源IP地址一个字段进行匹配,能力非常受限。第二类是高级ACL,编号范围通常为3000到3999,它能够同时匹配源IP地址、目的IP地址、协议类型、源端口、目的端口、TCP标志位、分片标记、优先级等多种字段,能力远超基本ACL。这两类ACL构成了软考命题的底层坐标系,几乎每一道ACL题都要先判断题目场景该用哪一类。
IP前缀列表是另一种过滤工具,它匹配的对象不是"某个具体IP地址",而是"网络前缀",即由网络地址和掩码长度共同构成的一条路由条目。ip-prefix的设计目标从一开始就指向路由过滤:路由表中每一条路由都是一个前缀,前缀列表正是为逐条精确匹配这些前缀而生的。
ip-prefix的每条规则由网络地址、掩码长度以及掩码长度范围三个要素构成。一个典型的ip-prefix规则可以描述为"匹配网络地址为某值、掩码长度恰好等于或落在某一区间的路由"。这种"地址加掩码长度"的双重约束,是它区别于ACL最本质的地方,也是本文后续所有推导的起点。
需要特别说明的是,ip-prefix的命名中带有"前缀"二字,这个"前缀"指的就是IP地址加掩码长度共同构成的一个整体,而非单纯的地址数字。在路由协议的语境下,一条路由就是一条前缀,前缀列表就是用来逐条匹配这些前缀的清单。理解了这一点,也就理解了为什么在路由过滤场景中,ip-prefix是比ACL更贴合问题本质的工具:路由协议处理的对象本身就是前缀,而ip-prefix的匹配模型恰好也是前缀,二者在数据结构上天然对齐;反观ACL,它的匹配模型是"报文字段",与路由前缀的数据结构并不对齐,用不对齐的工具去处理路由,自然处处掣肘。
要理解为什么在路由过滤场景下必须改用ip-prefix,必须先钻进ACL的匹配引擎内部,看清通配符掩码这个看似简单实则暗藏陷阱的机制。
通配符掩码(wildcard mask)是ACL用于描述地址匹配范围的核心工具,它与我们熟悉的子网掩码长得一模一样,都是四个点分十进制数,但语义恰好相反。子网掩码中,二进制为1的位表示网络位,为0的位表示主机位;而通配符掩码中,二进制为0的位表示"必须精确匹配",为1的位表示"忽略,不关心"。
这一反直觉的对应关系,是考生在ACL题上反复失分的第一道坎。例如通配符掩码0.0.0.0表示四个字节全部必须精确匹配,即只匹配唯一一个IP地址;而通配符掩码255.255.255.255表示四个字节全部忽略,即匹配任意IP地址,相当于any。若想匹配192.168.1.0这个C类网段的所有主机,通配符掩码应写为0.0.0.255,前三个字节精确匹配,最后一个字节忽略。许多人顺手写成255.255.255.0,恰好把语义完全颠倒,这正是命题人最爱挖的坑。
更细一步看,通配符掩码还能表达"非连续"的匹配需求。例如通配符掩码0.0.0.254,其二进制末位是11111110,意味着最后一个字节除最低位外全部忽略、最低位必须精确。这种非连续的匹配能力是子网掩码所不具备的,因为子网掩码的网络位必须连续,而通配符掩码的忽略位却可以任意分布。这一差异在考题里偶尔以"下列哪个通配符掩码匹配所有奇数主机地址"之类的形式出现,答案通常就是0.0.0.254,因为末位为1代表奇数。这类题考查的正是考生对通配符掩码"按位忽略"本质的理解是否到位。
更关键的机制问题在于,ACL的匹配本质上是"字段级"的。当ACL被用于过滤路由时,它比对的是路由条目中携带的"目的网络地址"这一个字段,而路由条目真正定义网络边界的"掩码长度"字段,ACL根本无法参与匹配。换句话说,ACL看到的只是路由里的那个IP地址数字,它不知道也不关心这条路由的前缀到底有多长。
这就引出了ACL用于路由过滤时的根本缺陷:一条通配符掩码为0.0.0.0、地址为10.0.1.0的ACL规则,其本意可能是"只精确匹配10.0.1.0这一个地址",但掩码长度的信息在匹配过程中完全丢失。当路由表中同时存在10.0.1.0/24、10.0.1.0/25、10.0.1.0/26等不同掩码长度的前缀时,ACL无法区分它们——因为所有这些前缀的网络地址字段都等于10.0.1.0,ACL只看地址,天然无法表达"我要的是/24这条,不是/25这条"。
ip-prefix之所以能够胜任路由过滤,正是因为它把掩码长度纳入匹配条件。一条ip-prefix规则同时声明网络地址和掩码长度,匹配时两个字段都要满足。它还能用"掩码长度大于等于、小于等于"的方式表达前缀范围,例如匹配掩码长度落在24到26之间、且网络地址等于某个值的所有路由。
这一机制让ip-prefix能够精确锁定某一条或某一组路由,而不会像ACL那样把掩码长度不同的路由"一锅端"。回到ACL失手的那个场景:用ip-prefix声明"网络地址10.0.1.0,掩码长度恰好24",就能只匹配10.0.1.0/24这一条,10.0.1.0/25和/26都不会被误伤。这种"地址加掩码"的双重匹配,正是ip-prefix取代ACL做路由过滤的技术本质。
ip-prefix在表达掩码长度时,还支持大于等于、小于等于这样的区间语法。例如"掩码长度大于等于24且小于等于26",可以一次性圈定24、25、26三个长度的前缀。这种区间表达能力,让ip-prefix在应对"一批掩码长度相近的路由"时非常高效,一条规则就能覆盖多组前缀,而ACL要实现同样的效果,往往需要堆叠多条地址规则,且依然无法精确控制掩码边界。从工程角度看,这既是正确性问题,也是可维护性问题,ip-prefix在这两个维度上都优于ACL。
理解了两者的机制差异,就可以回到应用层面,厘清各类工具的适用边界。软考题目反复考察"什么场景该用哪个工具",其背后的判断依据正来源于本节。
基本ACL只依据源IP地址进行过滤,因此它的典型应用场景是对数据流量的"粗粒度"控制。例如允许某个源网段的所有主机访问服务器、拒绝另一个源网段的所有流量,这类只关心"谁发起的"、不关心"访问什么"的需求,基本ACL即可胜任。高级ACL则能同时精确到协议、端口和目的地址,适用于"允许某网段通过TCP访问某服务器的80端口,其余全部拒绝"这类细粒度控制。
软考对编号规则的考查非常高频,考生必须准确记忆:基本ACL编号2000到2999,高级ACL编号3000到3999。编号不仅是一个标识符,它同时决定了设备的解析方式——设备看到2000开头的规则就按基本ACL的字段集去解析,看到3000开头就按高级ACL的字段集去解析。这个编号与字段集的绑定关系,是命题人考查"设备内部如何处理ACL"的常见切入点。
此外,ACL还支持命名的形式,即给一组规则起一个名字,取代纯数字编号。命名ACL的匹配能力与对应编号段一致,命名的好处是语义更直观、便于维护。软考偶尔会考查"命名ACL与编号ACL能力是否相同"这类细节,答案通常是:命名ACL与同类型编号ACL的匹配能力一致,命名只是管理方式的改进,并不改变匹配字段集。同时,设备上还普遍存在一条隐含的默认规则,即"未匹配任何显式规则的报文最终被丢弃",这条隐含拒绝规则是ACL行为闭合的关键,也是考生理解"为什么ACL末尾看似没有deny却仍然会拒绝流量"这一现象的钥匙。
ACL在工程实践中主要有四大应用场景。其一是接口流量过滤,即在路由器或防火墙的接口上应用ACL,对进出的数据报文进行放行或丢弃。其二是网络地址转换(NAT)中的地址池选择,用ACL圈定哪些源地址需要做地址转换。其三是安全防护中的访问控制,配合防火墙策略实现基于IP和端口的准入。其四才是路由过滤,即把ACL用在路由协议的引入或分发环节,对路由条目进行筛选。
前三个场景中,ACL匹配的对象是数据报文,报文中天然携带源地址、目的地址、端口等信息,ACL的字段级匹配恰好够用。唯独第四个场景——路由过滤——ACL匹配的对象变成了路由条目,而路由条目的关键特征是掩码长度,这一信息ACL匹配不了,于是ACL在路由过滤场景中暴露出结构性缺陷。软考命题正是抓住了这个"ACL能过滤流量、却过滤不好路由"的反差来设置陷阱。
ip-prefix的典型应用集中在路由协议层面。其一是路由引入时的过滤,例如在OSPF进程里把外部静态路由引入时,用ip-prefix精确圈定允许引入的路由范围。其二是路由发布时的过滤,例如在BG
本篇完!