精确 /api 结束选择;普通最长前缀可被匹配正则接管,选中的 ^~ 前缀跳过正则。没有正则匹配时,使用记住的前缀。

nginx 前缀在匹配结束前只是候选配置

nginx location 在已选中的 server 内为请求选择配置。对于这里验证的平面前缀与正则结构,精确匹配会结束搜索;否则 nginx 先记住最长匹配前缀,再可能选择第一个匹配的正则。如果没有适用正则胜出,就使用先前记住的前缀。这是一个完整选择过程,不是简单执行配置文件里最先遇到的块,也不是只比较路径看起来有多具体。 坏掉的样子 前缀是字符串前缀,不会自动要求完整路径段。location /api 也能匹配 /apix。如果真正需要的是端点 /api 和 /api/ 下的后代,应明确表达这两个边界。依赖未声明的路径段边界,可能让只是共享开头字母的路径,进入错误处理器、缓存策略或访问规则。配置应反映真实 URL 集合,而不是依靠读者自行补充含义。 最长普通前缀不一定是最终选择。匹配 .php 的正则,可以接管一个也匹配了更详细 API 前缀的请求。把前缀移到正则之前,不会改变基本优先规则。竞争正则之间的声明顺序有意义,普通前缀则主要比较匹配长度,而不是出现位置。因此,单纯整理文本顺序不一定修复实际路由问题。 ^~ 在该前缀成为相关层级的最长匹配前缀时,抑制正则搜索。它不是正则运算符,也不是对所有以某个较短标记前缀开头的路径提供无条件保护。嵌套 location 和内部跳转需要额外推理;下面故意使用平面 server 结构,让每次选择都能明确对应一个规则,不把复杂嵌套情况隐藏在简化结论里。 前缀仍可能被正则接管。 依据原文与明确限制静态绘制;未为本图重跑原文夹具。 快速验证 下文集成实验的结果保留自历史运行记录;本次修订没有重新执行该实验,不能将这些记录当成本次环境的新实测。 ...

一月 17, 2028 · 2 分钟 · XB Field Notes
多个副本通告同一前缀;观察网络按路由策略选择可用路径。路由意义的最近不保证地理距离最短。

Anycast 让路由选择副本

Anycast 让一个地址拥有多个家。多个站点宣告同一个前缀,每个网络按照路由策略选出一条可用路径。本文关注互联网 BGP;本地 Anycast 也可以使用内部路由协议。客户端通常无需先经过全球负载均衡就能到达拓扑上较近的副本。某个站点撤回宣告后,控制面可以收敛到另一个家。这种设计把“就近”和“切换”交给网络完成,但也把策略错误和收敛窗口带到了应用面前。 一个地址,多点宣告 Anycast 把同一个单播地址或前缀配置给相互独立的实例,每个边缘路由器用 BGP 宣告可达性。邻居比较路径,在自己的路由信息库中安装最佳路由,数据包随后沿普通转发路径走向选定的下一跳。应用看到的仍是一个目的地址,实际上却有许多站点可以回答。客户端不需要知道副本列表,运维也可以独立扩容某个站点。 “最近”指路由策略和拓扑意义上的最近,并不保证地理距离最短。本地偏好较高的路径可以胜过物理上更短的路径;本地偏好相同时,通常再偏向 AS path 更短的路径,之后还有厂商和策略相关的决胜条件。运营者可以调整这些属性、做 AS path prepend 或撤回前缀来引流。真正的契约是可达性,而不是承诺每个客户端永远选择同一站点。不同 ISP 看到的路径不同,所以同一时刻两个用户落在不同城市并不矛盾。 路由完成故障切换 站点失去服务或上游时,应当由健康联动的会话撤回路由。上游传播撤回消息,选择仍在宣告的副本。转发路径无需等待新的 DNS 应答,因此整个边缘站点消失后地址仍然有效。BGP 收敛不是瞬时完成的:切换期间可能丢包,不同网络的收敛时间也不同,客户端仍要设置重试和合理的连接超时。把“最终会切过去”写进设计,并不等于承诺零丢包。 Anycast 特别适合无状态或容易重建的协议,例如 DNS、基于 UDP 的发现服务和 CDN 边缘。它也能把攻击面分散到多个站点,但容量和过滤策略必须协同。进程已经死了却仍在宣告的路由,比没有路由更糟,因为流量会被送进黑洞。应把宣告绑定到真实的就绪信号,同时监控控制面可达性和应用响应。撤回机制要有明确的延迟上限,不能只依赖人工登录路由器。 有状态会话会介怀 路由变化后,已经建立的 TCP 连接可能被送往另一个站点。新实例没有旧套接字状态,可能重置连接或丢弃报文。共享后端能保留应用状态,却不能把原来的 TCP 连接自动搬过去,因此客户端仍要接受重连并重建状态;幂等键可以防止重连后重发请求产生重复副作用。一次成功的跟踪并不等于具有粘性;拓扑变化不仅会改变下一条流的选择,也可能让当前流的后续报文到达另一个副本。 可观测性还应记录服务站点、路由年龄和撤回原因。一个全局成功率会掩盖某个区域的黑洞,因为其他区域仍然健康。应从多个网络探测,把 Anycast 地址和站点身份分开记录,并在“站点仍在宣告但服务检查失败”时告警。日志中保留连接建立时的站点,才能解释切换前后的重试和状态差异。 坏掉的样子 路由泄漏或误设的高本地偏好,会把流量吸引到很远的站点;只撤回一部分邻居,则会让一些网络停留在旧路径,表现为不对称丢包而不是干净切换。副本之间的 MTU、防火墙和 ACL 差异,也会制造看似随机的路由故障。服务带本地状态时,用户可能只在控制面已经收敛后才看到连接重置。把一个站点标记为健康,却没有检查回程路径,也会制造只进不出的黑洞。 ...

