nsm
版本信息
| 项目 | 内容 |
|---|---|
| 组件版本 | 1.120.2 |
| 首发版本 | openUBMC 1.0.0 |
| 文档作者 | openUBMC 社区 |
| 最后更新 | 2026-05-06 |
1. 组件概述
1.1 组件简介
nsm(network service mgmt,网络服务管理)是 openUBMC 系统中负责管理网络服务的组件。该组件统一管理网络服务的端口号、监听状态,以及开源网络服务的启动控制和配置文件更新。nsm 通过 iptables 实现端口转发功能,所有网络服务监听环回地址,由 iptables 将外部请求转发到对应服务的内部端口,从而实现统一的安全管理和灵活的端口分配。
1.2 解决什么问题
nsm 组件解决了 openUBMC 系统中网络服务管理的以下问题:
- 多个网络服务的端口统一管理,避免端口冲突
- 端口转发规则的统一维护和更新
- 网络服务的动态注册和配置
- 开源服务(SSH、NGINX、SNMP)的启动控制
- 服务使能状态与转发规则的联动
1.3 核心功能
- 核心功能一:端口管理(主/备端口、内部端口、端口共享、端口冲突检测)
- 核心功能二:网络服务使能状态管理
- 核心功能三:服务注册机制(支持自研和应用市场组件)
- 核心功能四:iptables 端口转发规则管理
- 核心功能五:SSH 加密算法配置
1.4 关键术语表
| 术语 | 解释 |
|---|---|
| nsm | 网络服务管理组件 |
| 内部端口 | 服务实际监听的环回地址端口 |
| 外部端口 | 对外暴露的端口,通过 iptables 转发 |
| 端口共享 | 两个或多个协议共用同一个端口号 |
| 服务注册 | 自研组件通过 D-Bus 接口注册端口到 nsm |
| PortShareWith/PortShareFrom | 端口共享配置参数 |
1.5 外部交互边界图
2. API 使用说明与示例
2.1 服务端口查询与设置
busctl --user introspect bmc.kepler.nsm /bmc/kepler/Managers/1/NetworkProtocol/HTTPS bmc.kepler.Managers.NetworkProtocol.PortConfig
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.SetPorts method a{ss}qq - -
.DefaultPort property q 443 emits-change
.DefaultSparePort property q 0 emits-change
.Enabled property b true emits-change writable
.Port property q 443 emits-change writable
.PortCount property y 1 emits-change
.SparePort property q 0 emits-change writable
.SystemId property y 1 emits-change功能说明
查询和设置网络服务的外部端口号及使能状态。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.Managers.NetworkProtocol.PortConfig |
| 首发版本 | openUBMC 1.0.0 |
| 废弃状态 | 正常可用 |
参数说明
属性参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| Port | 输入/输出 | uint16 | 主端口号 | 1~65535 |
| SparePort | 输入/输出 | uint16 | 备用端口号(可选) | 0~65535,0 表示不使用 |
| Enabled | 输入/输出 | bool | 服务使能状态 | true、false |
方法配置参数
| 方法名 | 入参类型 | 出参类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| SetPorts | - | 设置端口号 | q: 1~65535; q: 0~65535,0 表示不使用 |
返回值与异常
| 返回值 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| 成功 | 配置生效 | 参数合法且端口可用 | 无 |
| 失败 | 配置失败 | 端口冲突或参数非法 | 检查端口是否被占用,修改端口号 |
应用场景
当需要修改网络服务的外部端口号或启用/禁用服务时使用。典型场景:
- 避免端口冲突,修改服务端口
- 临时禁用某个网络服务
- 配置主备端口以提高可用性
限制条件
- 外部端口号不能与已存在的端口冲突
- 主备端口号不能相同
- 端口设置为 0 表示不使用该端口
- 修改端口会同步更新 iptables 转发规则
调试示例
命令行调试
# 查询 Video 服务端口配置
busctl --user introspect bmc.kepler.nsm \
/bmc/kepler/Managers/1/NetworkProtocol/Video
# 设置 Video 服务端口为 3000
busctl --user call bmc.kepler.nsm \
/bmc/kepler/Managers/1/NetworkProtocol/Video \
org.freedesktop.DBus.Properties Set \
ssv bmc.kepler.Managers.NetworkProtocol.PortConfig Port q 3000
# 禁用 Video 服务
busctl --user call bmc.kepler.nsm \
/bmc/kepler/Managers/1/NetworkProtocol/Video \
org.freedesktop.DBus.Properties Set \
ssv bmc.kepler.Managers.NetworkProtocol.PortConfig Enabled b false
# 启用 Video 服务
busctl --user call bmc.kepler.nsm \
/bmc/kepler/Managers/1/NetworkProtocol/Video \
org.freedesktop.DBus.Properties Set \
ssv bmc.kepler.Managers.NetworkProtocol.PortConfig Enabled b true2.2 网络服务注册
busctl --user introspect bmc.kepler.nsm /bmc/kepler/Managers/1/NetworkProtocol bmc.kepler.Managers.NetworkProtocol
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.Register method a{ss}(ssaqss) aq -功能说明
自研或应用市场提供的网络服务通过 Register 方法注册默认端口号到 nsm 进行统一管理。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.Managers.NetworkProtocol |
| 首发版本 | openUBMC 1.0.0 |
| 废弃状态 | 正常可用 |
参数说明
方法配置参数
| 方法名 | 入参类型 | 出参类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| Register | ssaqss | aq | 注册服务 | s: ProtocolName s: ProtocolType aq: DefaultPorts主、备默认端口号 s: PortShareWith s: SharePortFrom |
返回值与异常
| 返回值类型 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| 内部端口号列表 | 注册成功 | 参数合法 | 使用返回的内部端口监听 |
| 错误码 | 注册失败 | 端口冲突或参数错误 | 检查参数和端口配置 |
返回值说明
- PortCount=1 时,返回 1 个内部端口号
- PortCount=2 时,返回 2 个内部端口号
- PortCount=0 时,不返回内部端口号(从其他服务共享端口)
应用场景
当自研组件或应用市场服务需要监听网络端口时,必须先注册到 nsm:
- 避免 IP 地址和端口冲突
- 统一管理网络服务
- 自动配置 iptables 转发规则
限制条件
- 只有外部通信端口需要注册,内部通信端口不需要
- 注册的端口号可以与其他服务共享(通过 PortShareWith/PortShareFrom)
- 共享端口服务的参数必须互锁配置
- 首次注册默认端口冲突时,服务无法使能,需要修改端口号
2.3 SSH 加密算法配置
busctl --user introspect bmc.kepler.nsm /bmc/kepler/Managers/1/NetworkProtocol/SSH/Algorithms/HostKeyAlgorithms/1 bmc.kepler.Managers.NetworkProtocol.SSH.Algorithm
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.Enabled property b true emits-change writable
.Name property s "ssh-ed25519" emits-change功能说明
查询和设置 SSH 服务支持的加密算法,包括主机密钥算法、加密算法、MAC 算法等。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.Managers.NetworkProtocol.SSH.Algorithm |
| 首发版本 | openUBMC 1.0.0 |
| 废弃状态 | 正常可用 |
参数说明
属性参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| Enabled | 输入/输出 | bool | 算法使能状态 | true、false |
| Name | 输出 | string | 算法名称 | 具体算法字符串 |
返回值与异常
| 返回值 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| 成功 | 配置生效 | 参数合法 | 无 |
| 失败 | 配置失败 | 算法名称错误 | 检查算法名称 |
应用场景
当需要配置 SSH 服务的安全策略时:
- 禁用不安全的加密算法
- 仅启用符合企业安全标准的算法
- 调试 SSH 连接问题
限制条件
- 修改算法配置后需要重启 SSH 服务生效
- 建议至少保留一种安全的加密算法
- 某些算法可能受 SSH 库版本支持限制
调试示例
命令行调试
# 查询 SSH 主机密钥算法
busctl --user introspect bmc.kepler.nsm \
/bmc/kepler/Managers/1/NetworkProtocol/SSH/Algorithms/HostKeyAlgorithms/1
# 启用 RSA 主机密钥算法
busctl --user call bmc.kepler.nsm \
/bmc/kepler/Managers/1/NetworkProtocol/SSH/Algorithms/HostKeyAlgorithms/1 \
org.freedesktop.DBus.Properties Set \
ssv bmc.kepler.Managers.NetworkProtocol.SSH.Algorithm Enabled b true2.4 SNMP 配置查询
busctl --user introspect bmc.kepler.nsm /bmc/kepler/Managers/1/NetworkProtocol/SNMP bmc.kepler.Managers.NetworkProtocol.SNMP
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.EngineId property s "xxxxxx" emits-change
.HideCommunityStrings property b false emits-change writable
.SNMPSupported property b true emits-change
.SNMPv1Enabled property b false emits-change writable
.SNMPv2cEnabled property b false emits-change writable
.SNMPv3Enabled property b true emits-change writable
.SysContact property s "" emits-change writable
.SysLocation property s "" emits-change writable
.SysName property s "BMC" emits-change writable
.SysNameSyncEnabled property b false emits-change writable功能说明
查询 SNMP 服务的配置信息。
| 属性 | 内容 |
|---|---|
| 接口名 | bmc.kepler.Managers.NetworkProtocol.SNMP |
| 首发版本 | openUBMC 1.0.0 |
| 废弃状态 | 正常可用 |
参数说明
属性参数说明
| 参数名 | 方向 | 类型 | 描述 | 取值范围 |
|---|---|---|---|---|
| EngineId | 输出 | string | 引擎ID | |
| HideCommunityStrings | 输入/输出 | bool | 是否隐藏团体名 | true、false |
| SNMPSupported | 输出 | bool | 是否支持SNMP | true、false |
| SNMPv1Enabled | 输入/输出 | bool | 是否启用SNMPv1 | true、false |
| SNMPv2cEnabled | 输入/输出 | bool | 是否启用SNMPv2c | true、false |
| SNMPv3Enabled | 输入/输出 | bool | 是否启用SNMPv3 | true、false |
| SysContact | 输入/输出 | string | 系统联系人 | |
| SysLocation | 输入/输出 | string | 系统位置 | |
| SysName | 输入/输出 | string | 系统名称 | |
| SysNameSyncEnabled | 输入/输出 | bool | 是否从主机名同步系统名 | true、false |
返回值与异常
| 返回值 | 含义 | 触发条件 | 处理建议 |
|---|---|---|---|
| 成功 | 查询成功 | 服务正常运行 | 无 |
| 失败 | 查询/设置失败 | 服务异常 | 检查服务状态 |
应用场景
查询 SNMP 服务配置和状态,确认服务是否正常运行。
限制条件
- SNMP 团体名配置由 iam 组件管理,需要调用 iam 接口设置
- 端口号默认为 161
调试示例
命令行调试
# 查询 SNMP 服务配置
busctl --user introspect bmc.kepler.nsm \
/bmc/kepler/Managers/1/NetworkProtocol/SNMP \
bmc.kepler.Managers.NetworkProtocol.SNMP3. 组件扩展案例
不适用
4. 日志说明
4.1 一键日志收集
| 文件路径 | 内容说明 |
|---|---|
| /var/log/app.log | nsm 组件日志 |
| /var/log/operation.log | nsm 操作日志 |
| /dev/shm/log/web/access_log | nginx服务访问日志 |
| /dev/shm/log/web/error_log | nginx服务错误日志 |
4.2 关键日志信息
| 日志片段 | 日志级别 | 含义解读 | 建议处理动作 |
|---|---|---|---|
| 2026-05-03 17:21:05.390935 nsm NOTICE: xxxxxx | NOTICE | nsm 组件重要功能执行节点日志 | 用于判断重要功能执行到的节点状态 |
| 2026-05-03 17:21:05.390939 nsm WARNING: xxxxxx | WARNING | nsm 组件告警日志 | 用于记录功能执行告警的原因 |
| 2026-05-03 17:21:05.390939 nsm ERROR: xxxxxx | ERROR | nsm 组件错误日志 | 用于记录功能执行错误的原因 |
| 2026-05-06 20:44:20 Redfish,xxxxxx,nsm,Set SNMP Trap version to (SNMPv1) successfully(or failed) | OPERATION | 服务配置设置成功或失败的操作日志 | 用于判断配置设置是否成功 |
| xxxxxx [2026-05-07T06:07:42+08:00] 1778105262.118 0.146 "POST /redfish/v1/EventService/Subscriptions HTTP/1.1" 201 1231 "-" "HttpClient" "-" | ACCESS | nginx服务访问日志 | 用于判断api请求是否到达nginx服务 |
| 2026/05/07 06:09:10 [error] 23612#0: *17121 open() "/opt/bmc/web/htdocs/extern/custom/style_config.json" failed | ERROR | nginx服务错误日志 | 用于排查nginx服务自身异常 |
5. 问题定界指南
5.1 典型问题定界
| 现象描述 | 是否为本组件问题 | 判断依据 | 关键证据收集方法 |
|---|---|---|---|
| 服务无法从外部访问 | 可能是 | 检查服务使能状态和端口配置 | 查看 nsm 日志,使用 busctl 查询服务状态 |
| 端口设置失败 | 是 | 端口冲突或参数错误 | 查看错误日志,检查端口占用情况 |
| iptables 规则丢失 | 是 | 规则未正确创建或被清除 | 检查 iptables 规则列表 |
| 服务注册失败 | 可能是 | 参数错误或端口冲突 | 查看注册返回码和日志 |
| SSH 无法连接 | 可能是 | SSH 服务或算法配置问题 | 检查 sshd 进程和算法配置 |
| 端口共享不生效 | 是 | 共享参数配置错误 | 检查 PortShareWith/From 配置 |
5.3 调试方法
开启调试日志
# 开启 nsm 详细日志
busctl --user call bmc.kepler.nsm \
/bmc/kepler/nsm/MicroComponent \
bmc.kepler.MicroComponent.Debug SetDlogLevel a{ss}sy 0 debug 1
# 查看实时日志
tail -f /var/log/app.log复现问题方法
前置条件设置:
- 确保 nsm 服务正常运行
- 确认网络服务已启动
- 确认 iptables 服务正常
操作步骤:
- 查询当前服务配置和状态
- 修改服务端口或使能状态
- 观察 iptables 规则变化
- 从外部测试服务连接
预期结果:
- 服务状态变化正确
- iptables 规则同步更新
- 外部可以正常访问服务
# 查询服务状态
busctl --user call bmc.kepler.nsm \
/bmc/kepler/Managers/1/NetworkProtocol/SSH \
org.freedesktop.DBus.Properties Get \
ss bmc.kepler.Managers.NetworkProtocol.Protocol Enabled
# 查看 iptables 转发规则
iptables -t nat -L -n -v
ip6tables -t nat -L -n -v
# 查看端口监听
netstat -ntulp | grep sshd常用调试命令
# 查看 nsm 资源树
busctl --user tree bmc.kepler.nsm
# 查看特定服务详情
busctl --user introspect bmc.kepler.nsm \
/bmc/kepler/Managers/1/NetworkProtocol/SSH
# 查看 iptables 所有转发规则
iptables -t nat -L -n -v
ip6tables -t nat -L -n -v
# 查看特定服务的端口监听
netstat -ntulp | grep <端口号>
ss -tulpn | grep <端口号>
# 测试端口连通性
telnet <IP> <端口>
nc -zv <IP> <端口>6. 常见问题解答
Q1:为什么服务配置了端口但外部无法访问?
问题描述 网络服务已配置端口号并使能,但从外部无法访问该服务。
一句话答案 检查服务使能状态、iptables 转发规则和服务内部监听状态。
根因说明 可能原因包括:服务未使能、iptables 规则未正确创建、服务内部未监听、防火墙阻止。
解决方案
- 使用
busctl查询服务 Enabled 属性,确认为 true - 使用
iptables -t nat -L -n -v检查转发规则是否存在 - 使用
netstat -ntulp检查服务是否监听内部端口 - 检查防火墙规则是否阻止外部访问
- 使用
规避方案 修改端口前先确认端口未被占用,避免端口冲突。
适用版本 openUBMC 1.0.0 以上
Q2:端口冲突如何处理?
问题描述 设置服务端口时提示端口冲突,无法保存配置。
一句话答案 修改为其他未占用的端口号,或者停止占用该端口的服务。
根因说明 nsm 会检查外部端口是否与其他服务的默认端口或正在使用的端口冲突。
解决方案
- 使用
netstat -tulpn查看端口占用情况 - 修改为其他可用端口号(建议使用 5000~10000 范围)
- 或者停止占用该端口的服务后再设置
- 使用
规避方案 在规划服务端口时,提前查询并分配不冲突的端口。
适用版本 openUBMC 1.0.0 以上
Q3:自研服务如何注册到 nsm?
问题描述 开发了新的网络服务,不知道如何将其端口注册到 nsm 进行管理。
一句话答案 调用 nsm 的 Register 方法,提供服务名称、端口数量、默认端口和协议类型等参数。
根因说明 nsm 提供服务注册机制,自研服务必须注册后才能避免端口冲突。
解决方案
- 准备注册参数:服务名称、端口数量、默认端口、协议类型
- 调用 Register 方法进行注册
- 获取返回的内部端口号
- 服务监听返回的内部端口(127.0.0.1:port 和 [::2]:port)
适用版本 openUBMC 1.0.0 以上
Q4:如何配置端口共享?
问题描述 两个协议需要使用同一个端口号,不知道如何配置端口共享。
一句话答案 通过 PortShareWith 和 PortShareFrom 参数配置端口共享,两个服务的参数必须互锁。
根因说明 端口共享用于 IPMI 的 RMCP 和 RMCP+ 等需要共用端口的协议。
解决方案
- 服务 A 设置 PortShareWith 为服务 B 的名称
- 服务 B 设置 PortShareFrom 为服务 A 的名称
- 两个服务的参数必须互锁,否则共享不生效
- 共享端口的服务端口数量可以不同
规避方案 仔细核对两个服务的共享参数配置,确保互锁正确。
适用版本 openUBMC 1.0.0 以上
Q5:SSH 连接失败怎么办?
问题描述 SSH 服务已使能,但客户端无法连接或连接后立即断开。
一句话答案 检查 SSH 服务状态、加密算法配置和 hostkey 文件。
根因说明 可能原因包括:sshd 未启动、加密算法不匹配、hostkey 文件缺失或权限错误。
解决方案
- 检查 sshd 进程:
ps -elf | grep sshd - 检查端口监听:
netstat -ntulp | grep :22 - 检查 hostkey 文件是否存在:
ls -la /data/trust/etc/ssh/ssh_host_* - 检查 hostkey 文件权限,应为 600
- 检查 SSH 加密算法配置,确认客户端和服务器支持的算法有交集
- 检查 sshd 进程:
规避方案 定期检查 SSH 服务状态,保持加密算法配置合理。
适用版本 openUBMC 1.0.0 以上
Q6:如何确认 iptables 规则是否生效?
问题描述 修改了服务端口,不确定 iptables 转发规则是否正确更新。
一句话答案 使用 iptables 命令查看 NAT 表的转发规则,确认规则存在且正确。
根因说明 nsm 会在服务使能/禁用或端口变更时自动更新 iptables 规则。
解决方案
- 查看 IPv4 转发规则:
iptables -t nat -L -n -v - 查看 IPv6 转发规则:
ip6tables -t nat -L -n -v - 查找对应服务的规则,确认目标地址为 127.0.0.1
- 测试外部连接验证规则是否生效
- 查看 IPv4 转发规则:
规避方案 修改服务配置后,立即检查 iptables 规则是否正确更新。
适用版本 openUBMC 1.0.0 以上
附录
附录A 参考资料
- openUBMC 官网: https://www.openubmc.cn/
- iptables 用户指南:
man iptables - SSH 协议规范: RFC 4251-4256
- SNMP 协议规范: RFC 1157
附录B 支持的网络服务
| 服务名称 | 默认端口 | 协议类型 | 端口数量 | 说明 |
|---|---|---|---|---|
| SSH | 22 | TCP | 1 | 安全外壳协议 |
| HTTP | 80 | TCP | 1 | 超文本传输协议 |
| HTTPS | 443 | TCP | 1 | HTTP over TLS |
| KVMIP | 2198 | TCP | 1 | KVM over IP |
| VirtualMedia | 8208 | TCP | 1 | 虚拟媒体服务 |
| Video | 2199 | TCP | 1 | 视频重定向服务 |
| SNMP | 161 | UDP | 1 | 简单网络管理协议 |
| VNC | 5900 | TCP | 1 | 虚拟网络计算 |
| RMCP | 623/664 | UDP | 2 | RMCP 协议(与 RMCP+ 共享端口) |
| RMCPPlus | 623/664 | UDP | 2 | RMCP+ 协议(与 RMCP 共享端口) |
附录C 修订记录
| 版本 | 日期 | 修订人 | 修订内容 |
|---|---|---|---|
| v1.0 | 2026-05-06 | openUBMC | 初始版本创建 |