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)

相关推荐
2301_810746311 天前
CKA冲刺40天笔记 - day24 Kubernetes Clusterrole 和 Clusterrole Binding
笔记·容器·kubernetes
ICT董老师1 天前
通过kubernetes部署nginx + php网站环境
运维·nginx·云原生·容器·kubernetes·php
原神启动11 天前
K8S(八)—— Kubernetes Pod 资源限制 + 探针(Probe)解析
云原生·容器·kubernetes
zxnbmk1 天前
【7】Kubernetes存储(本章知识密度较高,仅浅浅了解后续详解)
linux·云原生·容器·kubernetes
叫致寒吧1 天前
pod详解
云原生·kubernetes
水上冰石1 天前
查看k8s下Jenkins的插件在宿主机的路径
容器·kubernetes·jenkins
孤岛悬城1 天前
58 k8s之pod
云原生·容器·kubernetes
可爱又迷人的反派角色“yang”1 天前
k8s(五)
linux·运维·docker·云原生·容器·kubernetes
oMcLin1 天前
如何在Ubuntu 22.10上通过配置K3s轻量级Kubernetes集群,提升边缘计算环境的资源管理能力?
ubuntu·kubernetes·边缘计算
水上冰石1 天前
如何查看k8s按照的jenkins插件的路径
容器·kubernetes·jenkins