S33

OSPF 与 BGP

点击正文段落选定收藏或划线位置;未选定时使用屏幕内第一段。

课内目录

服务器执行 curl 时,应用进程并不知道数据会经过哪些自治系统。它把数据交给网络栈,主机查路由表,把包送向下一跳。机房内部怎样找到出口,出口之间怎样交换可达信息,则由网络设备上的路由协议与管理员策略共同决定。本课把观察位置放在 Linux 主机、运行路由进程的节点和出口之间,回答“路由从哪里来、为什么选它、出错时看什么”。

1 域内与域间路由的分工

先把“能转发”与“能学习路线”分开。Linux 主机可以只配置默认路由,不运行任何动态路由协议。例如 ip route show 显示 default via 192.0.2.1 dev eth0,意思是未被更具体路由覆盖的目标交给这个下一跳。下一跳需要在相应链路上可达;这条配置没有承诺远端网站在线,也没有说明后续经过的网络。主机把责任交给网关,网关还需要自己的转发表。

网络管理员通常把同属某个管理范围的路由问题称为域内路由,把不同自治系统之间的可达信息交换称为域间路由。自治系统以 AS 号标识,往往代表具有统一路由政策的网络。这里的“域”不是 DNS 域名,也不等于某个机房。某组织可以管理多个站点与多条出口,并把它们纳入自己的自治系统。边界首先表达管理与政策,而不只是地理位置。

OSPF 是常见的域内路由协议。它帮助内部路由器了解拓扑,并依据配置的开销计算路径。BGP 常用于自治系统之间交换路由,重点是“这个前缀可以从哪里到达,以及我是否愿意采用、传播它”。BGP 也可以在同属某个 AS 的设备间运行。因此不能把 OSPF 简化成“机房协议”,把 BGP 简化成“公网协议”;应先看它承担的职责。

内部路径、出口策略与主机转发的关系
内部路径、出口策略与主机转发的关系

假设运维主机位于 AS 65010,内部有 R1、R2 和出口 E1、E2。OSPF 可以让 R1 知道怎样到达 E1 的内部地址;BGP 可以让出口学习实验目标 203.0.113.0/24 的可达路径。选中的 BGP 路由还需要可达的下一跳,并满足安装条件,才能参与实际转发。拥有某条协议通告,与内核已经能按它发送数据,是不同的检查点。

控制面负责学习、计算和选择路由,数据面按已安装的转发表转发包。在 Linux 路由节点上,路由软件通常以用户态进程运行,把选中的路由交给内核。进程停止后,邻居可能撤销通告,本机旧路由是否暂时保留则取决于具体机制与配置。普通应用仍可能继续运行,所以“服务进程存活”不足以证明网络路径正常。本课使用文档示例地址与私有 AS 号描述隔离实验,不应把示例通告到真实互联网。

2 OSPF 区域与邻居直觉

把 OSPF 想成内部路由器共同维护的道路地图。每台路由器发布与自身相关的链路信息,相关范围内的设备获得足够一致的地图,再以自己为起点计算路径。它不是把所有应用请求逐个询问邻居后再决定出口。地图变化会触发更新和重新计算,而已经进入数据面的包仍依照当时的转发表前进。故障检测、信息传播与路由安装都需要时间。

邻居是形成这张地图的起点。接口启用 OSPF 后,设备通过 Hello 等报文发现链路上的对端,并检查关键参数能否匹配。需要关注接口是否启用、地址与链路是否正确、区域号是否相符、相关计时与认证是否兼容。防火墙也可能阻断 OSPF 使用的 IP 协议号 89;它不是 TCP 的 89 端口,不能用测试某个 TCP 端口的方法证明它畅通。

区域用于限制拓扑信息传播和计算的范围,区域 0 承担骨干角色。入门阶段可以先采用单区域实验,观察邻居建立和故障后的变化,再理解区域边界如何交换汇总的可达信息。不要认为区域越多就越可靠。区域划分会增加边界设计与排查成本,随意把同条链路两端放入不同区域,往往会直接破坏邻接建立。复杂区域类型留到后续专题。

