原文预期情景,不是实测记录。客户端、路由器与目标沿请求方向相连;被叉断的返回线表示删除目标的返回默认路由。客户端网关未变,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
对同一目的地 192.0.2.77,直连 /24 行直接选择 lab0;高亮的更具体 /32 行胜出,经网关 192.0.2.1。行表示路由具体程度,不是连续两跳转发。

子网前缀影响直连路由,最终路径由路由表选择

IPv4 前缀长度表示地址中有多少前导位标识网络。对于 192.0.2.5/24,网段是 192.0.2.0/24,普通广播地址是 192.0.2.255。配置接口通常会建立相应直连路由,但前缀不是完整路由算法。内核还要依据路由策略与路由表,为具体目的地选择路径,不能只看地址是否位于某个网段就推断全部行为。 坏掉的样子 前缀太短,会让主机把原本远端的目的地当成直接相连。保留地址 192.0.2.5,却把 /24 改成 /16,就把 192.0.3.9 纳入直连范围。在真实以太网中,这种错误可能让主机尝试解析一个根本不在当前链路上的邻居。于是地址看起来正确,下一跳决策却已经改变;反复核对地址字符串本身无法发现问题。 “不在自己的子网就走默认网关”也不完整。更具体的路由可以选择其他网关或接口;在已经选择的路由表内,更长的匹配前缀优先。明确的主机路由甚至可以覆盖本来位于接口子网内的目的地。应检查实际查询结果,而不是仅凭接口地址重新猜测内核会怎么做。默认路由只处理没有更具体匹配的相应流量。 地址数量计算也需要上下文。普通 /24 的网络地址与定向广播地址通常不用于主机分配,但“减二”不是统一公式。RFC 3021 允许点到点 /31 链路的两个地址都用作端点,/32 则标识单个地址。这些规则解释地址语义,没有证明配置中的两端能够通过当前物理拓扑交换数据。可用地址集合和实际通信仍须区分。 更长前缀可以覆盖子网。 依据原文与明确限制静态绘制;未为本图重跑原文夹具。 快速验证 2026-10-18 源码审阅说明:下述预期结果与历史报告没有在本次审阅中重新运行,当前执行验证仍受阻。 将脚本保存为 check-subnet.py,准备 Docker 后执行 python3 check-subnet.py。程序给固定 Python 镜像安装 iproute2 6.1.0,再只向一次性容器授予 NET_ADMIN;容器没有外部网络接入。脚本创建虚拟 dummy 接口并修改该容器的路由,不改变宿主接口、路由或生产网关。构建下载与运行时路由实验也处于不同阶段: ...

九月 13, 2027 · 2 分钟 · XB Field Notes
有限动态 DHCPv4 租约在到期前有续租与重绑时点;成功续租会更新期限,服务器给出的合法定时值可以不同于默认比例。

DHCP 只把地址租给你

DHCPv4 的动态分配把地址借给客户端一段租期。续租可以延长期限,到期则允许地址再次分配。DHCP 也支持其他分配策略,所以本文讨论的是有限期的动态租约,不把它说成协议唯一能够提供的配置。租期是使用地址的约定,不是设备对地址的永久所有权,也不是证明设备身份的凭据。 借用而非拥有地址 新初始化的客户端发现服务器、选择一份报价,再请求配置。确认后的租约记录允许使用地址的时间。租约数据库可以追踪分配,但不能保证所有机器都遵守协议:未受管理的静态地址、重叠地址池、服务器状态丢失或非法服务器,仍可能制造冲突。不能因为有集中租约表,就假定服务器永远知道整张网络里所有真实占用情况。 续约让租约保持存活 有限租期内,客户端通常在 T1 向原服务器请求续租;若到 T2 还没收到确认,则广播重绑请求,让其他合适的服务器也有机会回答。默认值分别是租期的一半与八分之七,服务器可以提供其他合法定时值。RFC 2131 建议在固定值附近加入随机变化,以减少客户端同步请求。因此默认比例不是必须原样保留的性能调优命令。 确认后的到期时刻按续租请求发送时间加上获准的新租期计算;后续 T1 和 T2 也应按更新后的租约计算,而不是继续沿最初入网时刻推进。续租通常保留地址,却不能保证设备在重启、换网或策略改变后永远得到同一地址。短租期让离场地址较快回收,也增加续租流量;长租期给客户端更多时间应对服务中断,却让已经离场的设备占用地址池更久。固定身份需求应明确配置分配策略。 过期即可回收 客户端可以主动释放地址,但正确运行不能依赖每台离场设备都发送 RELEASE。租约过期后,客户端必须停止使用地址并重新获取配置;服务器也可以重新分配这个地址。设备回来时可能拿到原地址,也可能获得不同地址,不能把换号写成必然结果。管理端删除绑定不会撤回客户端已经获得的租期,因此不能用盲目清空租约来代替冲突调查,否则可能主动制造重复分配。 坏掉的样子 地址池耗尽时,新发现请求可能收不到报价。NAK 则有特定含义,例如拒绝不适合当前网络的请求地址,不能把它统一解释成“地址池已满”。部分客户端在 DHCP 失败后配置 IPv4 链路本地地址,但这是另一种行为,也不能单凭它推断失败原因。先检查池容量、转发路径与服务器日志,再决定是否扩容或调整重试,避免把网络丢包当成地址不足。 租期过短会增加续租负载,并缩短客户端能够容忍服务器中断的时间。集中开机可能让流量聚集,却不意味着整个网络必然同步续租。应核对服务器实际下发的定时值和客户端重试方式,而不是只看名义租期。给新租约调长时间,也不会追溯性地延长之前已经确认的旧租约,观察窗口需要覆盖这部分过渡。 非法服务器可以给出错误网关或解析器。选择第一个报价只是客户端的一种可能策略,并非协议强制规定。服务器标识选项没有提供密码学认证,攻击者可以伪造;单独记住一个标识,并不能建立信任。交换机 DHCP snooping 等网络控制需要正确配置受信任端口和转发路径,才能限制回答来自哪里,不能用调短或调长定时器代替这个边界。 睡眠和计时处理可能暴露旧配置。设备醒来时若租约已经过期,必须先重新获取配置,不能继续占用地址,也不能假定自己只是进入 T2 重绑阶段。排查要结合租约已经经过的时间和实现日志;墙上时钟同步本身不能证明定时逻辑正确。地址冲突检测和 DECLINE 处理是另外的保障,不能因为租约表看起来正常就省略它们。 仅讨论有限动态租约。默认 T1、T2 比例不是通用调优保证;阶段时间线和续租公式仅作解释,未测试 DHCP 报文或完整客户端状态机。 快速验证 把代码保存为 dhcp_lease_sim.py,运行 python3 dhcp_lease_sim.py。它只用标准库,通过虚拟时钟和简化的内存服务器检查租期算术与地址归属。单播和广播只是场景标签,没有发送网络报文,也没有实现完整客户端状态机。这里假定请求与确认瞬间完成,T2 取整秒;实际系统应读取服务器给出的值,不能把示例常量当作所有网络的固定设置。 ...

九月 7, 2027 · 3 分钟 · XB Field Notes