ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

BGP外部路由选择协议:边界信任、选路策略与排障实战

BGP外部路由选择协议:边界信任、选路策略与排障实战

1. 从一次外部前缀不通的排查说起

做网络运维的人对下面这个场景大概率不陌生:机房出口接了两条外部线路,内部跑着一套运转了两三年的内部路由协议,日常业务访问没问题,但某天早上监控突然告警,一批外部地址段访问超时,而内部跨网段通信完全正常。登上设备一看,内部邻居全是 Established 状态,路由表里也看不到异常,但外部前缀的那几条明细路由却凭空消失了。顺着看下去,问题出在一条外部路由选择协议的邻居会话上——它卡在 Active 状态,一直在重连,日志里滚动着连接被对端重置的记录。最后定位到是链路上中间设备做了会话老化,把长期空闲的长连接清掉了,而这条会话的保活周期配置得比老化时间还长。

这个故障很典型,它清楚地划出了一条界线:内部网关协议解决的是"我这一个网络内部怎么走",外部网关协议解决的是"我这一整个网络对外怎么走"。标题里的"网络层5"指的是网络层这一章节里的第五个主题,讲的就是后者——外部路由选择协议,实战中几乎等同于BGP(边界网关协议)。这篇内容适合三类人:刚学完 RIP、OSPF 想搞清楚 BGP 到底特殊在哪的在校生;正在做多出口、多线接入方案,需要落地配置的工程师;以及被路由黑洞、抖动、收敛慢折腾过,想要一套排查思路的老手。

我不会把它写成教科书的复述。下面所有内容围绕一个核心问题展开:当路由的传播跨越了信任边界,我们凭什么还能相信这条路由?BGP 的每一个设计——路径向量、AS 路径、选路属性、策略过滤——都是在回答这个问题。

2. 外部路由协议到底解决什么边界问题

2.1 内部协议的天花板在哪里

先把内部协议的极限说清楚,才能理解外部协议的必要性。OSPF 这类链路状态协议的底层假设是:所有路由器属于同一个管理域,跑同一套配置策略,愿意互相信任地交换拓扑信息。它要求区域内每台设备都维护一份一致的链路状态数据库,靠 SPF 算法算出最短路径树。这套模型在几百台设备、单一大区域里表现非常好,但它有三个天然的限制。

第一是规模。链路状态数据库的膨胀是平方级的,区域数量一多,泛洪、SPF 计算、数据库同步的开销都会咬人。虽然可以用多区域划分来缓解,但区域之间仍然要通过骨干区域做中转,一旦骨干区域本身出问题,整个域的收敛都会被拖下水。

第二是度量维度。SPF 用的是链路代价,这个数字只反映设备自己视角下的带宽或人为设定值,它不表达任何管理意图。你想让某类流量走便宜的线路,只能靠调代价、做策略路由这些间接手段,并且一旦拓扑变化,代价的设计可能瞬间失效。

第三、也是最关键的,是信任模型。内部协议默认邻居是可信任的,它会把学到的拓扑原样转发给邻居。你把两个管理上完全独立的网络用 OSPF 连起来,等于把两边的拓扑数据库合并了——对方内部的一次抖动会直接泛洪到你的网络里,对方配错一条路由你也会跟着抖。这种耦合在同一个组织内部可以接受,跨组织绝对不行。

2.2 自治系统:把"信不信"变成"边界在哪"

于是有了自治系统(AS)这个概念。它的定义并不玄乎:一组由同一个管理机构统一管理、对外呈现统一路由策略的网络集合。这个"统一"三个字是重点,意味着 AS 内部怎么折腾是自家的事,对外只输出一张经过整理的"可达性承诺表"。

AS 号在报文里用 2 字节还是 4 字节编码,早期是 16 位(1 到 65535,其中 64512 到 65534 留给私有场景使用),后来因为分配告急扩到了 4 字节。实际做实验或者内部演练时,用 65001、65002 这类私有 AS 号是最稳妥的,既能表达拓扑关系,又不会和外部真实编号冲突。

有了 AS 的划分,外部路由选择协议的任务就非常明确了:它不负责算出最短路径,它负责在两个 AS 之间交换"我这边有哪些前缀可达、经过哪些 AS 才能到我"这样的可达性信息。注意这两个目标完全不同。内部协议求最优,外部协议求可控——在跨域场景里,"最优"根本不存在统一标准,因为对方的链路代价、带宽、商业关系你根本不知道,也不该知道。