邻居列表出现地址,不代表所有同步都已完成。运行 FRRouting 的实验节点可以执行 vtysh -c 'show ip ospf neighbor',结合 vtysh -c 'show ip ospf interface' 检查接口与状态。点到点链路上通常期望看到完成同步的状态;共享网络上部分邻居保持 2-Way 可能是正常角色关系,不能机械地把所有非 Full 状态当作故障。先核对网络类型,再解释状态。

OSPF 的“短”通常表示累计开销较小,而不是地理距离近、时延低或空闲带宽大。开销来自接口配置或按参考带宽计算的值,具体默认规则依实现而定。若管理员给某条慢链路设置了很低的开销,协议可能稳定地选中它。协议忠实执行输入,输入是否符合业务意图仍需要人判断。等开销情况下还可能出现多路径,观察时不能预设所有流量只走同条链路。

实验中可先记录邻居、协议路由和内核路由,再在隔离环境关闭某条冗余链路,观察替代路径出现的过程。ip -br link 提供接口状态,ip route show 提供内核中的路由,路由软件命令提供协议视角。若邻居已恢复而应用仍失败,应继续查路由是否安装、下一跳是否可达以及返回路径。不要通过不断重启路由进程代替记录状态,否则容易把真正的故障条件抹掉。

3 BGP 会话与路径属性

BGP 的直接交流对象称为对等体。常见会话通过 TCP 179 建立,双方交换可达前缀、路径属性与撤销消息。会话进入 Established 说明它已能交换 BGP 消息,但接收策略可能拒绝所有路由,发布策略也可能没有允许任何前缀。因此检查必须继续推进到“收到什么、接受什么、选择什么、安装什么”。仅凭 TCP 连通或会话绿色图标,无法确认业务可达。

不同 AS 之间的会话通常称为 eBGP,同个 AS 内的会话通常称为 iBGP。本课只使用这些名称理解管理关系,不展开内部传播规则。建立会话时,双方配置的对等地址、AS 号、源地址以及网络可达性需要相互吻合。若会话长时间停留在连接相关状态,应先检查基础 IP 路径、ACL 和对等配置,而不是直接修改路径属性来“提高优先级”。

BGP 通告以 IP 前缀为对象。例如 203.0.113.0/24 描述目标地址范围,不能解释成远端某个进程的健康证明。路径属性帮助设备在多条候选路线间实施策略。NEXT_HOP 表达后续转发所依赖的下一跳;AS_PATH 记录经过的 AS 路径信息,并参与环路检查和选择;LOCAL_PREF 常用于本 AS 内表达对出口的偏好,通常数值较高者更优先。

这里的“更优先”需要放入选择流程理解。LOCAL_PREF 常先于 AS_PATH 长度参与比较,所以管理员可以让较长的 AS 路径胜出。AS_PATH 较短也不能保证时延较小,因为 AS 号不是链路长度或拥塞指标。MED 等其他属性与比较条件确实存在,但入门排查无需背完整排序。面对真实设备,应查看它给出的选路原因、配置及实现文档,避免套用不完整的口诀。

从会话接收到内核转发的检查点
从会话接收到内核转发的检查点

路径有效还依赖下一跳可达。路由节点可能已经收到通告,却无法解析 NEXT_HOP 到任何可用的内部路线。此时应检查内部路由和出口地址,而不是只看外部前缀本身。OSPF 与 BGP 在这里相互衔接:内部协议提供抵达内部节点的道路,BGP 提供目标前缀与政策候选。具体下一跳处理随会话和配置而变,不能假设每次收到通告都会自动改成对等体地址。

路由进程的协议表、软件选中的最佳路由和内核转发表应分别观察。FRRouting 可用 vtysh -c 'show bgp ipv4 unicast summary' 查看会话概要,再针对目标查看 show bgp ipv4 unicast 203.0.113.0/24。这些命令需要在实际运行路由软件的节点上执行。普通服务器没有安装 vtysh 很正常,不要为了查看默认网关而临时部署动态路由进程。

4 动手:读一张简化的 BGP 路径

