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的allowdeny指令

  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)

相关推荐
哈里谢顿8 小时前
Kubernetes Service动手实验
kubernetes
哈里谢顿9 小时前
k8s实用脚本
kubernetes
❥ღ Komo·9 小时前
K8s集群搭建全流程详解
云原生·容器·kubernetes
努力发光的程序员12 小时前
互联网大厂Java面试场景:微服务与云原生架构实践
spring cloud·kubernetes·微服务架构·共享经济·netflix oss·故障容错
新手小白*15 小时前
K8S-Pod资源对象
云原生·容器·kubernetes
拾心2118 小时前
【云运维】K8s管理(二)
运维·容器·kubernetes
小牛马爱写博客19 小时前
Kubernetes Service 核心概念与实操指南(分别使用yaml文件和命令行分别创建service版)
云原生·容器·kubernetes
来旺20 小时前
互联网大厂Java面试实战:核心技术栈与业务场景深度解析
java·spring boot·docker·kubernetes·mybatis·hibernate·microservices
哦你看看21 小时前
K8S-单Master集群部署
云原生·容器·kubernetes