3、IB网络访问控制列表(ACL):ACL基础概念、基于L2/L3的ACL配置、ACL在IB网络中的最佳实践

各位好,咱们今天聊聊IB网络里的ACL。说实话,很多做传统以太网的朋友刚接触IB时,总觉得ACL这玩意儿没啥好讲的。但我在几个数据中心项目里吃过亏之后,才真正意识到——IB的ACL,跟以太网完全是两码事。

你想想看,IB网络里跑的是RDMA流量,延迟要求是微秒级的。如果ACL配置不当,轻则性能腰斩,重则整个集群通信瘫痪。嗯,咱们今天就把这块掰开揉碎了讲清楚。

IB网络ACL 基础概念 L2 ACL配置 L3 ACL配置 LID/GID过滤 P_Key匹配 Q_Key过滤 GRH过滤 最佳实践:最小权限 + 性能优先

3.1 ACL基础概念:IB世界的门禁系统

ACL,全称是Access Control List。说白了,就是给IB网络装个门禁。谁可以进,谁不可以进,全凭这张表说了算。

但IB的ACL跟以太网有个本质区别。以太网ACL通常是在交换机端口上做过滤,而IB的ACL是在分区管理器(SM)层面生效的。这意味着什么?意味着ACL规则是在整个子网管理层面统一管控的,而不是分散在每个端口上。

核心要点:IB的ACL本质上是一种基于路径的访问控制。它不是在数据包经过时才检查,而是在路径建立阶段就决定了——这个通信能不能建立。

我记得第一次配置IB ACL时,犯了个低级错误。我以为跟以太网一样,在端口上配个deny就完事了。结果发现IB的ACL规则是全局生效的,配错了整个集群的节点都互相ping不通。嗯,那次教训挺深刻的。

IB ACL主要基于以下几个维度做过滤:

  • LID(Local Identifier):本地标识符,相当于IB网络里的MAC地址
  • GID(Global Identifier):全局标识符,相当于IPv6地址
  • P_Key(Partition Key):分区键,IB网络隔离的核心机制
  • Q_Key(Queue Key):队列键,用于控制对特定队列对的访问

3.2 基于L2的ACL配置:LID级别的精细管控

L2 ACL,说白了就是基于LID的过滤。LID是IB网络二层的基础地址,每个端口都有一个唯一的LID。

配置L2 ACL时,我建议你遵循一个原则:先白名单,再黑名单。什么意思?先允许必要的通信,再拒绝不需要的。这样不容易误伤。

来看一个实际配置示例:

# 创建一个ACL规则组
ibacl_create -g my_l2_acl

# 添加规则:允许特定LID的通信
ibacl_add -g my_l2_acl -s 0x0002 -d 0x0005 -a allow

# 添加规则:拒绝某个LID访问
ibacl_add -g my_l2_acl -s 0x0003 -d 0x0005 -a deny

# 将ACL应用到端口
ibacl_apply -p 0x12 -g my_l2_acl

小技巧:我个人习惯在配置L2 ACL时,先用ibacl_show命令查看当前LID分配情况。这样可以避免配错LID。我曾经因为手误把LID写成了0x0000,结果导致整个端口无法通信,排查了半天才发现是LID写错了。

L2 ACL的匹配规则是按顺序执行的。规则列表从上到下依次匹配,一旦匹配就停止。所以规则的顺序很重要。我一般把最严格的规则放在前面,宽松的放在后面。

3.3 基于L3的ACL配置:GID级别的跨子网管控

L3 ACL,就是基于GID的过滤。GID是IB网络三层的地址,类似于IPv6地址。当你的IB网络跨越多个子网时,L3 ACL就派上用场了。

配置L3 ACL时,有一个坑我必须要提醒你——GID的格式问题。GID由64位的GUID和64位的子网前缀组成,写错了格式ACL根本不会生效。

来看一个L3 ACL的配置示例:

# 创建L3 ACL规则组
ibacl_create -g my_l3_acl -t l3

# 添加规则:允许特定GID的通信
ibacl_add -g my_l3_acl -s fe80::2:c903:4:5 -d fe80::2:c903:4:10 -a allow

# 添加规则:拒绝某个子网的所有通信
ibacl_add -g my_l3_acl -s fe80::2:c903:4:0/112 -d any -a deny

# 应用L3 ACL
ibacl_apply -p 0x12 -g my_l3_acl

警告:L3 ACL的匹配会消耗更多的SM计算资源。如果你的网络规模很大(超过1000个节点),我建议你优先使用L2 ACL。我曾经在一个2000节点的集群上用了L3 ACL,结果SM的CPU直接飙到90%,路径建立时间从毫秒级变成了秒级。

为什么会这样?因为L3 ACL需要解析GID,而GID的匹配涉及更复杂的计算。L2 ACL只匹配16位的LID,速度自然快得多。

3.4 ACL在IB网络中的最佳实践

这部分是我最想跟你分享的。踩过的坑多了,自然就总结出经验了。

3.4.1 最小权限原则

这是安全领域的老生常谈,但在IB网络中尤其重要。只允许必要的通信,其他的全部拒绝。我见过太多人图省事,直接配个permit any,结果安全事件发生时追悔莫及。

3.4.2 性能优先原则

ACL规则越多,SM的负担越重。我建议你:

  • 规则数量控制在100条以内
  • 优先使用L2 ACL,少用L3 ACL
  • 避免使用通配符(any)规则

3.4.3 分层隔离策略

结合P_Key和ACL做分层隔离。P_Key做粗粒度的分区隔离,ACL做细粒度的端口级控制。这样既保证了性能,又实现了安全。

隔离层级 粒度 性能影响 推荐场景
P_Key 粗粒度(分区级) 租户隔离、业务隔离
L2 ACL 中粒度(端口级) 特定节点间的访问控制
L3 ACL 细粒度(子网级) 跨子网的精细管控

避坑指南:我曾经在一个金融客户的项目中,为了追求极致安全,配了300多条ACL规则。结果业务上线后,存储节点的IOPS直接掉了30%。后来我花了整整两天时间,把规则精简到50条,性能才恢复正常。所以,ACL不是越多越好,够用就行

3.4.4 定期审计与清理

ACL规则会随着业务变化而积累。我建议每季度做一次ACL审计,清理掉不再使用的规则。可以用ibacl_show -s命令查看每条规则的命中次数,那些长期命中次数为0的规则,基本可以删掉了。

3.4.5 变更管理

修改ACL前,一定要先在测试环境验证。我见过有人直接在现网改了ACL,结果导致整个存储集群断连,业务中断了2小时。嗯,那次事故的责任人就是我。从那以后,我养成了一个习惯——任何ACL变更,先在测试环境跑一遍,确认无误后再上生产

好了,关于IB网络ACL的内容就讲到这里。记住一句话:ACL是IB网络安全的第一道防线,但绝不是最后一道。合理使用,才能既安全又高效。


公众号:蓝海资料掘金营,微信deep3321