下面是教学化的候选路径表,不是任何设备的原始输出。假设它们都通过接收过滤,NEXT_HOP 都可达,没有额外配置改变本例的比较关系。目标前缀相同,因此可以先比较它们的属性。真实输出还会显示有效性、最佳标志和其他字段;看表前必须读清列名,不能把 AS_PATH 中出现的数字误当成开销。

候选目标前缀NEXT_HOPLOCAL_PREFAS_PATH
A203.0.113.0/24192.0.2.920065020 65040
B203.0.113.0/24192.0.2.1310065030

在这个简化条件下,A 的 LOCAL_PREF 更高,所以选择 A,即使它的 AS_PATH 包含更多 AS。这个结果可能正是管理员期望的,例如 E1 是主要出口而 E2 用作备用。若两者 LOCAL_PREF 相同,才有必要继续比较后续条件;不能跳过前面的属性,直接宣称 B “经过更少网络,所以一定胜出”。这里也没有任何时延测量,不能据此给 A 或 B 标注毫秒数。

先在路由节点确认候选与选中结果,再到业务主机查询实际转发。ip route get 203.0.113.10 会按当前规则解析目标路由,通常展示下一跳、接口与选用的源地址。它不会真正发送业务请求。若主机存在源地址相关规则,可用 ip route get 203.0.113.10 from 192.0.2.20 模拟指定源地址的查询,同时查看 ip rule show。源地址必须符合所检查节点的实际配置。

接着执行 ping -c 3 203.0.113.10 或 tracepath 203.0.113.10,把结果当作补充证据。目标可能拒绝 ICMP,中间节点也可能限制响应;路径探测中的星号并不能单独证明中间设备丢弃业务包。若业务是 HTTPS,可以对自己控制的测试端点使用 curl --connect-timeout 3 --max-time 8 -I https://probe.example.net,并同时记录解析出的目标地址,以免 DNS 变化使比较对象不同。

主机、路由进程与出口的观测位置
主机、路由进程与出口的观测位置

记录时应写清时间、节点、网络命名空间、源地址、目标地址和协议。容器内的 ip route 可能只展示容器自己的路由,宿主机出口策略在另个位置。若有权限,可以通过已知进程 PID 使用 nsenter -t 1234 -n ip route get 203.0.113.10 检查对应网络命名空间,PID 需替换为真实值。把不同观察位置的输出混在同段记录中,会制造看似矛盾的证据。

5 汇聚、过滤与策略路由

汇聚是用较大的前缀表达多个相邻地址块。例如 10.20.0.0/24 与 10.20.1.0/24 可以被 10.20.0.0/23 覆盖。好处是减少对外暴露的路由条目,并让局部变化不必总向更大范围传播。代价是细节被隐藏:若其中某段不可达,外部仍可能因汇总通告把流量送进来。发布汇总前,需要确认覆盖范围、内部可达性和缺失网段的处理方式。

转发遵循最长前缀匹配。若同时存在 /23 和覆盖其中部分目标的 /24,落在该 /24 内的包通常先匹配更具体路由。这与“同个前缀的 BGP 候选如何选优”是不同的问题。不能拿某条 /23 的高 LOCAL_PREF 去压过独立存在的 /24。排查流量为何改道时,应先找目标实际命中的前缀,再研究这个前缀的候选属性。

例如出口仍发布 10.20.0.0/23,但 OSPF 已撤销内部 10.20.1.0/24。若出口只剩指回上游的默认路由,发往缺失网段的包可能被送回上游,再因汇总路由返回出口,形成环路直到 TTL 耗尽。为汇总范围配置丢弃路由,可让没有更具体内部路由的包在出口终止;正常网段仍由更具体路由转发。丢弃只能限制环路,不能恢复故障网段。实验应分别查询两个 /24 内的目标,并核对汇总的发布条件,确认局部故障时是保留汇总还是撤销通告。

