keelOS: 不管你IP设置成啥,我都能把你找到!
先看 ESXi:装完以后,先搬一台显示器过去
装一台 ESXi,装完重启,服务器的屏幕停在黄灰色的 DCUI(Direct Console User Interface)上。 要用它,先得知道它的管理地址:
- 看屏幕:DCUI 上写着
http://<IP>/ (DHCP)。网段里有 DHCP 就是这个地址;没有,就是一个 169.254 开头、谁也连不上的地址。 - 地址不对,就在服务器前面接上键盘、显示器:按 F2,输 root 密码,进 Configure Management Network。
- Network Adapters 里选哪块网卡做管理口。这里只看得到 vmnic0、vmnic1 这样的名字和 MAC,要对着网线猜;要 VLAN 就再填 VLAN ID。
- IPv4 Configuration 里改成静态地址,填 IP、掩码、网关;DNS Configuration 里填 DNS 和主机名。
- Esc 退出,按 Y 确认"Apply changes and restart management network"。
- 回到自己的电脑,浏览器打开
https://<IP>/ui,跳过证书警告,用 root 登录。
网关或者 VLAN 填错一个数,就再去机房走一遍。机器放在机柜里、没接显示器、也没有 IPMI 的时候,第 2 步就是搬一台显示器和键盘过去。
再看 keelOS:坐在自己的电脑前,点两下
2026-10-26,一台 Windows 电脑插在 P340 所在的局域网里,kRDPclient 点一下 Connection > Discover keelOS,三秒后列出了 P340;双击,输入它的管理员密码,P340 就加进了主机列表。要改它的管理地址,在主机列表里右键它,Management Network,填新地址,Apply。 整个过程没有输入 IP 地址,也没有去 P340 的网页上复制 token:登录、签 token、改网络都走二层通道,和 P340 现在的 IP 对不对无关。
装好一台 keelOS 以后,用户第一件要做的事是在电脑上找到它:它拿到的是哪个 IP?DHCP 没给地址怎么办?静态地址配错、和电脑不在一个子网又怎么办?以前 keelOS 的答案和 ESXi 一样:去主机的屏幕上看。现在 keelOS 在二层上应答,IP 设成什么都能找到,没有 IP 也能连上去配置。
keelOS 是什么:一个小的 hypervisor(hyp)常驻内存,FreeBSD 作为它上面的管理系统(root)运行 bhyve 和虚拟机;root 可以升级、重启,虚拟机不停。keel 是 root 里管虚拟机的程序和网页,kRDPclient 是我们自己的 Windows 远程桌面客户端。这篇讲的东西一半在 keel 里(应答方),一半在 kRDPclient 里(发现和连接)。
用起来是什么样
Connection 菜单最下面一项 Discover keelOS...,打开就开始找,找完把结果列在弹窗里。
- 找:Connection > Discover keelOS...,大约三秒。这段时间弹窗的按钮都是灰的,Close、Esc、标题栏的 × 都不起作用,用户等结果出来。只在用户点的时候找,kRDPclient 不在后台定时发包。用户的原话:"一直发现我感觉不太行。很少会天天发现。"
- 看:每台一行,名字是"主机名_MAC",例如
p340_90:2e:16:c5:31:7d;后面是 IPv4(没有就写 none)、State、keelOS 版本、是否已经添加。State 只有两种:Fresh install(刚装完,还没有管理员密码)和 Configured(已经设置过)。选中一行,下面列出它报的全部信息:网口和 MAC、IPv6、型号、UUID、证书公钥的指纹。 - 加:双击或者点 Add...。Configured 的输入管理员密码;Fresh install 的在这里设管理员密码,输两次,设好以后网页也用这个密码登录。kRDPclient 经二层通道登录,给这台电脑签一个 token(名字是
kRDPclient@电脑名),存进 Windows 凭据管理器,主机马上进主机列表,弹窗说"添加完成"。密码本身不保存。电脑连不到它的 IP 也一样加进去,列表里用问号图标标出来,详情里写着下一步怎么做。 - 改:右键主机 > Management Network...。kRDPclient 先在局域网里找到它(按证书公钥),再经二层通道读出现在的设置:网口、DHCP 或静态地址、网关、DNS。Apply 以后 keel 马上换地址,但 90 秒内没人确认就自己换回去。kRDPclient 从电脑试连新地址:连上了就确认,主机列表改用新地址;连不上(比如主机要搬到别的网段)就问用户:保留,还是换回原来的。换到电脑连不到的地址也不怕,只要还在一个交换机上,右键还能经二层再改回来。
背后发生了什么
二层协议只干两件事:广播着问"谁是 keelOS",再在以太网帧上搭一条可靠的字节流。 流里跑的是 keel 原来的 HTTPS,登录、签 token 用的还是网页那几个接口。
关键是右上角那个框:keel 在每个管理口上用 BPF 直接收发整帧,不经过 IP 协议栈,所以口上有没有 IP、IP 对不对,都不影响它应答。
别家怎么做,keelOS 怎么做
这个思路来自 MikroTik。 RouterOS 用自己的邻居发现协议(MNDP)在局域网里报自己,WinBox 打开就能列出邻居,按 MAC 地址直接连上去配置,路由器没有 IP 也行。用户要的就是这个:"打开 winbox 就能发现局域网的 keelos,点两下比你输入地址强多了。"
keelOS 原来有 mDNS(keelos.local),但 mDNS 跑在 IP 上:主机没有 IP,或者和电脑不在一个子网,就收不到。所以另起了一个很小的协议,叫 KL2,UDP 端口 7385(IANA 注册表里 7366–7390 没有分配)。
电脑这一侧只用普通 UDP socket,不要管理员权限,也不装 Npcap。 代价是有几处要绕:
- 问:DISCOVER 发到 255.255.255.255:7385。Windows 发这种广播只走一块网卡,所以 kRDPclient 先列出所有启用的有线、Wi‑Fi 网卡,每个地址开一个 socket 各发一次(链路本地的 169.254.x.x 也算),每次找发三遍,防广播丢包。VPN、隧道这类虚拟网卡不发;没插线的网卡上那些还在"试用"状态的 169.254 地址也跳过,绑不上。
- 答:keelOS 用 BPF 写一个整帧回去:以太网单播到问的那台电脑的 MAC,IP 目的地址 255.255.255.255,IP 源地址是这个口的地址,口上没有地址就填 0.0.0.0。这和 DHCP 服务器回答还没拿到地址的客户端是同一种包,Windows 的普通 socket 收得到。这一点是这次风险最大的地方,2026-10-26 在真机上验证过(见"实测")。
- 连:普通 socket 发不了以太网单播,所以电脑发给 keelOS 的包一律是 IP 广播,包头里写着目标网口的 MAC,别的主机看到不是自己的就丢掉。keelOS 回给电脑的包都是单播。
- 流:每个 TCP 连接对应一个会话:OPEN 打开,DATA/ACK 搬数据,FIN 关闭。规则照 TCP 的简化版:窗口 64 个包、累计确认、按 RFC 6298 算重传超时、三个重复 ACK 立即重传;两边的实现按同一份规则写,用同一组测试包对照。kRDPclient 在 127.0.0.1 上开一个端口,HTTPS 客户端连这个端口,就像连主机本身。
安全上,二层这一层不加密、不认证,也就不用自己设计密码学。 流里是 keel 原来的 TLS,端到端;证书按 OFFER 里报的公钥指纹钉住,对不上就拒绝连接;认证还是网页原来的密码和 token。keel 那边每个 MAC 每秒最多回 10 个 OFFER,最多同时 16 个会话;审计日志记每个会话的开和关;整个功能可以在"服务"里关掉,关掉后不回 OFFER、拒绝新会话、已开的会话断开。
实测
QEMU(2026-10-26):keelOS 虚拟机的网卡不给 IPv4,控制机上用 keel 自带的测试命令 keel l2 discover 列出了它(OFFER 从 0.0.0.0 发出,State 是还没设置);keel l2 curl 经二层通道拿到了登录状态、首页和一个 577 KB 的脚本。拿这个文件经二层是 50 ms(约 11 MB/s);同一个文件经 QEMU 的端口转发直连 TCP 是 62–72 ms,两边都含建连和 TLS 握手。
P340 真机(2026-10-26):Lenovo P340 Tiny,管理地址 192.168.12.98;Windows 电脑 192.168.12.30,和它插在同一个网段。
- 第一次 Discover 就找到了 P340,但 IPv4 一列是 none。原因:P340 的 192.168.12.98 配在网桥上,回答的 em0 是网桥的成员口,OFFER 只报了 em0 自己的地址(没有)。当天改成成员口报它所在网桥的地址,热换进 P340 以后,IPv4 显示 192.168.12.98/24。
- 证书公钥的指纹:OFFER 报的和直接从 192.168.12.98:443 取证书算出来的一致(
F1:5F:F5:8B:…:06:FF)。 - 双击 P340,输入密码:经二层通道登录、签 token、退出这次登录的网页会话,然后直连 192.168.12.98 读到了虚拟机列表。主页的树里出现了 P340 和它的 13 台虚拟机。
- 右键 P340 > Management Network:第一次 Apply 被 keel 拒绝了。P340 的管理地址在用户建的网桥
sw_lan上,keel 读出来的设置里网口就是sw_lan,可它改设置时只认以数字结尾的网口名。kRDPclient 改成发网桥的成员口 em0(keel 会把地址放到它所在的网桥上),之后就通过了。 - 把管理地址改到电脑连不到的网段(192.168.13.98/24):第一版每次试连新地址要等 15 秒超时,最多快 90 秒才问用户,和 keel 的自动回滚撑在一起;改成每次 4 秒、最多约 25 秒就问。用户在 P340 上用改好的版本测了改网络的流程,没有发现问题;各步的时间这次没有记下来。
还没做完的
- 没有 IP 的主机,虚拟机要等它有了 IP 才看得到。它能加进主机列表、能经二层改网络,但读虚拟机列表、开 RDP 还是走 IP。要做的是"只走二层的主机":主页刷新也经通道。
- keel 那边的网口名检查要放宽。用户建的网桥(
sw_lan)keel 自己报得出、却不让设为管理口;kRDPclient 绕过去了,keel 的网页很可能也碰得到,还没查。 - Fresh install 那条路没在真机上走过。P340 早就设过密码,这次走的是登录;设密码(输两次)只在代码和单元测试里。
- 只在一台 Windows 10 上测过。那台电脑的防火墙开没开没记下来;Windows 11、防火墙开着、第一次会不会弹防火墙提示,都还要确认。
- RDP 画面不走二层。二层通道只给 keel 的网页和 API 用,不传 ISO 这类大数据(用户定的)。
- 只在一个广播域里。中间隔了路由器就找不到,这是二层协议本来的样子。
- 开发机上没换。dev2、dev3、dev4 当时在跑别的测试,新的 keel 只放进了 P340 和 QEMU。
结语
keelOS 的第一次见面,不再从"它的 IP 是多少"开始;改 IP 也不用再搬显示器去机房。 二层这一层只负责找到和送达,信任还交给 keel 原来的 TLS 和密码;改错了有 90 秒的自动回滚兜底;找人的事,用户点一下才做。