一种受限环境下的 IPMI 部署方式

独立服务器的 IPMI 是一个好东西,特别是在远程 KVM 加持的情况下。无论是 Dell 的 BMC,还是 HP 的 iLO(以下均以 IPMI 指代),只要登录 web 界面,就能启动远程控制台、挂载光盘映像,再也不用担心玩坏了 OS 还要实地操作了。

可是,由于你电信息中心经常只为各部门提供实体服务器的无管理托管服务,各部门自己的运维人员素质又惨不忍睹参差不齐,IPMI 的部署率低得令人发指。信息中心也没这个意识,一台服务器只拉一根网线、只分一个 IP,想加都困难。

这给我们这些代管服务器的人带来了不少困难。Ubuntu 发新的 LTS 了?不敢升。还在跑 CentOS 6?能用就行。上 Proxmox VE?iptables 炸了那只有哭了。虽然这些困难也是爱折腾的本性衍生出来的,但不折腾谁愿意管这些机器啊摔。

好在最近联系过往、回想老王,找到了一个缓解的办法。

现状分析

一个典型的 IPMI 配置,通常是将一根额外的网线连接到主机上 IPMI 专用的网口,并且配置管理专用的 IP(一般在一个独立的 VLAN 里面)。

但你电机房里的独服,通常只在主机的主网口上插了一根网线,连着公网。

考虑到你电行政审批的繁冗,以及对网络安全的极端保守,还有 CERNET 西南中心的尾大不掉,要让信息中心给 IPMI 单独配置一个子网,甚至只是拉一根线、分一个 IP 也是难以想象的。

解决之道

为了服务器的可持续发展,为了众多网管的未来福祉,IPMI 是必须滴。解决方法关键就在于 IPMI 的共享网口模式。

虽然一般而言,IPMI 在主板上会有一个独立的网口,但我接触过的独立服务器都支持共享网口模式,也就是指定一个主网口,通过某种魔法复用上面的单根网线——就好像在某个网口里塞了一个交换机,然后有一个模拟出来的 IPMI 网口。这个模拟网口独立运作,有单独的 MAC 地址,不受 OS 电源与主接口状态影响,在系统里也不可见。

这样,就解决了不能新拉网线的问题。虽然共享接口的 IPMI 在实际生产环境中很少见,但在这种情况下实属方便。

接着要解决没有 IP 地址的问题。考虑到 IP 地址并不需要在公网上是可路由的,而服务器与同一子网中的其他服务器在同一个广播域中,第二层上互通(只要没有相应的隔离措施)。所以只要同时拥有一个子网里的多台服务器,就能够访问到各自的 IPMI 了。

这样,又解决了没有 IP 的问题。虽然一个广播域里塞两个子网很诡异,但 it works。

示例

假设配置成了如下图所示的拓扑(IP 的子网掩码均为 /24):

两台机器在 1.2.3.0/24 的 IP 是可以从公网路由的,这一块并无变动,所以不影响原有功能。

在 IPMI 的模式调为共享网口之后,在交换机视角看来,就是通向服务器的网线的另一端多了一台设备——这由服务器主板(或网卡)完成。

因为交换机在同一个广播域里,只是一个无情的二层数据包转发机。所以即使几台机子 IPMI 配置的 10.0.0.0/24 地址挤了进来,也毫无问题。软件层面上 ARP 协议会处理一切。

最后的结果就是,在左边两台服务器的 OS 里分别给网卡绑定 10.0.0.11/24、10.0.0.12/24,左一可以访问到 10.0.0.2、10.0.0.12,左二可以访问到 10.0.0.1、10.0.0.11,以此类推(访问不了自己的 IPMI 设备的 IP,见下文)。

使用时,只需要 SSH 到某台服务器上,把需要访问的 IPMI 的端口转发出来,或者直接开 SOCKS5 代理,就可以爽了。

某服务器的成功示例

缺点

这种解决方式有以下缺点:

  • 必须有在同一广播域中的多台主机,且需随时至少有一台存活,作为连接至其他服务器 IPMI 的跳板。
  • 因为共享网口并没有真正的交换功能,而交换机会丢弃目标 MAC 网口与来源 MAC 网口一致的数据包,服务器不能访问到自己 IPMI 的 IP。

但好歹能用,是吧~

Dell 的实现命令

IPMI 使用的网口的模式可以在 BIOS 中设置,但一些品牌的某些型号的机子也可以通过 ipmitool 远程配置。

下面是对几台 Dell 服务器的部署指令,根据服务器的具体型号和代数可能有所差异,服务器需要事先安装 ipmitool 程序并加载相应模块。

# 设置共享网口模式
sudo ipmitool delloem lan set shared with lom1
# 设置 IPMI IP
sudo ipmitool lan set 1 ipsrc static
sudo ipmitool lan set 1 ipaddr <ipmi_ip>
sudo ipmitool lan set 1 netmask 255.255.255.0
sudo ipmitool lan set 1 arp respond on
# 配置用户
sudo ipmitool user set password <user_id>
# 给服务器接口添加 IP
sudo ip a add <another_ip_in_ipmi_subnet>/24 dev eno1

变种

后来还遇到了几种限制较弱的情况,也将对应的 IPMI 的解决方案写到这里。

公网 IPv6 可用

后来发现你电沙河机房服务器是可以拿 IPv6 地址的,多得用不完,而且公网可路由、无防火墙

于是直接给服务器的 IPMI 配置公网 IPv6 地址就可以了,直接可以在全球访问。

主要注意点如下:

  • ipmitool 还不支持 IPv6 的配置,如果不想跑一趟机房,还是要按上文的方法配置,进入 web 界面,再配置 IPv6。
  • 虽然是 IPv6,但将 IPMI 暴露在公网依然存在安全风险,务必要使用强密码,并关注相关漏洞资讯,以免遭受固件 0day/1day 打击。

本来想套一个 Cloudflare,但因为远程 KVM 和映像挂载都不是标准端口,甚至不是 HTTP 协议,只好作罢。

受限的公网出口

这两天在给清水河某个小型集群配 IPMI,以避免重演年初 ASC 竞赛时的惨痛经历。但这个集群只有一台机子连接公网,其他机子和公网跳板机以另一个交换机相连。如果按上文方法,这个公网节点一挂就单点故障了。

所以另外准备了一台路由器接入公网,刷上 OpenWRT,并安装了 tinc 用作 VPN(吹爆 tinc)。

这个方法与上文的的方法在根本上联系不大,只是作为一个备忘,不要忘了 IPMI 还有共享网口这个模式,至少在这个场景里可以节省十来根网线。

一种受限环境下的 IPMI 部署方式”已有11条评论

  1. :%s/服用/复用/g

  2. 您这篇实在是太棒了 qwq 我现在正面临一模一样的困境,透过 Google 找到您这篇博客……实在是忍不住要留言感谢