过滤决定哪些通告允许进入或离开。入方向过滤限制接收范围,出方向过滤限制向对等体发布的范围。常见做法是明确允许自己的前缀、约束可接受的前缀长度,并设置合理的接收数量上限。数量上限是异常保护,不能替代前缀内容校验。规则还应明确默认行为;若所有条件都未匹配,最终是拒绝还是允许,直接决定策略边界是否存在。

“路由策略”与主机上的“策略路由”需要区分。前者常指修改或过滤路由通告,例如按邻居设置 LOCAL_PREF。Linux 策略路由则可依据源地址等条件选择不同路由表,相关入口是 ip rule show 与 ip route show table 100。它们都能改变路径,但作用位置不同。主机选择了特殊表时,即使网络出口的 BGP 没变,应用也可能走另条链路。

因此没有脱离目标的“最强汇聚”。前缀越粗,表项可能越少,外部越难看到局部故障;前缀越细,表达更准确,策略和维护负担也随之增加。滑块用固定实验地址块展示这个取舍,不模拟公网路由规模。实际方案要同时说明地址边界、失败时的可达性和允许发布的清单。调整汇聚后,检查外部看到的前缀集合以及内部各网段的业务探测结果,不能只确认表项减少。

6 常见坑:把 BGP 当「自动最优」

BGP 执行可达信息与策略选择,并不会持续替应用寻找最低时延路径。它通常不知道某条链路的即时排队、丢包或单位流量费用,也不了解进程正在做文件同步还是交互登录。把 LOCAL_PREF 从 100 改成 200,表达的是更强的政策偏好;它不是把链路速率翻倍。若目标是降低时延,必须先定义测量端点与业务指标,再判断政策是否实现了目标。

第 2 个常见误判是“会话正常,所以路由正常”。Established 之后还可能存在前缀被过滤、下一跳不可达、路由未选中、内核未安装等情况。相反,会话短暂中断也不意味着所有应用立刻失败,已有替代路径或特定保留机制可能影响表现。排查时要按证据推进,避免凭单个状态推断全链路。恢复也要观察路径与业务,而不只是等待会话指示恢复。

第 3 个误判是“出得去就回得来”。去程可能走 E1,回程可能经 E2,这种不对称路径并非天然错误。但若路径上有状态防火墙,或源地址验证与 NAT 对状态位置存在要求,回程漂移就可能造成连接失败。排查时要记录实际源地址、回包入口以及相关状态。不能看到单向抓包有发送数据,就判断对端应用故障,也不能要求所有网络必须天然对称。

第 4 个误判是“改本地偏好,就能控制远端怎么来”。LOCAL_PREF 主要影响本 AS 的出口选择,并不直接要求其他 AS 按本方愿望选入口。对外发布内容与路径属性可能影响对方判断,但最终受对方政策约束。入门变更单应明确讨论去程还是回程、由谁控制哪段决策。含糊地写“切换到备用运营路径”,很容易让参与者对方向产生不同理解。

还有种操作陷阱是同时改邻居、过滤、属性和主机规则。故障出现后,任何观察都可能对应多个变量,难以判断因果。应先留存基线,让变更范围尽量集中,再按预先约定的探测集合验证。不要把清空所有 BGP 会话当作通用修复手段;它会影响无关前缀,并让原本可用的路径进入重新学习过程。命令执行成功只说明配置被接受,不代表政策符合意图。

7 案例:策略错误导致的流量漂移

某实验网络的 Linux 文件同步节点定期向外部备份端点上传数据。正常情况下,目标 203.0.113.0/24 经 E1,E2 保留作备用。内部 OSPF 邻居稳定,E1、E2 的 BGP 会话均为 Established。某次出口策略维护后,同步进程仍在运行,TCP 连接也能建立,但持续传输明显变慢。接口监控显示 E2 出方向流量上升,E1 同时下降。

值班人员先记录时间和进程 PID,检查进程所在网络命名空间中的 ip route get,确认主机仍把包交给原网关。ip -s link show dev eth0 没有显示新增的明显接口错误,但这不能排除下游拥塞。随后在出口查看目标前缀,发现 A 路径 LOCAL_PREF 为 100,B 路径变成 250。原本只想提高某个测试前缀偏好的策略,匹配范围误写为更大的允许集合。