2.3 路径向量:为什么不用距离向量和链路状态

BGP 被称为路径向量协议。这个定位很有意思,它既不是距离向量(像 RIP 那样只报"距离多少跳"),也不是链路状态(像 OSPF 那样广播全拓扑),而是把整条经过的 AS 序列打包在路由里带过来。这个设计的价值在于两点。

一是防环。收到一条路由,如果发现 AS_PATH 里已经包含自己的 AS 号,直接丢弃。这比距离向量协议的"最大跳数"机制可靠得多,因为跳数限制是一种粗暴的截断,而 AS 路径检查是精确的、拓扑意义上的判断。跨域环境里环路一旦形成,用跳数根本拦不住,只有路径信息才能识别。

二是表达策略。AS_PATH 的长度天然反映了一条路由的"远近",运维可以直接基于它做偏好设置;更妙的是,因为路径是显式携带的,你还可以在路径上做标记、追加、过滤,这些都是纯距离向量协议做不到的。我在做多出口选路时,最常用的一招就是给某条链路增加一个 AS 号"垫"一下路径长度,让流量从别的出口走,改动小、生效快、回滚容易。

代价也很明显:BGP 的路由更新是全量前缀 + 属性的形式,一条更新报文能塞的信息有限,路由表一大,初始交换就要花时间;而且 BGP 只在建立连接时交换一次全量,之后靠增量更新,这意味着它的收敛速度天生比内部协议慢一个量级。这不是设计缺陷,是刻意的取舍——跨域路由的稳定性比快速收敛更重要,抖动带来的损失远大于收敛慢一点。

3. BGP 的会话建立与四类报文

3.1 四类报文分工明确,缺一不可

BGP 的报文类型只有四种,比起 OSPF 那一堆 LSA 类型要清爽得多。

报文类型作用关键字段出问题的典型表现
OPEN协商会话参数版本、本端 AS 号、Hold Time、Router ID、能力协商版本或 AS 号不匹配,直接断连
UPDATE发布或撤销路由withdrawn 前缀、路径属性、NLRI属性格式错误被判为错误,会话重置
KEEPALIVE维持会话仅报文头保活周期大于中间设备老化时间,会话被清
NOTIFICATION报错并关闭错误码、错误子码任何一次错误都直接拆会话,非常"刚烈"

这里有个容易被忽略的点:BGP 的所有报文都跑在 TCP 之上,端口 179。这个选择让它省掉了自己实现重传、排序、分片的麻烦,但也带来一个副作用——TCP 层的任何问题都会表现为"BGP 邻居起不来",而日志往往只告诉你连接被重置,看不出根因。我排查过的会话故障里,至少三成根子在 TCP 层,不在 BGP 本身。

3.2 邻居建立的六个状态

理解状态机是排查的基础。会话从 Idle 出发,经历 Connect、Active、OpenSent、OpenConfirm,最终到 Established。其中 Active 状态最容易被误解——它听起来像"正在活动",实际含义是"TCP 连接没建立成功,正在等待重试"。很多人看到 Active 就以为链路正常,其实恰恰相反。

# 通用 CLI 风格示意,用于观察邻居状态与原因 show bgp neighbors 203.0.113.2

看这条命令的输出,重点盯三个字段:State(当前状态)、Last reset reason(上次断开原因)、Received/Sent 计数。如果 Last reset 显示的是 "hold timer expired",那就去查保活报文是不是被中间设备丢了;如果显示 "connection reset by peer",去查对端是不是重启了,或者中间有没有会话老化策略。

3.3 一个最小可用的会话配置

下面用通用的伪 CLI 风格演示两台边界设备之间建 eBGP 会话的过程。地址全部取自文档保留段,避免误伤。

# 本端设备 A,AS 65001,互联地址 192.0.2.1 bgp 65001 router-id 192.0.2.1 peer 203.0.113.2 as-number 65002 peer 203.0.113.2 connect-interface 192.0.2.1 peer 203.0.113.2 ebgp-max-hop 2 # 非直连时才需要,直连场景配 1 即可 network 198.51.100.0 mask 255.255.255.0 # 对端设备 B,AS 65002,互联地址 203.0.113.2 bgp 65002 router-id 203.0.113.2 peer 192.0.2.1 as-number 65001 network 203.0.113.0 mask 255.255.255.0

