如何通过IP/IP段限制Azure K8s中Keycloak管理控制台的访问?
解决方案
1. 修复真实客户端IP识别问题
Azure AKS的负载均衡器会将客户端真实IP携带在X-Forwarded-For请求头中,但Nginx Ingress默认不会信任这个头部,导致它识别到的请求来源是LB的IP而非客户端真实IP。需要修改Ingress Controller的配置来启用真实IP解析:
修改ConfigMap
找到Nginx Ingress的ConfigMap(通常位于kube-system命名空间,名称为nginx-ingress-controller),添加以下配置项:
apiVersion: v1 kind: ConfigMap metadata: name: nginx-ingress-controller namespace: kube-system data: use-forwarded-headers: "true" # 替换为你的AKS负载均衡器实际IP段,生产环境建议精准配置,测试可临时用0.0.0.0/0 proxy-real-ip-cidr: "10.0.0.0/8,172.16.0.0/12,192.168.0.0/16" real-ip-header: "X-Forwarded-For"
重启Ingress Controller使配置生效
kubectl rollout restart deployment nginx-ingress-controller -n kube-system
2. 正确配置/admin路径的IP限制(解决404问题)
之前的404错误是因为Ingress路径规则未正确将请求转发至Keycloak服务,反而尝试读取Nginx本地静态文件。要实现仅限制管理控制台(/admin路径)的IP访问,需拆分创建两个Ingress资源:
管理控制台专用Ingress(带IP白名单)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: keycloak-admin-ingress annotations: # 填入允许访问的IP/IP段,多个用逗号分隔 nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.1.0/24,10.0.0.5/32" spec: ingressClassName: nginx rules: - host: account.qa.oly.nova-x.co http: paths: - path: /admin pathType: Prefix backend: service: name: keycloak-service # 替换为你的Keycloak服务名称 port: number: 8080
公共路径Ingress(无IP限制)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: keycloak-public-ingress spec: ingressClassName: nginx rules: - host: account.qa.oly.nova-x.co http: paths: - path: / pathType: Prefix backend: service: name: keycloak-service port: number: 8080
应用配置
kubectl apply -f keycloak-admin-ingress.yaml kubectl apply -f keycloak-public-ingress.yaml
3. 验证效果
- 从允许的IP访问
https://account.qa.oly.nova-x.co/admin,可正常进入Keycloak管理控制台; - 从非允许IP访问上述路径,会返回
403 Forbidden; - 访问Keycloak其他公共路径(如
/auth),所有IP均可正常访问。
内容的提问来源于stack exchange,提问作者One Developer
相关产品推荐
相关产品推荐