这条证据链将问题定位到政策变化:BGP 按新属性选中了 E2,内部网络又正常把流量送到该出口。E2 的可用带宽较小,备份传输因此受到影响。这里“邻居正常”和“业务变慢”可以同时成立,不存在矛盾。修复重点是收紧匹配条件并恢复目标前缀原有偏好,同时检查是否还有其他前缀被同条规则影响,避免只盯住最先报警的业务。

从业务异常回溯到策略差异
从业务异常回溯到策略差异

执行修复前,操作者对比变更前的配置快照、当前策略及目标前缀属性,确认回退不会删除必要的其他维护内容。然后仅回退错误规则,按所用路由软件支持的方式重新应用策略。是否需要路由刷新、软重评估或会话重建,取决于实现与双方能力;本课不提供可直接复制到生产的重置命令。不要为了让所有输出“立刻一样”而扩大操作范围。

恢复判断包括目标前缀回到预期出口、NEXT_HOP 可达、内核路由正确,以及文件同步吞吐与错误率回到基线。既有连接的表现还可能受状态设备和流量分担影响,所以需要同时观测新建连接和实际传输。事件记录最后写成“策略匹配范围过宽导致出口偏好改变”,并附受影响前缀、配置差异与恢复证据。写“BGP 自动选错路”会掩盖真正需要修复的政策表达。

8 把路由策略写进网络变更单

路由变更首先要写清目的与方向。比如“让备份节点访问 203.0.113.0/24 优先经 E1,并在 E1 路径撤销后采用 E2”。这比“优化 BGP”更容易验证。接着注明涉及的 AS、设备、地址族、对等体和前缀范围。地址族用于区分 IPv4、IPv6 等路由信息;本课实验只覆盖 IPv4,不能把验证结果直接延伸到未测试的 IPv6 路径。

变更前留存可比较的证据:会话摘要、目标前缀全部候选、当前最佳路径、下一跳可达性、内核路由及业务探测。配置快照要保存在有权限控制的目录,避免把认证信息复制进公开工单。可以用 date -Is 给记录加上时间,用 shell 重定向保存只读命令输出。保存路径、命令退出码与执行节点都要可追溯,失败的命令不能被当作“没有异常”的空结果。

策略描述应能回答“匹配什么、执行什么、未匹配时怎么办”。例如仅接受对端约定的前缀集合,对选定集合设置本地偏好,其他条目沿用原有规则或明确拒绝。还要说明规则顺序、前缀长度边界和汇聚覆盖范围。工单可用教学化伪规则交流意图,但正式配置必须按实际实现审阅;不同软件的匹配组合与默认行为可能不同,不能照搬相似命令名称。

验证集合应包含目标前缀、相邻但不应受影响的前缀,以及备用路径撤销时的预期。测试不仅比较最佳标志,还比较实际出口与业务结果。生产环境是否做故障注入,应由维护窗口和业务授权决定;入门实验可以在隔离网络演练链路关闭与恢复。恢复耗时要从事件发生记录到业务恢复,不能只从最后执行命令的时刻开始计算,从而漏掉检测与收敛阶段。

回退条件应在执行前具体化:例如目标路由消失、出现未经允许的外发前缀、关键探测连续失败,或非目标流量大幅偏离基线。阈值与观察窗口按实际业务约定,不能凭教材虚构通用秒数。指定负责人、配置快照位置和回退步骤,并保留管理连接中断时的接入办法。变更结束后核对最终配置与记录一致,防止临时修复只存在于运行状态而没有持久保存。

9 从路由协议走向交换进阶(S34)

OSPF 与 BGP 讨论的是到目标 IP 前缀的路径,但包要先抵达当前链路上的下一跳。Linux 主机即使拥有正确默认路由,也可能因接口接错、交换端口所属网络不符或邻居解析失败而发不出包。此时远端路由属性再合理也无济于事。应把“路由表告诉我交给谁”与“当前链路能否把帧交给它”连接起来,形成连续的观察路线。

