在Kubernetes集群中,为了增强服务的安全性,我们经常需要限制对特定服务的访问,只允许特定的IP地址或IP段进行访问。通过Ingress配置白名单IP访问是一种常见且有效的安全措施。本文将详细介绍如何在Kubernetes中通过 Nginx Ingress 实现IP白名单访问控制。
什么是Ingress
Ingress是Kubernetes中的一个API对象,用于管理外部访问集群内服务的路由规则,通常通过HTTP/HTTPS协议。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。
为什么需要IP白名单
配置IP白名单的主要目的是增强安全性:
- 限制对敏感服务的访问
- 防止未授权的访问和攻击
- 满足合规性要求
- 控制流量来源
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注解的底屧行为:
-
转换为Nginx指令 :Ingress Controller会将此注解转换为Nginx的
allow和deny指令 -
配置位置 :这些指令会被插入到Nginx配置文件的
location块中 -
生成配置示例:
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; -
处理流程:
- Ingress Controller监听Ingress资源的变化
- 解析注解中的IP白名单配置
- 生成对应的Nginx配置并更新配置文件
- 重新加载Nginx使配置生效
-
生效范围:每个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
注意事项
- Nginx Ingress Controller版本 :确保使用的Nginx Ingress Controller版本支持
whitelist-source-range注解 - 网络架构:考虑服务是否通过负载均衡器或代理,确保获取到正确的客户端IP
- 测试验证:配置后务必测试白名单是否生效
- 日志监控:监控被拒绝的访问请求,确保配置正确且不影响正常用户
- 注解语法:确保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获取真实IPreal_ip_recursive on:从右向左解析,找到第一个不在信任列表中的IP作为真实IP
测试白名单配置
配置完成后,可以通过以下方式进行测试:
- 从允许的IP地址访问服务,确认可以正常访问
- 从未允许的IP地址访问服务,确认返回403 Forbidden
- 检查Ingress Controller的日志,确认拒绝记录
故障排除
如果白名单配置不生效,可以检查:
- Ingress Controller是否正确部署并运行
- annotations语法是否正确
- IP地址格式是否正确(CIDR表示法)
- 网络策略是否与Ingress配置冲突
- 客户端真实IP是否被正确传递
总结
通过Nginx Ingress Controller配置IP白名单是在Kubernetes中实现访问控制的有效方法。使用nginx.ingress.kubernetes.io/whitelist-source-range注解可以灵活地控制访问权限,该注解会转换为底层的Nginx allow/deny指令来实现访问控制。
正确配置IP白名单可以显著提高服务的安全性,但在实施时需要注意网络架构和Nginx Ingress Controller的版本兼容性问题。在实际应用中,建议结合其他安全措施,如身份认证、授权控制等,构建多层次的安全防护体系。
(END)