十一月 1, 2027 · 2 分钟 · XB Field Notes
一条 /16 汇总包含两个 /24 成员与空洞;一个成员消失时另一个仍可保留路由,聚合点对无成员匹配的汇总流量需要丢弃处理。

BGP 聚合收窄路由表

聚合可以用一个覆盖前缀,替代若干更具体的路由通告。只有更具体前缀确实受到抑制、且其他对等体没有继续提供它们时,下游表项才会减少。成员不必填满整个汇总范围:几个稀疏子网也能形成一个较大的覆盖块,但该通告同时会吸引发往空洞地址的流量。因此,聚合既是规模问题,也是可达性和地址授权问题。 聚合究竟减少了什么 对等体同时收到三个成员前缀和一条汇总时,仍然持有四条路由。FRR 的 aggregate-address 10.1.0.0/16 summary-only 抑制被覆盖的更具体前缀通告,并不会把它们从聚合路由器自己的 BGP 表删除。生成汇总的前提是 BGP 表中至少有一个符合条件的更具体前缀,仅在其他路由表中存在一条记录还不够。 稳定的汇总可以把部分成员变化挡在下游之外,但这个收益有前提。最后一个成员消失、汇总属性改变,或者出口策略变化,都可能继续产生更新。抑制通告不会修复客户链路,只会改变其他网络获得的故障信息。聚合者仍然需要监控内部成员,不能因为上游只看到一条稳定路由,就认为内部全部可达。 汇总覆盖的地址通常也比列出来的几个子网更多。宣告之前,应检查整个范围的使用授权以及预期的汇总起源 AS。地址对齐、数值相邻、能节省表项,都不是拥有宣告权限的证据。提供商可以在自己的地址分配范围内合法汇总客户网络;成员来自不同起源 AS,并不自动意味着这次聚合非法,关键是整体授权和出口契约。 保留清晰的起源 FRR 的 suppress-map 用路由映射选择哪些更具体前缀受到抑制。as-set 处理的是另一个维度,即怎样表示成员路径中的 AS 信息。AS_SET 是无序集合,并非只包含客户起源号码的清单。历史上的 RFC 4271 在计算 AS 路径长度时,将整个集合计作一个,不会按集合成员数量逐个增加长度。 RFC 9774 已经废弃 AS_SET 与 AS_CONFED_SET。除非运营者为了过渡显式选择其他行为,发言者不得继续通告这些集合,收到含集合的路由时应按撤回处理。应选择明确、获得授权的汇总起源,并配置相应 ROA,不能把 AS_SET 当作常规修补办法。邻居的起源过滤器也不会因为路由器生成了一条汇总,就自动接受这个范围。 坏掉的样子 在选定转发表中的普通目的地址查找,使用最长的已安装匹配前缀。因此,有效的 /24 会覆盖其上方的 /16,不论两者的 BGP 本地优先级谁更高。不过,路由首先必须通过导入策略、下一跳解析和安装过程。BGP 为同一前缀选择候选路径,与转发时在不同前缀之间做匹配,是两个不同阶段。 ...

