网络管理一本通
更新时间: 2025/10/15
在Gitcode上查看源码

1. BMC 网络管理介绍

bmc_network主要负责功能是IPv4/IPv6配置,从两个角度保障BMC的正常网络通信:

  1. 配置对外IP,用户可以通过BMC配置的管理IP连接BMC
  2. 配置对内IP,主要用于管理板与BMC之间或者同一机框内多个BMC之间的网络通信

组网举例:

eth0.702(702为VLAN号)网口设备属于对内网口组,网段为171.31.1。

eth0.701/eth2/eth3属于对外网口组,网段为xx.xx.16,对外的IP在这三个网口设备之间切换。

2. BMC 网络管理基础

2.1 常用名词

专用网口

BMC自身的网络设备,通常对应环境中的eth2

NCSI网口

NC-SI(Network Controller – Sideband Interface)技术,即网络控制器边带接口技术,NCSI网口指BMC通过NCSI线缆直连的网络设备,也可以理解除专用网口外所有的网口统称为NCSI网口,NCSI网口又可以分为PCIe/LOM/OCP等类型,例如当前DA123C环境中的eth0为PCIe网口。

VLAN

VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。 每个VLAN是一个广播域,VLAN内的主机间可以直接通信,而VLAN间则不能直接互通。这样,广播报文就被限制在一个VLAN内。

2.2 常用协议

IPv4与IPv6

ARP

LLDP

ICMP

DHCP

3. BMC 网络管理设计

3.1 常用类

IPv4

该类主要承载对外网口的IPv4信息,包括:IP地址、掩码、默认网关、地址获取模式(DHCP/Static)、备份IP(备份IP在DHCP模式下被激活)、备份掩码,并提供以上属性的修改接口(接口使用见part3)。

属性属性说明
IpModeIPv4的网络模式,DHCP/Static
IpAddrIP地址
BackupIpAddr备份IPv4地址
SubnetMaskIPv4子网掩码
BackupSubnetMask备份IPv4掩码
DefaultGatewayIPv4默认网关
EthName对外网口设备的名称:如eth0.701(701表示带了VLAN)

IPv6

该类主要承载对外网口的IPv6信息,包括:IP地址、前缀长度、默认网关、地址获取模式(DHCPv6/Static),并提供以上属性的修改接口(接口使用见part3)。

属性属性说明
IpModeIPv6的网络模式,DHCPv6/Static
IpAddrIP地址
PrefixLengthIPv6前缀长度
ScopeLink,Global
DefaultGatewayIPv6默认网关

EthernetInterfaces

该类主要承载对外网口的大部分信息,主要包括:

属性属性说明
EthName对外网口设备的名称:如eth0.701(701表示带了VLAN)
NetMode固定网口模式/自适应模式(按网卡优先级选择对外网口设备)
MacBMC对外的MAC地址
IpVersionIPv4/IPv6使能状态
PortId当前激活正在使用的网口ID,对应MgmtPort的Id
NcsiEnableNCSI使能状态
VLANEnableNCSI的VLAN使能状态
VLANIdNCSI的VLANId
LinkLocalAddressIPv6本地链路地址

MgmtPort

该类主要承载的是物理网卡信息,主要包括:

属性属性说明
Id唯一的标识(EthernetInterfaces的PortId指的就是这个Id),当前专用口固定1,后面从2开始并返回给network adapter
EthId关联的eth设备号,2代表eth2
DeviceId网卡设备信息,当前都是1,不关键
DevicePortId网卡上的端口号(一张网卡有多个端口),port1、port2
Silkscreen网卡丝印,Mgmt、Port1
AdaptiveFlag是否参与自适应标识
LinkStatus链路状态:Disconnected、Connected(专用口由bmc_network更新,NCSI口由network adapter更新)
Type网卡类型(PCIe/Dedicated/OCP/LOM等)
VLANEnabled当id = 1,表示专用口的VLAN信息,当id ≠ 1,表示NCSI口的VLAN信息
VLANIdVLAN ID
Priority自适应优先级

LldpConfig

该类主要承载LLDP的相关配置,主要包括:

