1. 项目概述:路由过滤的“守门人”角色
在网络工程师的日常运维和设计工作中,路由控制是核心技能之一。想象一下,你管理着一个大型园区网或运营商网络,OSPF或IS-IS作为内部网关协议(IGP)在高效地分发路由信息。但并非所有路由都需要被所有设备知晓或用于数据转发。比如,某个区域只应访问特定的服务器网段,或者需要防止某些实验性路由泄露到生产核心。这时候,filter和filter-policy就扮演了至关重要的“守门人”角色。它们不是独立的协议,而是作用于路由协议进程的关键控制工具,用于精细化管理路由信息的接收、发布和引入,是实现网络策略、优化路由表、提升安全性与稳定性的必备手段。
很多朋友对这两个概念容易混淆,或者仅停留在“知道能过滤路由”的层面,一旦遇到复杂的多协议、双向过滤场景就无从下手。实际上,filter(访问控制列表、前缀列表等过滤工具)是规则的定义者,它描述了我们想匹配哪些路由(基于IP前缀、掩码长度等);而filter-policy(路由策略)是规则的执行者,它决定了在路由协议的哪个环节(进口、出口、引入)应用这些filter规则。搞清这个“定义”与“执行”的关系,是玩转路由过滤的第一步。本文将深入拆解在OSPF和IS-IS这两种主流链路状态协议中,如何正确、高效地运用filter和filter-policy,并结合大量实操中的“坑”与技巧,让你不仅能配置,更能理解其背后的原理与影响。
2. 核心概念辨析:Filter工具与Filter-Policy策略
在深入协议细节前,我们必须夯实基础,彻底厘清filter(过滤工具)和filter-policy(过滤策略)的区别与联系。这是后续所有复杂操作的理论基石。
2.1 Filter:构建规则的“原材料”
Filter在这里并非特指某一个命令,而是一类用于匹配路由信息的基础工具集合。你可以把它们理解为建造策略的“砖瓦”。常见的filter工具包括:
- 基本ACL(Basic ACL):主要基于源IP地址进行匹配。在路由过滤场景下,它通常用于匹配路由的网络地址(注意,不是数据包的源地址)。例如,
acl 2000 rule 5 permit source 10.1.1.0 0.0.0.255可以匹配10.1.1.0/24这条路由。但其弱点在于无法精确匹配掩码长度。 - 高级ACL(Advanced ACL):可以基于源IP、目的IP、协议类型等更丰富的要素。在路由过滤中偶尔用于复杂匹配,但并非主流。
- 前缀列表(Prefix-list):这是路由过滤中最常用、最强大的
filter工具。它可以同时匹配路由前缀(网络号)和掩码长度(前缀长度),并且支持更灵活的匹配范围(如ge,le参数)。例如,ip prefix-list PL-EXAMPLE index 10 permit 172.16.0.0/16 ge 24 le 28表示匹配172.16.0.0/16这个主网下的所有子网,且子网掩码长度在24到28位之间。这种精确控制是ACL难以实现的。
注意:
filter工具本身并不执行任何动作。创建一条prefix-list或acl,仅仅是在设备本地生成了一张匹配规则表,它不会主动去影响任何路由。它的状态是“就绪”,等待被调用。
2.2 Filter-Policy:应用规则的“指挥官”
Filter-policy(在有些厂商设备中可能直接叫route-policy或distribute-list,但逻辑相通)是一个策略命令,它需要调用一个或多个filter工具,并规定在路由协议的哪个处理节点上执行“允许”或“拒绝”动作。
它的核心逻辑是:在路由信息流经协议处理流程的某个关键点时,检查该信息是否匹配指定的filter规则。如果匹配,则执行permit或deny动作;如果不匹配,则按默认策略处理(通常是deny)。
Filter-policy的应用方向至关重要,主要分为三类:
- Import方向(入方向):过滤接收到的路由信息。影响本设备的路由表(RIB)和链路状态数据库(LSDB)的生成(对于链路状态协议有特殊之处,后文详述)。
- Export方向(出方向):过滤对外发布的路由信息。影响邻居设备能学到什么。
- 在路由引入(Redistribution)时应用:过滤从其他路由协议或直连/静态路由引入到当前协议的路由。
两者的关系类比:Filter像是警察手中的“通缉令名单”(描述特征),而filter-policy就像是设置在机场、车站的“检查站”(执行地点)以及“见到名单上的人就扣留”的指令(执行动作)。没有名单,检查站无法工作;没有检查站,名单只是一张废纸。
3. OSPF中的Filter与Filter-Policy实战解析
OSPF作为链路状态协议,其过滤机制与距离矢量协议(如RIP)有本质区别。这是因为OSPF区域内设备同步的是链路状态通告(LSA),而非直接的路由表。这个特性使得过滤行为更加微妙。
3.1 OSPF Filter-Policy Import:对路由表(RIB)的过滤
这是OSPF中最常用的过滤方式。命令形如filter-policy {acl-number | prefix-list name} import。它的作用位置和效果非常明确:
- 作用位置:在SPF算法计算完毕,生成路由条目后,准备将其安装到设备全局路由表(RIB)之前。
- 核心影响:只过滤进入本设备路由表的路由,不影响链路状态数据库(LSDB)的完整性和同步。
- 工作流程:
- 路由器通过LSA洪泛,与区域内其他路由器保持完全一致的LSDB。
- 本机运行SPF算法,基于LSDB计算出所有可达路由。
- 在将这些计算出的OSPF路由提交给RIB之前,
filter-policy import介入。 - 每条待提交的路由与引用的ACL或前缀列表进行匹配。
- 匹配
permit规则的路由被允许加入RIB;匹配deny规则或未匹配任何规则(隐含拒绝所有)的路由被丢弃,但这条路由依然存在于LSDB中。
实操示例与验证: 假设我们有路由器R1、R2、R3运行在OSPF Area 0。R3上有一个环回口loopback 3.3.3.3/32通告进OSPF。我们在R1上配置:
ip prefix-list BLOCK-3 deny 3.3.3.3/32 ip prefix-list BLOCK-3 permit 0.0.0.0/0 le 32 # 允许其他所有 # ospf 1 filter-policy prefix-list BLOCK-3 import配置后,在R1上查看:
display ip routing-table protocol ospf:将看不到3.3.3.3/32的路由。display ospf lsdb:依然能看到描述3.3.3.3/32的Type-1 LSA(由R3产生)。- 连通性测试:从R1
ping 3.3.3.3会失败,因为路由表中没有该路由。但R2到R3的通信不受任何影响。
关键心得:
filter-policy import是一种“本地化”的过滤策略,常用于控制本设备的数据转发路径(例如,不让本设备访问某个网段),而不会破坏OSPF区域内的拓扑信息一致性。这既是优点(不影响邻居),也是限制(无法阻止LSA传播)。
3.2 OSPF Filter-Policy Export与路由引入过滤
OSPF的filter-policy export命令不能用于过滤OSPF内部路由(Type-1, Type-2 LSA转换的路由)的发布。这是由链路状态协议的本质决定的:区域内路由是通过LSA洪泛同步,而非逐跳通告。
它的主要应用场景是过滤引入的外部路由。 命令形如filter-policy {acl-number | prefix-list name} export [protocol]。
- 作用位置:在将其他协议(如直连、静态、BGP、RIP)的路由引入(redistribute)到OSPF时,在生成AS-external LSA(Type-5 LSA)之前进行过滤。
- 核心影响:控制哪些外部路由可以被重分发到OSPF域中。
实操示例: 在ASBR路由器上,我们想将直连路由192.168.1.0/24和192.168.2.0/24引入OSPF,但只允许发布192.168.1.0/24。
ip prefix-list ALLOW-REDIST permit 192.168.1.0/24 # ospf 1 import-route direct filter-policy prefix-list ALLOW-REDIST export direct # 关键在此配置后,ASBR只会为192.168.1.0/24生成Type-5 LSA并洪泛,而192.168.2.0/24则不会被引入OSPF。
3.3 OSPF区域间路由过滤(ABR上的Filter)
OSPF还有另一种更细粒度的过滤方式:在ABR上过滤区域间路由(Type-3 Summary LSA)。这需要使用area {area-id} filter命令。
- 作用位置:在ABR上,控制从一个区域向另一个区域发送的Summary LSA。
- 类型:
area 1 filter prefix-list PL-OUT export:过滤从Area 1(或其他区域)计算出的路由,在发布到Area 0(或其他区域)时。area 0 filter prefix-list PL-IN import:过滤从Area 0(或其他区域)接收到的Summary LSA,在计算并安装到Area 1的路由表之前。
- 核心影响:可以实现区域间的路由隔离,是设计层次化、安全OSPF网络的重要手段。
配置对比表:OSPF常见过滤方式
| 过滤方式 | 命令示例 | 作用点 | 影响范围 | 典型应用场景 |
|---|---|---|---|---|
| Import过滤 | filter-policy 2000 import | SPF计算后,RIB安装前 | 仅本地路由表 | 控制本设备转发路径,实现本地策略 |
| Export过滤 | filter-policy 2000 export direct | 路由重分发时 | 整个OSPF域(对引入的路由) | 控制外部路由注入OSPF的范围 |
| 区域间出口过滤 | area 1 filter prefix-list PL-OUT export | ABR生成Summary LSA时 | 目标区域的所有路由器 | 实现区域间的路由隔离,如禁止某个区域访问核心区 |
| 区域间进口过滤 | area 0 filter prefix-list PL-IN import | ABR处理接收的Summary LSA时 | 本区域(ABR所在)的所有路由器 | 保护本区域,不接收某些区域间路由 |
4. IS-IS中的Filter与Filter-Policy特性详解
IS-IS同样是一种链路状态协议,其过滤逻辑与OSPF相似,但在命令语法和某些细节上存在差异。理解这些差异是避免配置错误的关键。
4.1 IS-IS Filter-Policy Import:原理与OSPF类似
与OSPF类似,filter-policy import在IS-IS中的作用也是过滤计算出的路由进入本地路由表,而不影响链路状态数据库(LSDB)的同步。
- 命令语法(以常见厂商为例):
filter-policy {acl-number | prefix-list name} import - 工作流程:
- 路由器同步LSDB,运行SPF算法。
- 计算出所有IS-IS路由。
filter-policy import在此处拦截,根据规则决定哪些路由可以加入RIB。- 被过滤掉的路由不会出现在路由表中,但对应的LSP(链路状态PDU)依然存在于LSDB中,并会继续被洪泛。
一个容易踩坑的细节:IS-IS默认级别(Level-1, Level-2)。在配置filter-policy import时,如果不指定级别,该策略可能会同时应用于Level-1和Level-2路由。为了精确控制,通常需要结合路由策略或明确指定过滤的上下文。
4.2 IS-IS Filter-Policy Export与路由泄露控制
IS-IS的filter-policy export命令行为与OSPF高度一致:不能过滤IS-IS内部路由的发布,主要用于过滤引入的外部路由。
- 命令语法:
filter-policy {acl-number | prefix-list name} export [protocol] - 应用场景:当IS-IS路由器作为“准ASBR”(引入外部路由)时,控制哪些静态、直连、BGP等路由可以被注入到IS-IS域中,并以IP可达性信息的形式在LSP中传播。
IS-IS特有的“路由泄露”与过滤: IS-IS Level-1-2路由器默认会将Level-2的路由自动下发给Level-1区域(这就是路由泄露)。有时我们需要控制这种泄露。虽然标准做法是使用import-route isis level-2 into level-1 filter-policy这类命令,但其本质也是在“引入”路由(从Level-2到Level-1)时应用过滤策略,逻辑上与filter-policy export在重分发时的作用相似。
4.3 IS-IS LSP生成与发布过滤
这是IS-IS相比OSPF一个更强大的过滤特性。除了过滤路由表,IS-IS还可以在生成LSP报文的源头进行过滤。这通过filter-policy export配合direct或特定协议来实现,但更精细的控制需要使用isis advertise-filter这类命令(命令名因厂商而异)。
- 作用位置:在路由器准备将自己直连的IP前缀信息写入要洪泛的LSP报文时。
- 核心影响:直接从源头阻止某些IP前缀信息进入IS-IS的LSDB。这意味着邻居路由器根本学不到被过滤的前缀,实现了真正的“信息隐藏”。
- 与
filter-policy import的区别:特性 filter-policy importLSP发布过滤 (如 advertise-filter)作用阶段 SPF计算后,RIB安装前 LSP生成时 影响数据库 不影响本地LSDB 影响本地及全网LSDB 影响邻居 邻居LSDB完整,能计算路由 邻居LSDB中无此前缀信息 用途 本地路由控制 全网拓扑信息控制,网络优化
实操示例: 路由器R1有直连网段10.1.1.0/24和10.1.2.0/24,希望只将10.1.1.0/24通告进IS-IS。
ip prefix-list ADV permit 10.1.1.0/24 # isis 1 network-entity 49.0001.0000.0000.0001.00 # address-family ipv4 unicast advertise-filter prefix-list ADV # 关键配置,阻止10.1.2.0/24进入LSP配置后,所有IS-IS邻居的LSDB中都不会出现10.1.2.0/24的前缀信息,因此全网任何IS-IS路由器都无法计算出到达该网段的路由。
5. 高级应用与复杂场景排错指南
掌握了基础原理和单点配置后,面对网络中的复杂需求,我们需要组合运用这些工具。
5.1 双向过滤与多协议环境下的策略联动
场景:一台边界路由器同时运行OSPF和BGP,需要将OSPF的某些内部路由谨慎地注入BGP,同时又将BGP学到的特定路由引入OSPF,并确保循环和次优路径问题不会发生。
解决方案思路:
- 定义清晰的Filter工具:为不同的过滤目的创建不同的前缀列表或ACL。例如:
prefix-list PL-OSPF-TO-BGP: 定义允许从OSPF引入BGP的路由。prefix-list PL-BGP-TO-OSPF: 定义允许从BGP引入OSPF的路由。prefix-list PL-DENY-DEFAULT: 明确拒绝默认路由,防止意外传播。
- 在路由引入点应用Filter-Policy:
- 在BGP进程下配置:
import-route ospf 1 route-policy RP-OSPF-TO-BGP,其中route-policy内部调用PL-OSPF-TO-BGP。 - 在OSPF进程下配置:
import-route bgp route-policy RP-BGP-TO-OSPF,其中route-policy内部调用PL-BGP-TO-OSPF。
- 在BGP进程下配置:
- 使用Route-Tag进行标记和过滤:在引入路由时,可以为其设置一个Tag(社区属性的一种简化使用)。后续的过滤策略可以基于这个Tag进行,使得策略更清晰、易于维护。例如,为所有从BGP引入OSPF的路由设置Tag 100,然后在OSPF向其他区域发布时,ABR上可以配置过滤掉Tag为100的路由。
5.2 常见故障排查与调试命令实录
路由过滤配置不当是导致网络“诡异”不通的常见原因。以下是一个系统化的排查流程:
- 现象确认:具体是哪两个点不通?使用
tracert或ping确认断点。 - 检查本地路由表:在故障设备上使用
display ip routing-table x.x.x.x查看是否有到达目标网段的路由。如果没有,进入下一步。 - 检查协议路由表:使用
display ospf routing或display isis route查看协议是否计算出了该路由。如果协议路由表中有,但全局路由表中没有,大概率是filter-policy import在起作用。 - 检查Filter-Policy配置:仔细核对设备上生效的
filter-policy语句,确认其引用的ACL或前缀列表编号/名称是否正确。 - 检查Filter工具内容:使用
display acl all或display ip prefix-list name XXX查看定义的规则。务必注意规则的匹配顺序和隐含的deny any。- 经典坑1:前缀列表只写了
deny条目,没有最后的permit 0.0.0.0/0 le 32,导致所有路由被隐式拒绝。 - 经典坑2:ACL使用错误的反掩码,或误用了
gt,le参数。
- 经典坑1:前缀列表只写了
- 检查LSDB/LSP:对于OSPF/IS-IS,使用
display ospf lsdb或display isis lsdb查看相关的LSA/LSP是否存在。如果LSDB中都没有,说明过滤发生在发布源头(OSPF的域间过滤、IS-IS的advertise-filter,或路由根本未通告)。 - 调试工具:在可控环境下,可以开启协议调试信息(如
debugging ospf event,生产环境慎用),观察路由更新是否被发送或接收。
一个真实排错案例: 网络中出现部分路由缺失。检查发现,一台ABR上配置了area 1 filter prefix-list PL-TEST import。排查PL-TEST,其内容为:
ip prefix-list PL-TEST index 10 deny 10.2.0.0/16 ge 24 ip prefix-list PL-TEST index 20 permit 0.0.0.0/0 le 32意图是阻止10.2.0.0/16的精细子网(/24及以上)进入Area 1。但实际效果是,10.2.0.0/16本身(掩码16位)也被拒绝了。为什么?因为前缀列表的匹配是“最长匹配”逻辑。条目10匹配了10.2.0.0/16(因为/16在ge 24的范围内吗?不,ge 24表示掩码长度大于等于24,/16不满足此条件)。实际上,10.2.0.0/16没有匹配条目10,它落到了条目20,被允许了。问题可能出在其他地方。进一步排查发现,Area 1内实际缺失的是10.2.1.0/24。它成功匹配了条目10(10.2.0.0/16包含了10.2.1.0,且掩码24 >= 24),因此被拒绝。配置意图正确,但结果符合预期。故障可能是其他区域的过滤导致。这个案例说明了精确理解前缀列表参数(ge,le)的重要性。
5.3 性能考量与最佳实践建议
- 前缀列表优于ACL:在路由过滤场景中,始终优先使用前缀列表(Prefix-list)。它专为路由匹配设计,语法更直观(网络/掩码形式),且匹配效率通常更高。
- 精细过滤原则:尽量使用精确的前缀和掩码进行匹配,避免使用过于宽泛的
permit 0.0.0.0/0 le 32。在列表末尾使用一个明确的允许或拒绝所有的条目作为“兜底策略”,而不是依赖隐式规则。 - Import过滤的局限性:时刻记住OSPF/IS-IS的
import过滤不改变LSDB。如果目的是为了隐藏网络信息或减少洪泛流量,需要在发布源头(OSPF的ABR区域过滤、IS-IS的advertise-filter)进行控制。 - 测试与验证:在应用任何过滤策略,尤其是出口过滤或LSP生成过滤时,先在非核心设备或测试环境验证。使用
display ospf lsdb/display isis lsdb对比过滤前后变化,是验证源头过滤是否生效的金标准。 - 文档与注释:在配置中为复杂的prefix-list和filter-policy添加描述性注释。清晰的命名规范(如
PL-TO-CORE-PERMIT,FP-IMPORT-FROM-AREA1)能极大提升后期维护效率。
路由过滤是网络精细化管理的体现,理解filter与filter-policy在OSPF和IS-IS中的细微差别,能够帮助我们在保证网络连通性的前提下,实现流量引导、安全隔离和资源优化。从查看路由表开始,到分析LSDB,再到逐条核对过滤策略,这套排查思路适用于大部分与路由过滤相关的网络故障。记住,所有策略生效的前提,是你对路由流动路径和协议工作机制的清晰认知。