十月 8, 2027 · 1 分钟 · XB Field Notes
原文预期情景,不是实测记录。客户端、路由器与目标沿请求方向相连;被叉断的返回线表示删除目标的返回默认路由。客户端网关未变,HTTP 却超时,说明有去路仍须有回路。

默认路由匹配最宽范围,不会挽救所有失败路径

IPv4 默认路由是前缀 0.0.0.0/0,匹配所有 IPv4 目的地,但具体程度最低。在已经选择的路由表中,更长的匹配前缀通常优先。默认路由不是一个“其他具体路径失败后再重试”的过程。路由策略决定相关表,最终路由描述怎样转发,而不保证完整往返一定成功。匹配范围与路径健康是两类不同属性。 坏掉的样子 没有默认路由的机器,仍能访问直连或明确路由覆盖的目的地;反过来,添加默认路由也不证明能够访问互联网。下一跳需要可达,转发与过滤要允许流量,回复还需要返回路径。显示一个网关,只满足契约的一部分。真正配置是否共同工作,应由实际应用通信证明,而不是从路由文件中有一行 default 就推导全部能力。 更具体的拒绝路由会胜过可工作的默认路由。Linux 的 unreachable 等路由类型,会有意停止匹配目的地的转发。选定网关的邻居查询失败,也不意味着内核自动寻找更健康、却更宽泛的路径。静态路由优先级和 metric 不是服务健康监控或自动故障转移机制,不能把配置顺序当成逐个尝试可用出口的流程。 返回路径错误尤其容易误导。客户端选中预期网关并把流量送往监听中的服务器,服务器却可能无法把回复路由回客户端。反复修改客户端默认路由,可能破坏其他正常目的地,却没有修复缺失的反向路径。将所有连接超时归因于发送方网关之前,应查看两个方向和真实源地址。请求能到与响应能回,需要分别成立。 有去路,还要有回路。 仅为原文预期模型。实验前提缺失,可执行验收受阻;不声称具有保留的运行证据。 快速验证 2026-10-18 源码审阅说明:下述预期结果与历史报告没有在本次审阅中重新运行,当前执行验证仍受阻。 这些命令要求明确记录的 Linux 实验安全策略允许嵌套命名空间和 proc 挂载。NET_ADMIN 与 SYS_ADMIN 不会覆盖 Docker 内置 AppArmor 策略的挂载禁令。初始化权限错误不属于选路测试结果。 将脚本保存为 check-default-route.py,准备 Docker 后运行 python3 check-default-route.py。Python 3.11.16 和 iproute2 6.1.0 在一次性 Linux 容器内建立客户端、路由器、目标拓扑。NET_ADMIN 与 SYS_ADMIN 支持嵌套命名空间和临时 proc 挂载。接口全是新建 veth,不向宿主发布端口或路由,也不修改现有网络设备: ...

九月 14, 2027 · 2 分钟 · XB Field Notes
文章两字段模型中,同一前缀的本地偏好 200 三段 AS 路径,优先于偏好 100 的两段较短路径。

BGP 组成了互联网的路由表