配置本身很短,但有几个参数需要说明为什么这么设。Router ID 必须唯一,它参与选路决策的最后一层比较,重复了会出现路由震荡。connect-interface 显式指定是我养成的一个习惯,尤其在多地址接口上,如果靠默认行为去选源地址,一旦接口地址调整,会话就悄悄断了,排查时又得从头找。ebgp-max-hop默认是 1,意思是只接受直连邻居,这是安全设计——防止有人在远处伪造一个 BGP 报文跟你建会话。只有在做多跳 eBGP(比如两个 AS 之间隔着传输网络)时才需要放开,并且最好配合 TTL 安全、源地址校验等手段一起用,别图省事直接放开到 255。

注意:eBGP 会话的默认跳数限制是一种廉价的防伪机制,放开它等于放开了会话的身份校验。真要做多跳,优先考虑直连或者引一条专用互联,别把安全边界拆了。

4. eBGP 与 iBGP:一字之差,模型完全不同

4.1 eBGP 负责交换,iBGP 负责贯穿

这两个概念新手最容易混。eBGP 是跨 AS 的会话,iBGP 是同一个 AS 内部的 BGP 会话。它们用的协议一样,报文格式一样,但行为差异巨大,原因是它们处在不同的位置。

eBGP 邻居之间通常直连,学到的路由在通告出去时会做两件事:把 NEXT_HOP 改成自己(这样对端知道下一步该发给自己),把 AS_PATH 加上自己的 AS 号(这样全网都能看到路径)。这套机制的设计意图是让边界设备承担"翻译"的职责,把外部信息整理后转交给内部。

iBGP 就不一样了。同一 AS 内的 iBGP 邻居之间,学到的外部路由默认不会转发给其他 iBGP 邻居,这就是著名的"水平分割"规则。原因在于 AS 内部本身是连通的,如果 iBGP 像普通路由协议那样泛洪,就得靠 AS_PATH 防环,但内部路由的 AS_PATH 里没有本 AS 号,环无法检测。所以干脆规定:iBGP 学到的路由只能自己用,不能传给别人。

这条规则直接导致一个部署难题:如果有 N 台边界设备都跑 iBGP,要让路由两两互通,就得建 N×(N-1)/2 条会话,设备数量一多就是灾难。这就是所谓的全互联问题。

4.2 两种解法:反射器与联邦

实际部署里有两种成熟做法。**路由反射器(Route Reflector)**是主流方案:指定一台或几台设备作为反射器,其他设备只跟它建会话,反射器负责把从一台客户机学到的路由反射给其他客户机。它打破了水平分割规则,但需要在反射器上维护集群 ID 来防环,逻辑上相当于把"两两对话"变成"开会由主持人转达"。优点是配置改动小、扩展性好;缺点是反射器本身成了关键节点,它挂掉的话整个 iBGP 域的路由更新都会受影响,所以通常部署成冗余的集群。

**联邦(Confederation)**是另一种思路:把一个大 AS 拆成若干子 AS,子 AS 之间跑类似 eBGP 的会话,对外看还是一个整体。它的优势是拓扑分治更彻底,适合超大规模网络;劣势是配置复杂、跨子 AS 的路由属性传递有细节差异,运维成本高。我的经验是:中小规模优先反射器,反射器层级不要超过两级,层级一深,路由收敛和排障的复杂度呈指数上升。

对比项eBGPiBGP
邻居位置跨 AS同 AS 内
默认跳数限制1(仅直连)不限
NEXT_HOP通告时改为自己默认保持不变
AS_PATH追加本 AS 号不追加
路由转发正常向邻居通告默认不转发(水平分割)
防环依靠AS_PATH集群 ID / 全互联

4.3 下一跳问题的实战处理

iBGP 里 NEXT_HOP 不变这个特性,会引出一个高频故障。假设边界设备从外部学到一条路由,下一跳是外部对端地址,它通过 iBGP 传给内部另一台设备;这台内部设备一看下一跳,发现这个地址在自己这边根本没有对应的路由(因为它是外部地址,内部路由表里查不到),于是这条路由虽然进来了,却因为下一跳不可达而无法参与转发,路由表里会显示为无效状态。

解决办法是在边界设备上把下一跳改为自己:

# 在本端所有 iBGP 邻居上执行 peer 198.51.100.10 next-hop-local

