TL;DR

祖传环境配置脚本太草台,导致选手机器大面积断网。解决方式是防火墙放通 DHCP 服务器地址和 255.255.255.255 广播地址。

问题背景

前不久,学校如期举办了程序设计竞赛校内选拔赛,我和以往一样使用了我祖传的环境配置脚本让志愿者对各个机器的环境进行配置。

在环境配置时,各个机器的网还好好的,除了有一台机器出现了“未识别的网络”的情况重配了一下,当时也没太在意,以为是机器偶发的情况。但是在临近比赛开始时,用于比赛的机器出现了大面积的断网,最后比赛推迟两次,一共推迟 40 分钟,还是让选手在能访问外网的情况下进行作答,实在是本次比赛的一大败笔。

Unknown Network

在推迟的时间里我查看了一下各个机器的状况,发现实际上是 IP 全掉了。一开始,我还在怀疑是不是学校的路由器出了什么毛病,把这些机器的 IP 全撤了,但是想想其他没有配比赛环境的机器并没有断网,所以应该排除这个问题。我也尝试修改脚本,看看能不能修改一下防火墙规则,让它能重新获取 IP,但是我把整个 10.0.0.0/8 段放通也获取不到 IP。此时过了计划开始时间 15 分钟了,为了让比赛开始时间不拖太久,我只好决定让比赛志愿者执行还原命令,删除防火墙规则。

后来比赛中我拿一台空闲的机器看了一下,发现 DHCP 的“获得租约时间”和“租约过期时间”只相差大约一个小时,而从配环境到断网也是差不多一个小时(后来实测租期是 45 分钟),因此主要从 DHCP 续租的角度下手。

问题分析

为了复现问题,我在 VMware 中创建了一个 Windows 10 虚拟机,并且配置 DHCP 的地址租期为 2 分钟。同时为了更好地模拟学校的网络地址情况,我在这里也把 VMware 网络 DHCP 出来的地址划在 10.0.0.0/8 的一个子段下。
VMware DHCP Config

在 Windows 已 DHCP 获取 IP 地址后,把旧的防火墙规则打上,果然 2 分钟之后 Windows 的 IP 被释放,并且执行 ipconfig /renew 卡一段时间后会提示无法连接到 DHCP 服务器。

这说明原来学校的 DHCP 地址租期至少有 6 个小时了,因为从前办 5 小时的比赛不会出现这个问题,加上提前 1 小时召集人去配环境,差不多就是 6 个小时。

Renew Failure

更改规则,将整个 10.0.0.0/8 段放通,再次尝试获取 IP,仍然失败,和上面一样的结果。

但是如果先获取 IP 地址,再启用防火墙,发现地址可以正常续租。根据网上的说法,正常情况下 Windows 在租期仅剩 50% 时就会向 DHCP 服务器进行一次续租,这里已经成功续租两次了。

Renew Success

于是找 DeepSeek 老师询问一下 DHCP 获得 IP 地址的原理:

DHCP Packet

草了,DHCP 广播请求 DHCP 服务器的时候要用到 255.255.255.255 这个广播地址。因此我们要放通这个地址。

255.255.255.255 放通之后,果然可以正常执行 ipconfig /renew 了。

解决方案

在配置防火墙时:

  1. 放通 DHCP 服务器的地址
  2. 放通广播地址 255.255.255.255

其实如果在已获得 IP 地址的情况下执行脚本,那么放通 255.255.255.255 是非必要的。不过为了防止出意外还是放通一下比较好。

吐槽

还是太相信前辈写的草台脚本了,凡事还是要多自己验证,免得赛时出锅。

这次出问题真是让我背了大锅了,我听说几间机房都出现了大面积的断网的时候心态都崩了。赛后和老师商量以后能不能请网络中心的人临时给我们配一配那边的防火墙,免得出现这次比赛这样的事故,但是好像说是不太行。我们其实也是在夹缝中生存了:比赛机器镜像你做不了;网络配置你改不了;还有各种乱七八糟的申请流程一走就得上天时间。

我其实特别想给所有来参加校赛的同学尽可能好的参赛体验,希望能对标较为正式的赛事,去做选手机器的镜像,去配参赛系统的 IP 自动登陆等等一些东西。但是无奈没有条件做这些,所有的计划只能烂在我肚子里,没事的时候意淫一下,令人感叹。