Kubernetes网络策略限制下如何实现IP地址黑名单配置
Kubernetes官方文档关于NetworkPolicy能力边界的表述准确:原生NetworkPolicy资源仅支持allow规则,无显式deny动作,一旦策略选中目标Pod,会默认拒绝所有不在allow列表内的流量,属于纯白名单模型,无法直接实现“默认放通所有流量、仅拒绝指定IP/网段”的黑名单效果。如果硬要用原生资源模拟该能力,只能将所有需要放通的地址段全量写入allow规则,把待拉黑的IP排除在外,这种方式维护成本极高,地址段变动时极易出现配置错误,生产环境不推荐使用。
可行实现方案
CNI插件扩展策略(推荐,覆盖东西+南北向流量,性能损耗低)
主流第三方CNI插件均对原生网络策略能力做了扩展,支持显式deny规则,可直接配置IP黑名单,无需额外部署其他组件:
- Calico:支持命名空间级
NetworkPolicy和集群级GlobalNetworkPolicy资源,可通过order字段调整规则优先级(数值越小优先级越高),将deny规则优先级调高即可优先匹配拦截黑名单IP。
全局IP黑名单配置示例:apiVersion: projectcalico.org/v3 kind: GlobalNetworkPolicy metadata: name: global-ip-blacklist spec: selector: all() order: 5 types: - Ingress ingress: - action: Deny source: nets: - 1.2.3.4/32 # 待拦截的单个IP - 10.0.5.0/24 # 待拦截的IP段 - Cilium:基于eBPF实现,提供命名空间级
CiliumNetworkPolicy和集群级CiliumClusterwideNetworkPolicy资源,原生支持ingressDeny/egressDeny规则,除IP黑名单外还支持基于FQDN、服务身份的拦截规则,性能表现优异。
集群级IP黑名单配置示例:apiVersion: cilium.io/v2 kind: CiliumClusterwideNetworkPolicy metadata: name: cluster-ip-blacklist spec: endpointSelector: {} # 匹配集群内所有工作负载端点 ingressDeny: - fromCIDR: - 1.2.3.4/32 - 10.0.5.0/24
Ingress层拦截(仅适用南北向外部流量,配置成本最低)
如果只需要拦截从外部访问集群的流量,不需要管控集群内部服务间的东西向流量,可直接在Ingress Controller层配置IP黑名单:
- Nginx Ingress:可通过ConfigMap配置全局IP黑名单,也可通过Ingress注解为单个服务配置独立黑名单规则
- Traefik、APISIX等Ingress/API网关类组件均原生支持IP黑白名单配置,规则生效快,无需调整集群网络模型。
服务网格授权策略(适合已落地服务网格的场景)
如果集群已经部署了Istio、Linkerd等服务网格,可直接使用网格提供的授权策略实现deny规则和IP黑名单,除三层、四层的IP拦截外,还支持基于HTTP路径、请求头、服务身份等七层维度的访问控制,能力更灵活。
以Istio AuthorizationPolicy配置IP黑名单示例:
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: ip-blacklist namespace: default spec: action: DENY rules: - from: - source: ipBlocks: - 1.2.3.4/32 - 10.0.5.0/24
选型参考
- 仅需拦截外部公网入口流量:优先选择Ingress层配置,无额外改造成本
- 需要同时管控集群内服务间东西向流量:优先使用当前集群所用CNI的扩展策略能力,无额外组件开销,性能最优
- 已落地服务网格、需要七层细粒度访问控制:直接使用服务网格授权策略即可
内容的提问来源于stack exchange,提问作者hobyte
相关产品推荐
相关产品推荐