提示:这条命令几乎是做 iBGP 部署时的默认动作,但要注意时机——它只影响你发出的路由,不影响你收到的。如果收到方向也有同样的问题,得让对端去改。

5. 路径属性与选路:BGP 最考验经验的部分

5.1 四个必须掌握的属性

BGP 的属性有十几种,但日常打交道最多的就是下面四个。理解它们的关键在于搞清楚"传播范围"和"优先级"这两个维度。

AS_PATH:记录了路由经过的 AS 序列,主要作用是防环和度量路径长度。你在外部通告路由时它会自动追加,做策略时可以用正则匹配来过滤或偏好特定的路径。它的传播范围是全局的,谁都看得到。

NEXT_HOP:下一跳地址。这个属性最容易出问题,前面说过 eBGP 会改、iBGP 不改,导致下一跳不可达。它的传播范围跟会话类型绑定。

LOCAL_PREF(本地优先级):只在 iBGP 内部传播,绝不出 AS。它的作用是告诉本 AS 的所有设备"我更偏好哪条出口",值越大越优先。这是做出口流量的主力工具——你想让主线路优先,就在主出口的入方向把 LOCAL_PREF 调到 200,备份线路保持 100。因为不出 AS,所以完全可控,是内部策略的首选。

MED(多出口鉴别器):会传递给 eBGP 邻居,用来暗示对方"你从我这个口进来更合适"。注意它是"建议"不是"命令",对端完全可以忽略。在实际网络中 MED 经常被吐槽,因为不同设备对它的比较规则、默认值处理都有细微差异,跨厂商对接时尤其容易出岔子。

还有一个本地属性叫Weight,只在单台设备上有效,优先级最高,适合做设备本地的临时偏好调整,不往外传播。

5.2 选路顺序不能背,要理解

很多人死记硬背那个十几步的选路顺序,背完就忘。我的建议是记前六步,因为实际网络中 99% 的选路决策在前六步里就已经分出胜负了,后面几步基本是兜底。

  1. Weight 最大(本地私有,仅本机有效)
  2. LOCAL_PREF 最大(AS 内部全局有效)
  3. 本地始发的路由优先(手工 network 或 redistribute 出来的)
  4. AS_PATH 最短
  5. ORIGIN 类型最优(IGP < EGP < Incomplete)
  6. MED 最小
  7. eBGP 路由优先于 iBGP 路由
  8. 到下一跳的 IGP 度量最小
  9. Router ID 最小(集群内则比较集群列表长度)

理解这条链的设计逻辑会很通透:越靠前的属性,人为可控性越强;越靠后的属性,越接近客观事实。Weight 和 LOCAL_PREF 是你完全说了算的,所以放最前面;AS_PATH 和 MED 涉及外部信息,只能作为参考;Router ID 是最后的强行裁决,纯粹为了保证唯一性,没有任何业务含义。

实操心得:如果你发现两条路由的选路结果和预期不一致,别急着怀疑配置,先按上面顺序从第 1 步开始逐项比对。我遇到过好几次是"本地始发优先"这一条在起作用——因为对方把明细路由也手工通告了一遍,结果本地那条更"亲",压过了 AS_PATH 更短的。

5.3 策略过滤:把信任变成可执行的规则

BGP 最强大的地方就是策略。你不仅可以选择走哪条路,还能决定收什么、发什么、怎么改。常见的操作有三类:

前缀过滤。只接收你预期内的前缀,其他一律丢弃,防止对端误配导致的路由泄漏。这是最基础也最有效的防护。

# 允许接收 198.51.100.0/24 及其更明细,其余丢弃 ip prefix-list FROM-PEER permit 198.51.100.0/24 le 32 ip prefix-list FROM-PEER deny 0.0.0.0/0 le 32

AS_PATH 过滤。拒绝路径里含有私有 AS 号或保留 AS 号的路由,防止内部演练用的编号泄漏到外部,也防止有人伪造路径。

属性改写。在入方向或出方向修改 LOCAL_PREF、MED、Community,实现流量调度。Community 这个属性特别适合做标签化运营——给一批路由打上同一个 Community 值,下游设备看到这个值就执行统一的策略,改策略时只需改一处,不用一条条动前缀。

