English

文章

keelOS: 把所有主流路由系统都跑了一遍,我发现keelOS都能支持!

为什么要在 keelOS 上跑路由器

我们把 9 个主流的路由/防火墙系统都放到 keelOS 上跑了一遍:8 个直接能用,能拿地址、能做 NAT、能上网;高性能要的 Intel VF 在其中 5 个里实测跑通了。剩下的一个是爱快(iKuai),系统能启动,但安装程序收不到键盘,这个还在查。

软路由本来就是虚拟化最常见的用法之一。一台小主机上既跑 NAS、跑几台 VM,又跑路由器,省掉一台设备、一份电费。难点在网络:路由器要至少两个口,要跑满线速,还要在主机升级、重启的时候不断网。

keelOS 的结构正好对付最后一点。最底下是一层很薄的 hypervisor(hyp),开机后一直常驻;上面是一个 FreeBSD 的 root,管硬件、用 bhyve 跑 guest。root 升级内核、重启的时候,guest 暂停二三十秒,等新的 root 起来后接着跑,不重启。路由器跑在 guest 里,主机升级就不再意味着全家断网几分钟。

这次测的系统分三类:

  • 家用和小办公室最常见的:OPNsense、pfSense CE、MikroTik RouterOS(云版本 CHR);
  • 国内软路由圈最常见的:OpenWrt 和它的两个分支 ImmortalWrt、iStoreOS,还有爱快;
  • 偏网络工程的 VyOS。

FortiGate、Palo Alto、Cisco、Juniper 这些商业虚拟防火墙要账号和授权,这次没有测。

怎么测的

每个系统都是一台 guest,跑在我们的开发机上(Supermicro X11DPU,两颗 Xeon,Intel X710 四口万兆网卡)。每台给同样的接法:

  • LAN 口:一个 virtio-net,接在主机上一个隔离的虚拟交换机上,不通外面;
  • WAN 口:一个 virtio-net,接在办公网上,由办公网的路由器发 DHCP;
  • VF:X710 的一个 SR-IOV 虚拟功能,直通进 guest。这个口在交换机上是 trunk,办公网在 VLAN 100,所以要在 guest 里打 VLAN 标签才拿得到地址。

“能用”的标准是:启动到登录,WAN 拿到 DHCP 地址,从路由器里 ping 得通公网;VF 要被驱动认出来,在 VLAN 100 上拿到地址。这次只验证能跑通,没有压吞吐。

结果

系统 版本 固件 结果 Intel X710 VF
MikroTik RouterOS CHR 7.24.4 SeaBIOS 能用:DHCP、NAT、DHCP 服务、DNS 能用,VLAN 100 上 ping 网关 0.2 ms
OpenWrt 25.12.5 UEFI 能用 装 kmod-iavf 包之后能用
ImmortalWrt 25.12.2 UEFI 能用 自带 igbvf、ixgbevf,X710 同 OpenWrt 装包(未实测)
iStoreOS 25.12.5 UEFI 能用 自带驱动,开箱即用
OPNsense 26.7 SeaBIOS 能用,LAN/WAN 自己分好,IPv6 也拿到 开箱即用,4 个队列
pfSense CE 2.7.2 UEFI 能用,装到盘上 和 OPNsense 同一个 FreeBSD 驱动(未单独实测)
VyOS rolling 2026.09.28 UEFI 能用 开箱即用
爱快 iKuai 4.0.313 UEFI / SeaBIOS 能启动,安装程序收不到键盘 未测

两个系统要用 SeaBIOS(传统 BIOS)启动,不是因为 bhyve 有问题,而是它们的镜像只带 MBR 引导。keelOS 同时支持 UEFI 和 SeaBIOS,每台 guest 一个开关。

“bhyve 跑不了 RouterOS”是怎么回事

网上一直有这个说法,MikroTik 自己的 CHR 文档里也没有把 bhyve 列进支持的平台。我们一开始用 UEFI 启动,确实起不来:固件在盘上找不到启动项,转去网络启动。

拆开镜像一看,原因很简单:

  • CHR 7.24.4 的镜像同时有 MBR 和 GPT,MBR 里是真分区,不是 GPT 要求的“保护分区”;
  • 第一个分区里确实有 EFI/BOOT/BOOTX64.EFI(其实就是 Linux 5.6.3 内核的 EFI stub),但这个分区是 ext2 格式;
  • UEFI 固件只认 FAT,读不了 ext2,所以根本看不到这个文件。

这个镜像实际上只能走传统 BIOS,靠 MBR 里的引导代码启动。KVM 默认用的就是 SeaBIOS,所以在 Proxmox 上从来没人碰到;bhyve 原来只有 UEFI 固件,就被说成“跑不了”。以前有人把这个分区重新格式化成 FAT、手工改分区表才跑起来。

keelOS 把 SeaBIOS 作为 bhyve 的固件之一(为了跑 Windows XP 这类老系统加的),换成 SeaBIOS 之后,CHR 的原装镜像不用任何修改就启动了,RouterOS 里看到的主板名是 “CHR Bochs Bochs”。OPNsense 的 nano 镜像是同样的情况:只有 MBR,没有 EFI 分区。

