K8s 通过 Nginx Ingress 配置白名单IP访问限制

在Kubernetes集群中,为了增强服务的安全性,我们经常需要限制对特定服务的访问,只允许特定的IP地址或IP段进行访问。通过Ingress配置白名单IP访问是一种常见且有效的安全措施。本文将详细介绍如何在Kubernetes中通过 Nginx Ingress 实现IP白名单访问控制。

什么是Ingress

Ingress是Kubernetes中的一个API对象,用于管理外部访问集群内服务的路由规则,通常通过HTTP/HTTPS协议。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。

为什么需要IP白名单

配置IP白名单的主要目的是增强安全性:

  1. 限制对敏感服务的访问
  2. 防止未授权的访问和攻击
  3. 满足合规性要求
  4. 控制流量来源

Nginx Ingress Controller支持

IP白名单功能通过Nginx Ingress Controller实现,它是在Kubernetes环境中最常用和成熟的Ingress Controller之一。Nginx Ingress Controller通过在Ingress资源上添加annotations来配置IP白名单功能。

通过Nginx Ingress配置IP白名单

Nginx Ingress Controller通过在Ingress资源上添加annotations来配置IP白名单。核心注解是nginx.ingress.kubernetes.io/whitelist-source-range,它实际上会将配置转换并注入到底层的Nginx配置中。

注解工作原理

nginx.ingress.kubernetes.io/whitelist-source-range注解的底屧行为:

  1. 转换为Nginx指令 :Ingress Controller会将此注解转换为Nginx的allow和deny指令

  2. 配置位置 :这些指令会被插入到Nginx配置文件的location块中

  3. 生成配置示例:

    nginx 复制代码
    # 注解配置:whitelist-source-range: "192.168.10.100,192.168.1.0/24,10.0.0.0/8"
    
    # 生成的Nginx配置:
    allow 192.168.10.100;
    allow 192.168.1.0/24;
    allow 10.0.0.0/8;
    deny all;
  4. 处理流程:

    • Ingress Controller监听Ingress资源的变化
    • 解析注解中的IP白名单配置
    • 生成对应的Nginx配置并更新配置文件
    • 重新加载Nginx使配置生效
  5. 生效范围:每个Ingress的注解只影响该Ingress资源中定义的所有路径和规则

基本配置示例

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    # 配置允许访问的IP白名单(包含网段和固定IP)
    nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.10.100,192.168.1.0/24,10.0.0.0/8"
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80

注意事项

  1. Nginx Ingress Controller版本 :确保使用的Nginx Ingress Controller版本支持whitelist-source-range注解
  2. 网络架构:考虑服务是否通过负载均衡器或代理,确保获取到正确的客户端IP
  3. 测试验证:配置后务必测试白名单是否生效
  4. 日志监控:监控被拒绝的访问请求,确保配置正确且不影响正常用户
  5. 注解语法:确保IP地址格式正确(CIDR表示法),多个IP用逗号分隔

如何自定义获取真实IP地址的Header

当客户端请求经过代理或负载均衡器时,需要配置自定义Header来获取真实客户端IP。

配置示例

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: custom-header-whitelist
  annotations:
    # 白名单配置
    nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.1.0/24,10.0.0.0/8"
    # 自定义真实IP Header配置
    nginx.ingress.kubernetes.io/configuration-snippet: |
      set_real_ip_from 10.0.0.0/8;
      set_real_ip_from 172.16.0.0/12;
      set_real_ip_from 192.168.0.0/16;
      real_ip_header X-Forwarded-For;
      real_ip_recursive on;
spec:
  rules:
  - host: secure.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: secure-service
            port:
              number: 80

说明:

  • set_real_ip_from:设置信任的代理IP段
  • real_ip_header:指定从哪个Header获取真实IP
  • real_ip_recursive on:从右向左解析,找到第一个不在信任列表中的IP作为真实IP

测试白名单配置

配置完成后,可以通过以下方式进行测试:

  1. 从允许的IP地址访问服务,确认可以正常访问
  2. 从未允许的IP地址访问服务,确认返回403 Forbidden
  3. 检查Ingress Controller的日志,确认拒绝记录

故障排除

如果白名单配置不生效,可以检查:

  1. Ingress Controller是否正确部署并运行
  2. annotations语法是否正确
  3. IP地址格式是否正确(CIDR表示法)
  4. 网络策略是否与Ingress配置冲突
  5. 客户端真实IP是否被正确传递

总结

通过Nginx Ingress Controller配置IP白名单是在Kubernetes中实现访问控制的有效方法。使用nginx.ingress.kubernetes.io/whitelist-source-range注解可以灵活地控制访问权限,该注解会转换为底层的Nginx allow/deny指令来实现访问控制。

正确配置IP白名单可以显著提高服务的安全性,但在实施时需要注意网络架构和Nginx Ingress Controller的版本兼容性问题。在实际应用中,建议结合其他安全措施,如身份认证、授权控制等,构建多层次的安全防护体系。


(END)

相关推荐
赵文宇(温玉)5 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
张洛闻Eren5 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
Thneonl6 天前
你的 Pod 为什么 Pending:调度器两阶段
后端·kubernetes
不吃香菜kkk、6 天前
CI/CD(GitOps)学习与部署手册
运维·云原生·容器·kubernetes·云计算·jenkins·argocd
ysu_03147 天前
【2026】K8s GPU调度空占怎么解?Kueue与Volcano Gang配置
云原生·kubernetes·gpu算力·volcano·ai基础设施·kueue·gang scheduling
哈__7 天前
KES-Operator重塑Kubernetes环境下的KES数据库集群管理
数据库·kubernetes·operator·kes
九皇叔叔7 天前
K8S 资源菜单
docker·容器·kubernetes·k8s
安易算力7 天前
PUE优化工程实践:从1.5到1.2的制冷架构与气流组织改造路径
网络·python·容器·架构·kubernetes
kuroomi8 天前
Ingress-Nginx与kubernetes 网络
linux·运维·网络·kubernetes
程序猿阿越8 天前
containerd如何创建Pod
后端·kubernetes·源码阅读