3、基于前缀列表的过滤:ip prefix-list配置详解、匹配规则与顺序
聊到BGP路由过滤,很多人第一反应就是ACL。但说实话,ACL在处理路由前缀时有个硬伤——它只能匹配IP地址,没法精确匹配掩码长度。你想想看,一个ACL规则写permit 10.1.0.0 0.0.255.255,它既匹配了10.1.0.0/16,也匹配了10.1.1.0/24,甚至10.1.0.0/32都能过。这在路由过滤场景下,简直就是灾难。
所以,我个人习惯用前缀列表(ip prefix-list)来做BGP路由过滤。它能同时匹配网络号和掩码长度,精度高得多。我在项目中遇到过好几次,用ACL没拦住的路由,换成prefix-list一把就掐住了。
3.1 ip prefix-list 配置详解
先看基本语法:
ip prefix-list {name} [seq {number}] {permit|deny} {network/length} [ge {ge-length}] [le {le-length}]
嗯,这里要注意几个关键点:
- name:列表名称,区分大小写。我习惯用
BGP-FILTER-IN这种命名方式,一看就知道用途。 - seq:序列号,默认步长5。如果不指定,系统自动分配。但建议手动指定,方便后续插入规则。
- permit/deny:动作,允许或拒绝。
- network/length:要匹配的前缀和掩码长度。
- ge/le:范围匹配,ge是最小掩码长度,le是最大掩码长度。
举个例子:
ip prefix-list EXAMPLE seq 10 permit 10.1.0.0/16 ge 24 le 28
这条规则的意思是:匹配以10.1.0.0/16为网络号,且掩码长度在24到28位之间的所有前缀。说白了,就是10.1.x.x网段里,那些掩码是24、25、26、27、28的路由。
3.2 匹配规则与顺序
前缀列表的匹配规则,说白了就一句话:从上到下逐条匹配,命中即止。这和ACL的逻辑一模一样。
但有个坑,我必须要说——隐式拒绝。所有前缀列表末尾都有一条看不见的deny any。如果你只写了permit规则,没匹配到的路由全部被拒绝。
permit 10.0.0.0/8 le 24,以为其他路由会自动放行。结果BGP邻居起来后,一条路由都没收到。查了半天才发现,漏了permit 0.0.0.0/0 le 32来放行默认路由。嗯,从那以后我每次配prefix-list,都会检查一下有没有漏掉必要的permit规则。
关于ge和le的匹配逻辑,这里有个表格,一目了然:
| 配置写法 | 匹配的掩码范围 | 说明 |
|---|---|---|
permit 10.0.0.0/8 |
精确匹配/8 | 只匹配10.0.0.0/8 |
permit 10.0.0.0/8 ge 16 |
/16 ~ /32 | 掩码≥16位 |
permit 10.0.0.0/8 le 24 |
/8 ~ /24 | 掩码≤24位 |
permit 10.0.0.0/8 ge 16 le 24 |
/16 ~ /24 | 掩码在16~24之间 |
这里有个细节:network/length中的/length是基础掩码,而ge和le是范围掩码。基础掩码决定了匹配的网络号范围,ge/le决定了掩码长度的范围。两者是与的关系。
3.3 实战案例:只允许特定网段
假设我们有一个BGP对等体,只允许接收以下网段:
10.1.0.0/16及其子网(掩码/24 ~ /28)172.16.0.0/12精确匹配192.168.0.0/16及其子网(掩码/24 ~ /30)
配置如下:
! 允许10.1.0.0/16的子网,掩码范围24~28
ip prefix-list ALLOW-ONLY seq 10 permit 10.1.0.0/16 ge 24 le 28
! 允许172.16.0.0/12精确匹配
ip prefix-list ALLOW-ONLY seq 20 permit 172.16.0.0/12
! 允许192.168.0.0/16的子网,掩码范围24~30
ip prefix-list ALLOW-ONLY seq 30 permit 192.168.0.0/16 ge 24 le 30
! 隐式拒绝所有其他路由(不需要写,系统自动添加)
! 应用到BGP对等体
router bgp 65001
neighbor 10.0.0.1 prefix-list ALLOW-ONLY in
你想想看,如果这里用ACL怎么写?你得写一堆permit 10.1.0.0 0.0.255.255,然后还得配合ip prefix-list或者route-map来限制掩码。而prefix-list一行就搞定了。
show ip prefix-list查看当前列表内容,确认规则顺序和序列号。如果发现漏了规则,可以用seq指定序列号插入,不用删了重写。比如在seq 10和seq 20之间插入一条,用seq 15就行。
3.4 知识体系核心逻辑
下面这张图,帮你理清前缀列表的核心逻辑:
说白了,前缀列表的匹配就是一条流水线。路由前缀进来,从上到下逐个规则检查。匹配到permit就放行,匹配到deny就拒绝,都不匹配就交给隐式deny处理。这个逻辑虽然简单,但实际配置时很容易因为顺序问题翻车。
- 前缀列表同时匹配网络号和掩码长度,精度远高于ACL
- ge/le用于指定掩码范围,灵活控制子网粒度
- 规则顺序至关重要,命中即止,末尾隐式拒绝
- 实战中建议手动指定seq,方便后续维护
好了,关于前缀列表的配置和实战,就聊到这儿。记住一点:能用prefix-list解决的问题,别用ACL硬扛。我在现网中见过太多因为ACL掩码匹配不精确导致的路由泄露事故,教训深刻啊。