这里必须强调一条铁律:入方向过滤比出方向重要得多。出方向你只能控制自己发什么,对端可以不信;入方向才是真正的防线,因为它决定了什么能把你的路由表污染掉。我见过的事故里,最严重的一次就是入方向没做任何过滤,对端把一条默认路由误通告过来,本端瞬间把它当成最优路径,全网流量被吸到一条小带宽线路上,直到十分钟后才被人发现。

6. 收敛、聚合与那些绕不开的坑

6.1 为什么 BGP 天生慢半拍

BGP 的收敛慢是结构性的。第一,它的更新是增量 + 路径属性的模式,报文大、处理重;第二,它有 **MRAI(最小路由通告间隔)**的机制,同一前缀的更新不会立刻发出,而是攒一段时间再发,默认 30 秒左右,这是为了抑制抖动;第三,跨 AS 的路径变化需要逐跳传播,几跳下来就是分钟级。

这个"慢"其实是刻意的设计。跨域链路的频繁抖动如果被即时传播,会导致整个外部路由表剧烈震荡,损失远大于晚收敛几十秒。所以优化方向不是"让它快",而是"让它稳"。具体做法包括:对重要前缀配置更短的 MRAI,对抖动频繁的前缀做抑制(dampening),以及在边界设备上保证足够的 CPU 和内存余量。

6.2 路由聚合:把明细收起来

聚合的本质是用一条汇总路由代表一组明细,减少对外通告的条目数。这在多出口场景里是刚需,否则你的外部邻居会收到成百上千条明细。

# 将 198.51.100.0/24 与 198.51.101.0/24 汇总为 198.51.100.0/23 aggregate-address 198.51.100.0 255.255.254.0 summary-only

summary-only的作用是只发汇总、不发明细。这里有个必须注意的坑:聚合之后,AS_PATH 的防环能力会被削弱,因为汇总路由的 AS_PATH 属性会丢失部分原始路径信息。所以很多设备会自动把原始路径的 AS 号塞进一个叫 AS_SET 的字段里,路径长度按 1 计算但保留记录。如果你的选路逻辑依赖 AS_PATH 长度,聚合之后的行为可能和你想的不一样,务必在变更前做验证。

另一个坑是聚合路由的下一跳和属性继承。汇总路由并不总是拿到所有明细里最优的那套属性,不同设备实现有差异,跨厂商对接时尤其要小心。我的习惯是:聚合上线前先在测试环境把属性打印出来逐项比对,确认和预期一致再推生产。

6.3 路由黑洞与抖动

黑洞是外部路由里最讨厌的现象:路由在,但流量进去出不来。成因通常有三种。一是下一跳不可达,前面讲过 iBGP 场景的典型故障;二是单向通告,A 告诉了 B 我能到某前缀,但 B 的回程路径没配,于是应答包全丢;三是聚合过度,汇总路由覆盖了实际不存在的地址空间,流量被吸进设备后无处可去。

第一种靠 next-hop-local 解决,第二种靠双向检查,第三种要么做更细的聚合边界规划,要么在边界设备上配置指向 null 接口的兜底路由,把无法匹配的流量明确丢弃并计数,便于定位。

抖动则是另一类问题。某条前缀频繁地 up/down,会导致整个外部路由表跟着刷。抑制的方法是对该前缀配置惩罚机制:每次撤销就加罚分,罚分超过阈值就暂时不接收,随着时间衰减。这套机制的核心参数是抑制阈值、重用阈值、半衰期,配置时不要照搬默认值,要根据这条前缀的实际稳定程度调。稳定链路配得太激进,一次正常的短暂中断就会让它沉默很久,反而更糟。

# 抑制参数示意:惩罚值 2000 抑制,750 恢复,半衰期 15 分钟 bgp dampening 15 750 2000 60

7. 常见问题排查与速查表

7.1 邻居起不来怎么查

排查要按层次来,别一上来就看 BGP 配置。我的顺序是:物理层 → IP 层 → TCP 层 → BGP 层。

物理层看接口状态、光功率、错包计数。IP 层看两端地址是否同网段(如果是直连)、能不能互相 ping 通、路由是否对称。TCP 层是重灾区,重点看 179 端口通不通、中间设备有没有做会话限制或老化、MTU 是否一致导致大报文被丢。最后才是 BGP 层,看 AS 号对不对、Router ID 有没有冲突、认证密码是否一致、版本是否匹配。