属性属性说明
EnabledLLDP服务使能:true为使能,默认不使能
WorkModeLLDP工作模式,目前仅支持Tx模式
TxDelaySecondsLLDP Tx延时
TxIntervalSecondsLLDP Tx间隔时间
TxHoldLLDP Tx保持时间
LLDPSupportLLDP 功能支持开关,默认是不支持,不支持时不会启动 LLDP 服务以及服务例测
LLDPParseEnabledLLDP 解析功能支持开关,默认是不支持,不支持时不会解析 LLDP 报文
LLDPOverNCSIEnabledLLDP Over NCSI功能支持开关,默认是不支持,不支持时 LLDP 不会解析 NCSI 发送的报文
LLDPGetPortDescEnabledLLDP获取端口描述功能支持开关,默认是不支持,不支持时不会解析Port Desc字段

LLDPInfo

该类主要承载LLDP报文解析相关信息,主要包括:

属性属性说明
PortName报文解析出来的端口号
PortDesc报文解析出来的端口描述
SystemDesc报文解析出来的交换机型号
OrgSpec报文解析出来的组织型号
ManagementIP报文解析出来的管理地址
SlotId机柜端口对应的U位号,默认0

Assembly

该类主要承载LLDP报文解析相关信息,主要包括:

属性属性说明
HostName主机名
SystemGUID系统全局唯一标识符,用户可修改
DomainName域名
UUID设备全局唯一标识符,只能ipmi生成,不可修改
ManagementIP报文解析出来的管理地址
FQDN完全限定域名,FQDN由两部分组成:主机名.域名

Group

该类目前主要持久化了对外网口的MAC地址,主要包括:

属性属性说明
GroupId固定为EthGroup0
EthName对外网口名,eth2、eth0
EthId对外网口ID,2、0
Mac对外网口MAC,默认20:22:01:75:BC:60

EthMac

该类主要承载网口硬件相关配置,主要包括:

属性属性说明
GroupId网口组Id,EthGroup0、MaintEthGroup
EthName网口名,eth2、eth0
EthId对外网口ID,2、0
Mac网口MAC地址
MacUseEnabled可使用MAC地址标志,同一网口组只使能一个
SpeedDuplexEnable网口自协商模式使能
SpeedSetting网口速率:0:不涉及 1:10M, 2:100M, 3:1000M
DuplexSetting网口工作模式:0:不涉及配置 1:半双工 2:全双工

HeartBeat

该类主要承载内网心跳配置,主要包括:

属性属性说明
Name监控心跳的实体名称,IRMHeartBeat
Status当前心跳状态,Lost

EthGroup

该类主要承载内网、多个对外网口、维护网口配置,主要包括:

属性属性说明
GroupId网口组Id,唯一性
Name网口组名称,InnerEthGroup、MaintEthGroup、VethGroup
OutType网口组的类型:1:对内,2:对外,3:veth,4:Atlas计算节点近端维护内部网络,5:Atlas计算节点近端维护外出网络,6:SMM板浮动IP网络,7:SMM板出对板的内部网络,8:专用网口近端运维网络,9:机柜管理板内网,10: 机柜节点内网
ActiveEthId当前激活的网口号,例如eth2的话此处网口号为2
InnerNetWork内网网段,未使用
VLANId该网口组激活网口对应的VLANID
VLANEnabled该网口组激活网口对应的VLAN使能
EthAlias激活网口别名,有别名时取值最大为254(255表示没有别名网口),如eth2:0
InnerNetWork内网网段,172.31.1.0
IpAddrIPv4地址
BaseIpAddr基准IPv4地址,和IpAdd作比较,内网ip判断是否根据槽位号生成过Ip
SubnetMaskIPv4掩码
DefaultGatewayIPv4网关
Ipv6AddrIPv6地址
PrefixLengthIPv6前缀长
Ipv6DefaultGatewayIPv6网关
IpPolicyip生成策略:0:根据默认IP地址,1:根据槽位和基准IP地址生成
Status该IP是否在工作状态中
IpModeIPv4模式,Static或者DHCP
Ipv6ModeIPv6模式,Static或者DHCPv6
IpVersionIP协议类型,IPv4、IPv6、IPv4AndIPv6
AssociatedPortType网口组关联的网口类型
Channel网口对应LAN通道的channel number

类之间相互关系

3.2 bmc_network外网初始化流程

