1. 核心思想
ip-prefix 是一个专门用来"匹配路由"的筛子,它能同时检查"网络号"和"掩码长度"两个要素。
设计初衷:ACL只能匹配IP地址,管不了掩码长度,导致路由过滤经常出错;ip-prefix 把掩码长度也作为匹配条件,解决了这个痛点。
生活类比:你要从一堆快递中挑出"所有寄往北京市朝阳区、并且箱子是中等尺寸(高20-30cm)的"。
ACL:只看地址"北京市朝阳区",不看箱子尺寸。
ip-prefix:既看地址"北京市朝阳区",又看箱子尺寸"20-30cm"。
2. 底层原理 & 设计逻辑
2.1 为什么ACL做不到精确匹配路由?
路由条目包含两个关键信息:目的网络 (如192.168.1.0)和掩码长度 (如24)。
ACL在匹配时,只看目的网络的前多少位是否符合,完全不关心掩码长度。
举个例子:
路由A:192.168.1.0/24
路由B:192.168.1.0/16
你用ACL:rule permit source 192.168.1.0 0.0.0.255(通配符表示前24位固定)。
结果:路由A和路由B的前24位都是192.168.1.0,所以两条都被匹配。你无法用ACL说"只要掩码长度=24的"。
这就是现网故障的根源:工程师想放行/24,却因为ACL的局限,把/16也放行了,导致路由器学到大网段,流量被错误吸引。
2.2 ip-prefix 如何解决?
ip-prefix 的每条规则有三个核心参数:
网络号 (如
192.168.1.0)掩码长度 (如
24)------ 这个就是"精确匹配掩码"掩码范围 (可选,如
greater-equal 16 less-equal 24)------ 允许一个区间
匹配规则:网络号匹配 + 掩码长度在指定范围内,才算命中。
所以:
bash
ip ip-prefix TEST permit 192.168.1.0 24
路由A(/24):掩码长度=24 → 匹配 → 允许
路由B(/16):掩码长度=16 ≠ 24 → 不匹配 → 拒绝
一句话:ip-prefix 把"掩码长度"变成了可比较的条件。
2.3 掩码范围的写法(考试重点)
| 写法 | 含义 |
|---|---|
permit 10.0.0.0 8 |
掩码长度必须等于8(只匹配/8) |
permit 10.0.0.0 8 ge 16 |
掩码长度16~32(ge 16表示最小16,le不写则默认32) |
permit 10.0.0.0 8 le 24 |
掩码长度8~24(ge不写则默认等于前面的8) |
permit 10.0.0.0 8 ge 16 le 24 |
掩码长度16~24 |
关键限制 :必须满足 前面的掩码长度 <= ge <= le <= 32。
例如 8 ge 16 le 24 是合法的;8 ge 4 会报错(因为4<8)。
注意 :前面的网络号 10.0.0.0 8 表示"只考虑属于10.0.0.0/8这个大网内的路由",然后再从里面挑出掩码长度在指定范围的。不属于10.0.0.0/8的(如192.168.1.0/24)根本不进入比较。
2.4 多条规则顺序(隐含拒绝)
ip-prefix 可以有多个条目,每个有条目号(index,默认步长10)。按index从小到大匹配,一旦匹配就停止,不再往下看。
如果所有条目都不匹配,结果就是 deny(隐含拒绝)。
这和ACL完全一样。不同的是,ip-prefix 没有"最后默认允许所有"的尾巴。
3. 深度辨析 & 常见误解
| 误解 | 真相 |
|---|---|
| "ip-prefix 可以匹配数据包" | 错。它只能匹配路由条目。过滤数据包用ACL。 |
| "ip-prefix 匹配时,网络号必须完全一样" | 不完全是。permit 10.0.0.0 8 可以匹配 10.1.0.0/16,因为 10.1.0.0 属于 10.0.0.0/8 内。网络号比较是按前面的掩码长度截取的。 |
"permit 0.0.0.0 0 只匹配默认路由" |
对。掩码长度=0就是默认路由。 |
"permit 0.0.0.0 0 ge 0 le 32 会匹配所有路由" |
对。因为网络号0.0.0.0与任何路由的与运算都得0,且掩码范围0-32包含所有。这是"匹配任意路由"的常用写法。 |
| "ip-prefix 和 route-policy 是一回事" | 错。ip-prefix 只能匹配,不能修改属性;route-policy 可以调用 ip-prefix 来做匹配,还能执行 apply 修改属性。 |
对比表:ACL vs ip-prefix vs route-policy(只保留最核心区别)
| 工具 | 匹配对象 | 能否控制掩码长度 | 能否修改路由属性 |
|---|---|---|---|
| ACL | 数据包 或 路由(但路由只看IP,不看掩码) | 不能 | 不能 |
| ip-prefix | 路由(网络号+掩码长度) | 能 | 不能 |
| route-policy | 路由(可调用ip-prefix等) | 能(通过调用ip-prefix) | 能 |
4. 基础安全风险 & 最简防护(基础期)
| 风险 | 场景 | 最简防护 |
|---|---|---|
| 误放私有路由 | 本应拒绝10.0.0.0/8,但ip-prefix写成了 permit 0.0.0.0 0 ge 0 le 32 |
明确写 deny 10.0.0.0 8 ge 8 le 32 放在前面 |
| 掩码范围过大 | 本想放行/24,却写了 ge 16 le 24,导致/16也被放行 |
严格限定范围:ge 24 le 24 或直接不写ge/le |
| 隐含拒绝导致断网 | 忘记写permit条目,所有路由被拒绝 | 配置后先用 display ip ip-prefix 检查,必要时加一条 permit 0.0.0.0 0 ge 0 le 32 兜底(谨慎) |