1. BMC 网络管理介绍
bmc_network主要负责功能是IPv4/IPv6配置,从两个角度保障BMC的正常网络通信:
- 配置对外IP,用户可以通过BMC配置的管理IP连接BMC
- 配置对内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)。
| 属性 | 属性说明 |
|---|---|
| IpMode | IPv4的网络模式,DHCP/Static |
| IpAddr | IP地址 |
| BackupIpAddr | 备份IPv4地址 |
| SubnetMask | IPv4子网掩码 |
| BackupSubnetMask | 备份IPv4掩码 |
| DefaultGateway | IPv4默认网关 |
| EthName | 对外网口设备的名称:如eth0.701(701表示带了VLAN) |
IPv6
该类主要承载对外网口的IPv6信息,包括:IP地址、前缀长度、默认网关、地址获取模式(DHCPv6/Static),并提供以上属性的修改接口(接口使用见part3)。
| 属性 | 属性说明 |
|---|---|
| IpMode | IPv6的网络模式,DHCPv6/Static |
| IpAddr | IP地址 |
| PrefixLength | IPv6前缀长度 |
| Scope | Link,Global |
| DefaultGateway | IPv6默认网关 |
EthernetInterfaces
该类主要承载对外网口的大部分信息,主要包括:
| 属性 | 属性说明 |
|---|---|
| EthName | 对外网口设备的名称:如eth0.701(701表示带了VLAN) |
| NetMode | 固定网口模式/自适应模式(按网卡优先级选择对外网口设备) |
| Mac | BMC对外的MAC地址 |
| IpVersion | IPv4/IPv6使能状态 |
| PortId | 当前激活正在使用的网口ID,对应MgmtPort的Id |
| NcsiEnable | NCSI使能状态 |
| VLANEnable | NCSI的VLAN使能状态 |
| VLANId | NCSI的VLANId |
| LinkLocalAddress | IPv6本地链路地址 |
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信息 |
| VLANId | VLAN ID |
| Priority | 自适应优先级 |
LldpConfig
该类主要承载LLDP的相关配置,主要包括:
| 属性 | 属性说明 |
|---|---|
| Enabled | LLDP服务使能:true为使能,默认不使能 |
| WorkMode | LLDP工作模式,目前仅支持Tx模式 |
| TxDelaySeconds | LLDP Tx延时 |
| TxIntervalSeconds | LLDP Tx间隔时间 |
| TxHold | LLDP Tx保持时间 |
| LLDPSupport | LLDP 功能支持开关,默认是不支持,不支持时不会启动 LLDP 服务以及服务例测 |
| LLDPParseEnabled | LLDP 解析功能支持开关,默认是不支持,不支持时不会解析 LLDP 报文 |
| LLDPOverNCSIEnabled | LLDP Over NCSI功能支持开关,默认是不支持,不支持时 LLDP 不会解析 NCSI 发送的报文 |
| LLDPGetPortDescEnabled | LLDP获取端口描述功能支持开关,默认是不支持,不支持时不会解析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 |
| IpAddr | IPv4地址 |
| BaseIpAddr | 基准IPv4地址,和IpAdd作比较,内网ip判断是否根据槽位号生成过Ip |
| SubnetMask | IPv4掩码 |
| DefaultGateway | IPv4网关 |
| Ipv6Addr | IPv6地址 |
| PrefixLength | IPv6前缀长 |
| Ipv6DefaultGateway | IPv6网关 |
| IpPolicy | ip生成策略:0:根据默认IP地址,1:根据槽位和基准IP地址生成 |
| Status | 该IP是否在工作状态中 |
| IpMode | IPv4模式,Static或者DHCP |
| Ipv6Mode | IPv6模式,Static或者DHCPv6 |
| IpVersion | IP协议类型,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地址
请求:
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。
响应:
无报错表示成功。
说明:
- 仅使能IPv6时,不允许设置IPv4地址
- 设置前若为DHCP模式,设置成功后将变成Static模式
- IP传入全0时,表示清除IPv4地址(掩码、网关也会被清除)
查询外网IPv4地址
请求:
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掩码
请求:
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。
响应:
无报错表示成功。
说明:
- 仅使能IPv6时,不允许设置IPv4掩码
- 掩码传入全0时,表示清除IPv4掩码(网关也会被清除)
查询外网IPv4掩码
请求:
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网关
请求:
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响应:
无报错表示成功。
说明:
- 仅使能IPv6时,不允许设置IPv4网关
- 如果设置的网关和当前IP不在同一网段,则此次操作失败
- 网关传入全0时,表示清除IPv4网关
查询外网IPv4网关
请求:
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模式
请求:
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)。
响应:
无报错则设置成功。
说明:
- 仅使能IPv6时,不允许设置IPv4模式
查询外网IPv4模式
请求:
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和子网掩码。
前置条件:
- 校验入参IPv4地址有效性
- 校验入参子网掩码有效性
- ip_version需要支持IPv4
- 检查是否和内网、维护IP网段冲突
注意: DHCP模式下设置,会停止DHCP客户端,并切换为静态地址模式。
功能实现:
- 修改资源树和数据库信息
- 记录操作日志
- 通过socket实际设置IPv4地址和子网掩码【核心实现】
- 更新对外网络NAT表(网络地址转换表)的iptables规则
- 发射IPv4的IP、子网掩码变化信号
- 清除别名网口
- IP发生变化时修改iptables规则
- 广播ARP报文
Ipv4SetDefaultGateway
回调函数: set_ipv4_gateway
功能: 单独设置IPv4网关。
前置条件:
- 校验入参网关地址有效性
- ip_version需要支持IPv4
- 检查当前网关是否和要设置的IP在同一网段
功能实现:
- 修改资源树和数据库信息【DefaultGateway】
- 记录操作日志
- 通过socket实际设置IPv4网关【核心实现】
- 发射IPv4网关变化信号
- 广播ARP报文
Ipv4SetIpMaskGateway
回调函数: set_ipv4_mask_gateway
功能: 设置IPv4地址,需要传入IP和子网掩码、网关。
前置条件:
- 校验入参合法性
- 校验同网段
- 检查是否和其他IP冲突
注意: DHCP模式下设置,会停止DHCP客户端,并切换为静态地址模式。
功能实现:
- 修改数据库和资源树
- 记录操作日志
- 通过socket实际设置IPv4地址和子网掩码、默认网关【核心实现】
- 更新对外网络NAT表的iptables规则
- IP发生变化时修改iptables规则
- 发送IPv4信息变化信号
- 清除别名网口
- 广播ARP报文
Ipv4SetDedicatedMaintIpMask
回调函数: set_dedicated_maint_ipv4_mask
功能: 设置专用口运维IPv4地址和子网掩码。
前置条件:
- 校验入参合法性
- 校验同网段
- 检查是否和其他IP冲突
功能实现:
- 更新运维专用网络
- 通过socket实际设置运维网口IPv4地址和子网掩码【核心实现】
- 设置route_localnet为1,保证Web和SSH等服务正常
- 更新运维网络NAT表的iptables规则
- 运维网口配置后,导致ARP地址解析到维护IP,因此对外网口主动ARP报文,触发地址学习到对外IP
- 记录操作日志
IPv6
Ipv6SetIpAddr
回调函数: set_ipv6_addr
功能: 设置IPv6地址,只传IP和前缀,其中ipv6_addr为最简字符串形式,形如:fe80::格式。
前置条件:
- 校验IPv6地址合法性
- 校验前缀(前缀最大为128)
- ip_version需要支持IPv6
注意:
- 传入的prefix为0,则设置prefix为默认值64
- 如果设置前为DHCP模式,则需要关闭DHCPv6服务
功能实现:
- 记录操作日志
- 修改数据库和资源树
- 通过socket删除之前的IPv6信息
- 通过socket设置新的IPv6信息【核心实现】
- 发射IPv6的IP、前缀变化信号
- 发送邻居通告报文NA
- IPv6地址发生变化时修改ip6tables规则
Ipv6SetDefaultGateway
回调函数: set_ipv6_gateway
功能: 单独设置IPv6网关。
前置条件:
- 检验网关合法性
- 判断要设置的网关和此时的IP是否在同一网段
- ip_version需要支持IPv6
功能实现:
- 记录操作日志
- 修改资源树和数据库信息【DefaultGateway】
- 通过socket删除之前的IPv6网关
- 通过socket添加新IPv6网关【核心实现】
- 发射IPv6网关变化信号
Ipv6SetIpv6PrefixGateway
回调函数: set_ipv6_prefix_gateway
功能: 设置IPv6地址,需要传入IP和前缀、网关。
前置条件:
- Redfish场景下,IpAddr和PrefixLength任意一个合法均需要设置
- 校验IP、前缀、网关合法性
- 判断要设置的网关和此时的IP是否在同一网段
- ip_version需要支持IPv6
注意:
- Redfish场景InvalidIPv6Address报错
- 如果设置前为DHCP模式,则需要关闭DHCPv6服务
- 如果传入的prefix为0,则设置prefix为默认值64
功能实现:
- 记录操作日志
- 修改资源树和数据库信息
- 通过socket删除之前的IPv6网关
- 通过socket添加新IPv6网关【核心实现】
- 通过socket删除之前的IPv6信息
- 通过socket设置新的IPv6信息【核心实现】
- 发射IPv6的IP、前缀变化、网关变化信号
- 发送邻居通告报文NA
- 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
前置条件:
- 检查和内网VLAN是否冲突
- port id校验
- 自适应模式下,端口与之前的端口保持不变,不接受接口参数
- 如果在VLAN使能为false状态下仅修改vlan_id不重启网络
功能实现:
- NetMode包含自适应模式,固定网口模式
- 更新数据库和资源树信息
- 切换网口重启网络,更新对外网口多IP配置
- NCSI网口VLAN信息变化重启网络
EthernetInterfacesAddMgmtPort
回调函数: add_mgmt_port
功能: 添加管理端口。
注意:
- port id不等于0,有则更新,没有注册指定port id的端口
- 等于0表示是新注册的,需要自动生成port id
- 专用网口不提供修改
功能实现:
- 添加资源树对象
EthernetInterfacesDeleteMgmtPort
回调函数: delete_mgmt_port
功能: 删除管理端口。
注意:
- port_id = 255时删除所有NCSI网口
- id为专用网口,不可删除
功能实现:
- 删除资源树对象
EthernetInterfacesSetVLANConfig
回调函数: rpc_set_vlan
功能: 设置VLAN。
前置条件:
- 检查和内网VLAN是否冲突
- 检查vlan_id范围(1-4094)
功能实现:
- 根据port_type设置vlan_id,当前只支持两种type:0-NCSI、1-Dedicated
- 判断当前机型是否支持专用网口设置VLAN,不支持直接返回失败
HeartBeatBeat
回调函数: heart_beat:beat
功能: 心跳。
EthernetInterfacesNetworkFailover
回调函数: network_failover
功能: 网络更新主备状态。
注意: LSW切换port时主动发送ARP报文和NA报文。
iptables
EthernetInterfacesAddIptablesRule
回调函数: add_iptables_rule
入参: interface_name、ip_addr
注意:
- ssdp组件间内部调该RPC方法时不用记录操作日志
- 入参校验,包括特殊字符校验
功能实现:
- OS执行iptables命令实现
EthernetInterfacesAddIp6tablesRule
回调函数: add_ip6tables_rule
入参: interface_name、ipv6_addr
注意:
- ssdp组件间内部调该RPC方法时不用记录操作日志
- 入参校验,包括特殊字符校验
功能实现:
- OS执行ip6tables命令实现
NatConfigAddNatRule
回调函数: add_nat_rule
功能: 添加地址映射规则。
入参: service_name、reg_params
注意:
- 目前一种网口类型只支持新增一个指定IP的转发规则
- 基于当前所有service的转发规则,新增由ps.Address转发至内部地址的转发规则,暂时只支持IPv4
功能实现:
- add_multi_nat_rules or add_single_nat_rule
- OS执行iptables命令实现
NatConfigUpdateNatRule
回调函数: update_nat_rule
功能: 更新地址映射规则。
入参: service_name、reg_params
功能实现:
- update_multi_nat_rules or update_single_nat_rule
- OS执行iptables命令实现
- 网口不可用则设置route_localnet为0