3.3 bmc_network内网初始化流程

3.4 DHCP任务流程

4. BMC 网络常用接口

4.1 IPMI接口

以下是常用的IPv4的原始IPMI命令以及简单说明,更多网络相关的标准IPMI命令请跳转 >> BMC网络标准ipmitool操作说明

设置外网IPv4地址

请求:

bash
ipmitool -H xx.xx.16.97 -I lanplus -p 623 -U <username> -P <password> -C 17 raw 0x0c 0x01 0x01 0x03 0x4c 0x4c 0x10 0x61

最后四个字节为IP地址对应的16进制数,例如上述命令表示设置IP为xx.xx.16.97。

响应:

无报错表示成功。

说明:

  1. 仅使能IPv6时,不允许设置IPv4地址
  2. 设置前若为DHCP模式,设置成功后将变成Static模式
  3. IP传入全0时,表示清除IPv4地址(掩码、网关也会被清除)

查询外网IPv4地址

请求:

bash
ipmitool -H xx.xx.16.203 -I lanplus -p 623 -U <username> -P <password> -C 17 raw 0x0c 0x02 0x01 0x03 0x00 0x00

响应:

11 4c 4c 10 cb

第一个字节固定返回11,后面4个字节表示IP地址对应的16进制数。

设置外网IPv4掩码

请求:

bash
ipmitool -H xx.xx.19.54 -I lanplus -p 623 -U <username> -P <password> -C 17 raw 0x0c 0x01 0x01 0x06 0xff 0xff 0xff 0x00

最后四个字节为掩码对应的16进制数,例如上述命令表示设置掩码为255.255.255.0。

响应:

无报错表示成功。

说明:

  1. 仅使能IPv6时,不允许设置IPv4掩码
  2. 掩码传入全0时,表示清除IPv4掩码(网关也会被清除)

查询外网IPv4掩码

请求:

bash
ipmitool -H xx.xx.16.203 -I lanplus -p 623 -U <username> -P <password> -C 17 raw 0x0c 0x02 0x01 0x06 0x00 0x00

响应:

11 ff ff ff 00

第一个字节固定返回11,后面4个字节表示掩码对应的16进制数。

设置外网IPv4网关

请求:

bash
ipmitool -H xx.xx.19.54 -I lanplus -p 623 -U <username> -P <password> -C 17 raw 0x0c 0x01 0x01 0x0c 0x4c 0x4c 0x10 0x01

响应:

无报错表示成功。

说明:

  1. 仅使能IPv6时,不允许设置IPv4网关
  2. 如果设置的网关和当前IP不在同一网段,则此次操作失败
  3. 网关传入全0时,表示清除IPv4网关

查询外网IPv4网关

请求:

bash
ipmitool -H xx.xx.16.203 -I lanplus -p 623 -U <username> -P <password> -C 17 raw 0x0c 0x02 0x01 0x0c 0x00 0x00

响应:

11 4c 4c 10 01

第一个字节固定返回11,后面4个字节表示网关对应的16进制数。

设置外网IPv4模式

请求:

bash
ipmitool -H xx.xx.16.203 -I lanplus -p 623 -U <username> -P <password> -C 17 raw 0x0c 0x01 0x01 0x04 0x02

最后一个字节为模式:0x01(Static) 0x02(DHCP)。

响应:

无报错则设置成功。

说明:

  1. 仅使能IPv6时,不允许设置IPv4模式

查询外网IPv4模式

请求:

bash
ipmitool -H xx.xx.16.203 -I lanplus -p 623 -U <username> -P <password> -C 17 raw 0x0c 0x02 0x01 0x04 0x00 0x00

响应:

11 01

第一个字节固定返回11,第二个字节为模式:0x01(Static) 0x02(DHCP)。

4.2 RPC接口

IPv4

Ipv4SetIpAddr

回调函数: set_ipv4_addr

功能: 设置IPv4地址,只传IP和子网掩码。

前置条件:

  1. 校验入参IPv4地址有效性
  2. 校验入参子网掩码有效性
  3. ip_version需要支持IPv4
  4. 检查是否和内网、维护IP网段冲突

注意: DHCP模式下设置,会停止DHCP客户端,并切换为静态地址模式。