可以从 ip -br addr 核对接口和地址,再看 ip route get 的出口与下一跳,接着用 ip neigh show dev eth0 观察 IPv4 邻居解析结果。若对应下一跳长期处于 INCOMPLETE 或 FAILED,应优先确认链路、网段与网关,相关状态是线索而非最终定论。不要马上去提高 BGP 偏好,也不要通过把所有交换端口放入相同网络来绕过问题,这会改变原有隔离边界。

交换侧的边界会影响路由邻居能否相遇。若 OSPF 本应在相连接口上建立邻接,而底层网络把双方隔开,表面上看到的是协议超时,根因却可能位于交换配置。反过来,BGP 对等体可通过多跳 IP 路径建立会话,未必处于相同广播范围。排查先画清实际连接关系,标注物理接口、逻辑接口、IP 地址和对等地址,避免把“有根网线连接”当作完整拓扑。

S34 将进一步讨论交换网络如何划分连接范围,以及冗余连接为什么需要额外约束。本课只保留接口、邻居解析与路由之间的衔接,不展开交换环路机制。继续学习时,可以沿用当前案例:若出口政策没有变化,为什么换了交换端口后,主机突然连不到默认网关?先证明包能到达下一跳,再检查更远的路径,这种顺序同样适用于服务器、容器宿主机和网络设备。

读完本课,应能分别说明 OSPF 的内部拓扑职责、BGP 的前缀与政策职责,以及主机内核的转发职责。还应能从目标 IP 出发,找到实际命中的前缀,解释候选属性,检查下一跳与安装结果,并回到真实业务验证。遇到复杂内部机制时,先保留问题边界与证据,再查相应专题;不需要为了理解本次出口漂移而背完所有协议状态机。

放进方案里

在文件备份网络方案中,先写可验证的业务要求:备份节点访问约定目标前缀时优先使用 E1,E1 路径失效后允许使用 E2,并用实际文件传输检查恢复情况。标出节点所在网络、默认网关、内部路由范围和出口 AS,说明 OSPF 负责内部到达、BGP 负责出口候选与偏好,主机按已安装路由转发。将去程和回程分别描述,标明状态防火墙及地址转换所在位置。

给出明确的前缀清单、允许发布的范围、接收过滤边界与汇聚覆盖网段。偏好策略写清匹配条件、属性动作和未匹配行为,不使用“自动选择最快线路”这种无法兑现的表达。若采用汇总通告,说明内部部分网段故障时如何避免流量持续进入不可达区域。对备用出口注明容量与使用限制,不能只因它能建立会话就认定能够承载完整备份负载。

验收材料应包含变更前后目标前缀候选、选中出口、下一跳解析、内核路由与业务指标,并附节点、源目标地址和时间。另选不应受影响的前缀做对照,在隔离演练中验证主路径撤销及恢复。探测失败时沿主机、内部路径、出口政策逐段定位,避免直接重启所有路由进程。将会话存活、前缀存在和业务可用分别列为观察项。

最后写入配置快照位置、执行负责人、维护窗口、观察期限和回退触发条件。回退围绕本次规则差异实施,完成后核对运行配置、持久配置与工单一致。交付说明应让接班人员能够回答:目标流量此刻为何走这条路,什么故障会让它切换,以及用哪些命令和业务证据确认恢复。这样,协议名称才转化为可执行、可检查的网络方案。

10 小结:下一步交换进阶(S34)

OSPF 提供内部拓扑与路径计算,BGP 结合前缀及属性执行路由政策。会话建立、路由选中、内核安装和业务可用,需要分别证明。下一课把观察位置移向交换网络,继续追问:发往下一跳的帧,如何到达正确端口?

自测:为什么 AS_PATH 较短仍可能落选?为什么 /24 能影响已有 /23 的转发?当 ip neigh 显示下一跳解析失败时,应先查出口偏好还是本地连接?回答时分别指出对应的属性比较、最长前缀匹配和链路证据。

同阶段相关课

AI 答疑

默认关闭。启用后,只发送本课标题、最近阅读的屏幕内正文摘录(最多 6000 字)与本次问题。

配置自己的服务