BGP 在独立运营的网络之间交换可达性,但互联网并不存在一张统一、权威的转发表。每台路由器都学习经过策略过滤的视图,选择路由,再尝试把可用下一跳安装进转发系统。两台路由器为同一个前缀选择不同路径,完全可能是正常情况。理解 BGP,需要把通告、选路策略和数据包转发分开,不能把它们合并成一个放之四海皆准的答案。 AS 路径同时承载历史与策略 普通 eBGP 场景中,路由器向外宣告时会在 AS 路径前加上自己的号码。接收方通常排除已经包含自己 AS 的路径,用于避免自治系统之间的环路,但存在显式配置的例外和协议扩展。自治系统内部的 iBGP 通常不再增加 AS 号码;它的转发通告限制及路由反射器规则处理的是另一类内部环路问题。 AS_PATH 还是过滤和选路的输入。重复前插可能让一条路由在看重路径长度的网络里吸引力下降,却不能推翻对方优先级更高的本地策略。也没有一条通用规则说,前插之后路由就会被过滤。必须结合真正的运营商策略、客户授权和接收条件,理解该字段在当前网络里的作用。 LOCAL_PREF 会作为属性分发给内部 BGP 对等体,通常不传给外部对等体。部分实现提供的 weight 则只属于本地路由器,也不是标准 BGP 路径属性。把两者都描述成不会进入更新报文,会掩盖关键区别:本地优先级可以影响自治系统内其他设备的决策,而 weight 的效果一般局限在一台路由器。 先比较同一个前缀 最佳路径过程比较的是同一前缀的多个候选路径。具体顺序取决于实现和配置,包括路径资格、本地策略、AS 路径长度、MED 比较范围及下一跳可达性。某个产品的 weight 优先列表并不是协议完整定义。MED 通常在来自相同邻居 AS 的路径之间比较,但实现可以提供改变这一行为的选项,不能把默认规则写成不可改变的限制。 之后,转发过程在已安装目的路由中做最长前缀匹配。一个 /25 与覆盖它的 /24,并不是通过同一套最佳路径平局规则互相竞争。只要两者均被接受并安装,前者就匹配那一半地址,即使后者的 AS 路径更短。策略路由或其他额外转发机制还需要分别检查,不能从这条普通查找规则推断全部设备行为。 ...

九月 12, 2027 · 1 分钟 · XB Field Notes
两列对齐展示 /replace/ 被 /v1/ 替换,而 item?x=1 保持不变;这是字面代理 URI 的前缀替换。

proxy_pass 既选择上游,也映射请求 URI

nginx proxy_pass 选择上游目标,也影响实际发送的请求 URI。关键区别是指令是否包含 URI 部分,而不只是文本末尾有没有斜杠。在普通前缀 location 中,字面目标 URI 会替换匹配到的规范化前缀;仅含地址的目标,在请求没有被重写时,可以传递原始请求 URI。理解这两个分支,才能准确预测后端看到的路径。 坏掉的样子 应用只处理 /users,代理却转发 /api/users,即使网络连接成功,也可能得到 404。相反,应用期待公共前缀,而代理把它移除,也会出现错误。只比较客户端状态和上游可达性,无法定位这类问题;需要检查后端真正收到的方法、路径、查询和主机名。成功建立连接并不等于协议内容符合应用契约。 斜杠边界属于字面替换的一部分。以 /v1 结尾的目标仍然包含 URI,所以在 /join/item 中替换 /join/ 后会得到 /v1item,不会因为目标没有末尾斜杠就保留原路径。按被替换前缀和剩余后缀推演,比“有没有末尾斜杠”这句通用口诀更准确,也能解释多段内部路径的映射。 变量会引入另一条文档规定的分支。变量提供的代理 URL 包含 URI 时,使用的是给定 URI,而不是普通字面前缀替换规则。正则和命名 location 也没有同样明确的前缀边界。在普通前缀中工作的配置,不能不检查契约就直接复制到这些上下文,否则语法或运行行为都可能发生变化。 替换前缀,接上后缀。 依据原文与明确限制静态绘制;未为本图重跑原文夹具。 快速验证 下文集成实验的结果保留自历史运行记录;本次修订没有重新执行该实验,不能将这些记录当成本次环境的新实测。 ...

四月 2, 2027 · 2 分钟 · XB Field Notes