功能实现:

  1. 修改资源树和数据库信息
  2. 记录操作日志
  3. 通过socket实际设置IPv4地址和子网掩码【核心实现】
  4. 更新对外网络NAT表(网络地址转换表)的iptables规则
  5. 发射IPv4的IP、子网掩码变化信号
  6. 清除别名网口
  7. IP发生变化时修改iptables规则
  8. 广播ARP报文

Ipv4SetDefaultGateway

回调函数: set_ipv4_gateway

功能: 单独设置IPv4网关。

前置条件:

  1. 校验入参网关地址有效性
  2. ip_version需要支持IPv4
  3. 检查当前网关是否和要设置的IP在同一网段

功能实现:

  1. 修改资源树和数据库信息【DefaultGateway】
  2. 记录操作日志
  3. 通过socket实际设置IPv4网关【核心实现】
  4. 发射IPv4网关变化信号
  5. 广播ARP报文

Ipv4SetIpMaskGateway

回调函数: set_ipv4_mask_gateway

功能: 设置IPv4地址,需要传入IP和子网掩码、网关。

前置条件:

  1. 校验入参合法性
  2. 校验同网段
  3. 检查是否和其他IP冲突

注意: DHCP模式下设置,会停止DHCP客户端,并切换为静态地址模式。

功能实现:

  1. 修改数据库和资源树
  2. 记录操作日志
  3. 通过socket实际设置IPv4地址和子网掩码、默认网关【核心实现】
  4. 更新对外网络NAT表的iptables规则
  5. IP发生变化时修改iptables规则
  6. 发送IPv4信息变化信号
  7. 清除别名网口
  8. 广播ARP报文

Ipv4SetDedicatedMaintIpMask

回调函数: set_dedicated_maint_ipv4_mask

功能: 设置专用口运维IPv4地址和子网掩码。

前置条件:

  1. 校验入参合法性
  2. 校验同网段
  3. 检查是否和其他IP冲突

功能实现:

  1. 更新运维专用网络
    • 通过socket实际设置运维网口IPv4地址和子网掩码【核心实现】
    • 设置route_localnet为1,保证Web和SSH等服务正常
    • 更新运维网络NAT表的iptables规则
    • 运维网口配置后,导致ARP地址解析到维护IP,因此对外网口主动ARP报文,触发地址学习到对外IP
  2. 记录操作日志

IPv6

Ipv6SetIpAddr

回调函数: set_ipv6_addr

功能: 设置IPv6地址,只传IP和前缀,其中ipv6_addr为最简字符串形式,形如:fe80::格式。

前置条件:

  1. 校验IPv6地址合法性
  2. 校验前缀(前缀最大为128)
  3. ip_version需要支持IPv6

注意:

  1. 传入的prefix为0,则设置prefix为默认值64
  2. 如果设置前为DHCP模式,则需要关闭DHCPv6服务

功能实现:

  1. 记录操作日志
  2. 修改数据库和资源树
  3. 通过socket删除之前的IPv6信息
  4. 通过socket设置新的IPv6信息【核心实现】
  5. 发射IPv6的IP、前缀变化信号
  6. 发送邻居通告报文NA
  7. IPv6地址发生变化时修改ip6tables规则

Ipv6SetDefaultGateway

回调函数: set_ipv6_gateway

功能: 单独设置IPv6网关。

前置条件:

  1. 检验网关合法性
  2. 判断要设置的网关和此时的IP是否在同一网段
  3. ip_version需要支持IPv6

功能实现:

  1. 记录操作日志
  2. 修改资源树和数据库信息【DefaultGateway】
  3. 通过socket删除之前的IPv6网关
  4. 通过socket添加新IPv6网关【核心实现】
  5. 发射IPv6网关变化信号

Ipv6SetIpv6PrefixGateway

回调函数: set_ipv6_prefix_gateway

功能: 设置IPv6地址,需要传入IP和前缀、网关。

前置条件:

  1. Redfish场景下,IpAddr和PrefixLength任意一个合法均需要设置
  2. 校验IP、前缀、网关合法性
  3. 判断要设置的网关和此时的IP是否在同一网段
  4. ip_version需要支持IPv6

