先说结论:Windows 防火墙里那个"限 IP 访问",我一开始写错的地方不在"拦不拦得住",而在状态没管住——点一次"确定",背后其实是一堆规则的增删:谁该停用、谁该恢复,得一条条记清楚;少回读一次校验,界面看着像成功了,系统里的规则可能还乱着。

这是给「七亿批量远程管理工具」(RdpManager)里那个 Windows 防火墙窗加功能时留下的坑,隔了几天回头看,值得记一笔。

先说"限 IP 访问"是个啥。某个端口(比如 3389)只想让指定的几个 IP 连,其它一律挡掉。实现上就是给这个端口建一条"只允许这几个 IP"的入站规则,同时把原来那条"允许所有人"的放行规则停掉——不然你上了一条限 IP 的,老的"允所有人"还开着,等于白限。

坑就出在"同时"这两个字上。

真正的复杂不在"停用那条放行规则",而在这台机器的规则不止一条。只要还有任意一条"允许这个端口、放所有人"的规则在跑,限 IP 就形同虚设。所以设限的时候,得把这一堆同端口的放行规则都停掉;而这堆里面,还有一条是本工具自己建的(工具装的时候就顺手给它建了条放行)。停用了哪些,得先记下来——记名字、记是不是自己建的——解除限制的时候好一条条恢复回去。

解除限制这步更要命:要删掉限 IP 那条,再把之前停用的逐条恢复。这里我吃过亏:起初图省事,命令发下去只要接口不报错,就当它成功了。可"接口没报错"跟"规则真生效了"是两回事。后来我改成每删一条、每启用一条,都回读它的状态确认,失败了就把失败原因报出来,不自己糊弄自己。多读一遍是麻烦,但比"看着成功、实际没生效"强太多。

还有一个更蠢的 bug。界面那句"清空 = 解除限制"——我在提示里写了"清空这里的 IP 列表就等于解除限制"。结果用户把 IP 列表清空、点确定,规则一点没变。翻了半天才反应过来:那个"清空"只改了界面上输入框的内容,压根没接进"解除限制"那段处理里。改起来不难,把"列表清空"也接到解除限制的同一段逻辑里就行。你说气不气人,功能都在,就差一根线没接上。

回头看这类"在系统里增删规则"的功能,最怕的真不是逻辑写错,是状态没对齐:界面显示一套、系统里实际一套,再不回读校验,两边就永远各说各话。而且这种不对齐往往不报错,安安静静地错着——等用户来问"为什么限了 IP 还能连上",你才知道。

从那以后,凡是这种"改完系统状态"的地方,我都尽量做到"改一条、读一条、对不上就喊"。听上去啰嗦,但它救过我好几回。这工具本身——七亿批量远程管理工具——是个 Windows 端的批量远程管理工具,RDP 九宫格、SSH 终端、SFTP/FTP 都在里头,防火墙这块只是它顺带的一个小面板;也正是因为它什么都想替你干,才更容易在"状态"这种看不见的地方栽跟头。之前也聊过一次更接近的坑,自动封 IP 防爆破、按归属地做白名单那次,本质也是规则状态没理顺。

防火墙.png

顺带提一句,这个七亿批量远程管理工具是免费的、Windows 端,RDP 九宫格 / SSH 终端 / SFTP / FTP 都齐。