性能靠 VF 和直通

路由器是网络应用,每个包都要过一遍。virtio-net 要经过主机的虚拟交换机,千兆够用,万兆就吃力。要跑满线速,就把网卡直接交给 guest:要么整个口直通,要么用 SR-IOV 把一个口切成几个 VF,每个 VF 是一块独立的 PCI 网卡,收发不经过主机。keelOS 两种都支持,关键是 guest 里有没有驱动。

我们给大部分系统插了一个 X710 的 VF:

  • CHR、OPNsense、VyOS、iStoreOS:驱动自带,开机就认出来;CHR 和 VyOS 在 guest 里加 VLAN 100,拿到办公网地址,ping 网关 0.2 ms 左右;
  • OpenWrt:默认镜像为了小没带 iavf,apk add kmod-iavf 一条命令装上就行;
  • pfSense:和 OPNsense 用同一个 FreeBSD 驱动。

RouterOS 的驱动清单我们直接从 7.24.4 的镜像里列了出来,不靠猜:

类别 CHR 7.24.4 带的驱动
VF iavf(Intel X710/XL710/E810)、ixgbevf(Intel 82599/X520/X550)、igbvf(Intel I350)、mlx5/mlx4(Mellanox ConnectX)、bnxt_en(Broadcom)、cxgb4vf(Chelsio)
整卡直通 e1000e、igb、igc(I225/I226)、ixgbe、i40e、ice、r8169/r8125(Realtek)、atlantic(Aquantia)、tg3、bnx2x、sfc 等
半虚拟化 virtio_net、vmxnet3、hv_netvsc、xen-netfront

家里常见的 2.5G 网卡(Intel I226、Realtek 8125)整口直通给 CHR 是有驱动的。这次没有测吞吐,CHR 免费许可还把每个口的上行限在 1 Mbit/s,测速要付费或试用许可。

一次事故:路由器把办公网桥成了环

测 iStoreOS 的时候,办公室的网络开始不正常,持续了 19 分钟,关掉这台 guest 就好了。原因是 iStoreOS 的默认配置:第一个口是 WAN,其余所有的口都桥进 LAN。我们给它的另外两个口恰好都通向办公网:一个经主机的虚拟交换机,一个是 VF。guest 里的网桥把两条路接在一起,办公网的帧从 VF 进来、从另一个口出去,又回到同一个交换机。主机的日志里同一个 MAC 在两个口之间来回跳,每分钟 4 次。

没有演变成广播风暴,是因为 X710 的 VF 自带 MAC 防伪,guest 从 VF 发不出别人的 MAC,环只通了一个方向。但 virtio-net 这边没有任何限制。

其他虚拟化平台有现成的办法:Hyper-V 默认不许虚拟网卡用别人的 MAC 发包,VMware 的虚拟交换机拒绝伪造源 MAC,Proxmox 防火墙有 MAC 过滤。我们照这个思路把它加进了 keelOS:bhyve 的每块虚拟网卡只让源 MAC 是自己的帧出去,其余的丢掉并记进日志。路由器本来就用自己的 MAC 路由,不受影响;确实需要桥接的 guest(比如 VRRP/CARP 的虚拟 MAC)可以按网卡关掉。如果关掉过滤的网卡和另一个口通到同一个网络,keelOS 会提醒。

iStoreOS 把办公网桥成环的路径 · keelOS 在哪里拦住
iStoreOS 把办公网桥成环的路径 · keelOS 在哪里拦住

我们在一台隔离的测试 guest 上验证过:用自己 MAC 发的包照常出去,在 guest 里把 MAC 改掉之后发的包一个也没出去。

还没做完的,和接下来要做的

爱快:系统能启动,第一屏问“是否安装 UEFI 引导模式”,但怎么按都没反应。我们确认了按键已经到了 guest 内核,扫描码也对;同一个 ISO 在 QEMU/KVM 上没问题。它的根文件系统是加密的,看不到安装程序怎么读键盘,暂时放下了。

路由器模板:keelOS 现在内置了 routeros-chr、openwrt、istoreos、opnsense、pfsense、vyos 六个模板。模板记下该用哪种固件、哪种网卡,还记下每个口的角色。这一点很重要:各家对第一个口是 LAN 还是 WAN 的约定不一样(OpenWrt、OPNsense 第一个是 LAN,pfSense、iStoreOS 第一个是 WAN),接反了,带 DHCP 服务的 LAN 就到了你的办公网上。

模板以后会放到网站上,随时更新:哪个系统出了新版、换了镜像格式,改一下模板就行,不用等 keelOS 发版。

结论

常见的软路由系统,除了爱快,在 keelOS 上都能直接跑,原装镜像不用改。所谓“bhyve 跑不了 RouterOS”,其实是缺一个传统 BIOS;keelOS 把 SeaBIOS 补上之后就没有这个问题了。高性能靠 VF 和整口直通,主流系统都带了驱动;路由器这种会把口桥接在一起的 guest,keelOS 默认按源 MAC 把关,接错了线也成不了环。

下一步是吞吐对比:virtio、VF、整口直通在万兆上各跑多少,等我们的万兆交换机就位再测。

← 文章 · 为什么选 keelOS