注意:

  1. Redfish场景InvalidIPv6Address报错
  2. 如果设置前为DHCP模式,则需要关闭DHCPv6服务
  3. 如果传入的prefix为0,则设置prefix为默认值64

功能实现:

  1. 记录操作日志
  2. 修改资源树和数据库信息
  3. 通过socket删除之前的IPv6网关
  4. 通过socket添加新IPv6网关【核心实现】
  5. 通过socket删除之前的IPv6信息
  6. 通过socket设置新的IPv6信息【核心实现】
  7. 发射IPv6的IP、前缀变化、网关变化信号
  8. 发送邻居通告报文NA
  9. IPv6地址发生变化时修改ip6tables规则

Ethernet

EthernetInterfacesGetAllPort

回调函数: get_all_port

功能实现:

遍历slot.Port,返回所有port信息:

  • Id
  • EthId
  • DeviceId
  • DevicePortId
  • Silkscreen
  • Type
  • AdaptiveFlag
  • LinkStatus
  • Mac

EthernetInterfacesSetNetworkConfig

回调函数: set_network_config

功能: 设置网络配置。

入参: NetMode、PortId、VLANEnable、VLANId

前置条件:

  1. 检查和内网VLAN是否冲突
  2. port id校验
  3. 自适应模式下,端口与之前的端口保持不变,不接受接口参数
  4. 如果在VLAN使能为false状态下仅修改vlan_id不重启网络

功能实现:

  1. NetMode包含自适应模式,固定网口模式
  2. 更新数据库和资源树信息
  3. 切换网口重启网络,更新对外网口多IP配置
  4. NCSI网口VLAN信息变化重启网络

EthernetInterfacesAddMgmtPort

回调函数: add_mgmt_port

功能: 添加管理端口。

注意:

  1. port id不等于0,有则更新,没有注册指定port id的端口
  2. 等于0表示是新注册的,需要自动生成port id
  3. 专用网口不提供修改

功能实现:

  1. 添加资源树对象

EthernetInterfacesDeleteMgmtPort

回调函数: delete_mgmt_port

功能: 删除管理端口。

注意:

  1. port_id = 255时删除所有NCSI网口
  2. id为专用网口,不可删除

功能实现:

  1. 删除资源树对象

EthernetInterfacesSetVLANConfig

回调函数: rpc_set_vlan

功能: 设置VLAN。

前置条件:

  1. 检查和内网VLAN是否冲突
  2. 检查vlan_id范围(1-4094)

功能实现:

  1. 根据port_type设置vlan_id,当前只支持两种type:0-NCSI、1-Dedicated
  2. 判断当前机型是否支持专用网口设置VLAN,不支持直接返回失败

HeartBeatBeat

回调函数: heart_beat:beat

功能: 心跳。

EthernetInterfacesNetworkFailover

回调函数: network_failover

功能: 网络更新主备状态。

注意: LSW切换port时主动发送ARP报文和NA报文。

iptables

EthernetInterfacesAddIptablesRule

回调函数: add_iptables_rule

入参: interface_name、ip_addr

注意:

  1. ssdp组件间内部调该RPC方法时不用记录操作日志
  2. 入参校验,包括特殊字符校验

功能实现:

  1. OS执行iptables命令实现

EthernetInterfacesAddIp6tablesRule

回调函数: add_ip6tables_rule

入参: interface_name、ipv6_addr

注意:

  1. ssdp组件间内部调该RPC方法时不用记录操作日志
  2. 入参校验,包括特殊字符校验

功能实现:

  1. OS执行ip6tables命令实现

NatConfigAddNatRule

回调函数: add_nat_rule

功能: 添加地址映射规则。

入参: service_name、reg_params

注意:

  1. 目前一种网口类型只支持新增一个指定IP的转发规则
  2. 基于当前所有service的转发规则,新增由ps.Address转发至内部地址的转发规则,暂时只支持IPv4

功能实现:

  1. add_multi_nat_rules or add_single_nat_rule
  2. OS执行iptables命令实现

NatConfigUpdateNatRule

回调函数: update_nat_rule

功能: 更新地址映射规则。

入参: service_name、reg_params

功能实现:

  1. update_multi_nat_rules or update_single_nat_rule
  2. OS执行iptables命令实现
  3. 网口不可用则设置route_localnet为0