# 逐层验证的示意 ping 203.0.113.2 source 192.0.2.1 telnet 203.0.113.2 179 # 能连上说明 TCP 通,但会占用一次会话 show tcp brief | include 179 # 观察是否有半开连接堆积

注意:用 telnet 测 179 端口会真正建立一个 TCP 连接,可能干扰正常的 BGP 会话(部分实现会把这次连接当成异常并重置会话)。测试完记得确认邻居状态恢复正常,或者干脆用更温和的探测方式。

7.2 路由收到了但不通

这种"看得见摸不着"的问题最考验基本功。第一步看路由表里的状态标记,无效路由通常有明确的标记(比如下一跳不可达、被策略拒绝)。第二步看 FIB 里到底有没有下发,有些设备路由表里有、转发表里没有,说明是下一跳解析失败。第三步做逐跳的转发路径验证,从本端到目的,每一跳都确认有没有对应路由。

还有一个高频误区:路由存在不等于转发正常。防火墙、策略路由、NAT、ACL 都可能在中途把流量掐掉,而 BGP 对此一无所知。我一般会先用带源地址的探测工具确认路径通不通,再去查策略。

7.3 速查表

现象最可能的原因快速验证处理方向
邻居停在 ActiveTCP 连接被拒或被中间设备阻断查 TCP 179 连通性、查中间老化策略放通端口、调整保活周期
邻居停在 OpenSentAS 号或版本不匹配核对两端 AS 配置修正配置后重置会话
会话频繁重置保活超时或 MTU 不一致查 hold timer、查分片情况调整定时器、统一 MTU
路由表有但转发丢失下一跳不可达查下一跳地址是否有对应路由配置 next-hop-local 或补路由
流量单向不通只有单边通告双向检查路由表补齐回程通告
选路不符合预期前面步骤的优先属性生效按选路顺序逐项比对调整 LOCAL_PREF 或 Weight
收敛异常慢抖动抑制或被策略拦截查抑制状态、查过滤计数调整抑制参数、检查前缀列表
前缀被意外吸收聚合边界覆盖过大展开汇总覆盖范围核对收窄聚合前缀或加明细

7.4 几条踩过坑才记住的经验

第一,变更前后一定要存快照。路由表、邻居状态、配置全文,改之前存一份,改之后存一份,出问题能立刻对比差异。BGP 的配置往往是"一行注释决定生死",靠脑子记是不可靠的。

第二,重置会话要挑时机。BGP 的很多参数改动必须重置会话才生效,而重置意味着全量重收敛,可能中断几十秒到几分钟。养成在维护窗口做变更的习惯,别在业务高峰动。

第三,写策略要留"拒绝所有"的显式兜底。前缀列表如果只写 permit 不写 deny,默认行为在不同实现里有差异,容易漏网。显式加一条拒绝全部,虽然多一行,但把不确定性变成了确定性。

第四,谨慎使用默认路由。一条误通告的默认路由能把整个网络的流量吸走,这在外部路由场景里是最高危的操作。入方向对 0.0.0.0/0 做严格校验,除非你非常确定自己在做什么。

8. 我个人的一点理解

这套协议用了这么多年,我最大的感受是:BGP 与其说是路由协议,不如说是一门关于"表达"的语言。内部协议关心的是"怎么走最快",而 BGP 关心的是"我怎么把我的可达性说清楚,同时只相信我愿意相信的那部分"。它的所有设计——路径不要度量、策略压倒最优、收敛让位于稳定——都在服务这个目标。

所以学它的正确姿势不是背命令,而是先想清楚三个问题:我这个网络对外要承诺什么?我接受外部承诺的边界在哪?当承诺失效时,我的兜底是什么?这三个问题答清楚了,配置只是把答案翻译成命令而已。我在做任何多出口方案之前,都会先把这三行写下来贴在屏幕边上,改动的时候反复对照,比看任何文档都管用。

最后分享一个日常维护的小习惯:给每一条入方向策略都配上匹配计数,定期看哪些规则在命中、哪些从来没命中过。那些长期零命中的拒绝规则,要么是白写的(因为根本没有这类流量),要么是关键防护(因为被拦住了所以看不到),你得自己去分辨。分辨的办法很简单,临时放行一下看有没有异常流量进来,风险可控的话,这个动作能帮你清理掉大量无效配置,也能让你重新认识这张路由表到底是谁在往里灌东西。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进