我在Google Cloud Patform的容器引擎(GKE)和负载均衡器(GLB)之上运行kubernetes(k8s)。我想将k8s入口的访问权限限制为IP白名单。
这是我可以直接用k8s或GLB做的事情,还是我需要通过代理运行它来为我做这件事?
答案 0 :(得分:2)
在nginx-ingress中将源IP列入白名单的方法是使用以下注释。
ingress.kubernetes.io/whitelist-source-range
但遗憾的是,Google Cloud Load Balancer并不支持它,AFAIK。
如果你正在使用nginx入口控制器,你可以使用它。
注释的值可以是逗号分隔的CIDR范围。
更多关于whitelist annotation。
Issue tracker了解Google Cloud Load Balancer对白名单源IP的支持。
答案 1 :(得分:1)
如今,您可以按照此处指定的方式使用nginx.ingress.kubernetes.io/whitelist-source-range
:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#whitelist-source-range
您需要确保将外部IP转发到您的服务-https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
如果您使用的是NGINX Ingress,请确保在Ingress Controllers服务上设置externalTrafficPolicy: Local
。
答案 2 :(得分:0)
您可以使用CORS,并且仅允许前端的IP攻击您的微服务。
答案 3 :(得分:0)
答案 4 :(得分:-1)
GCP的防火墙规则无法应用于它与在GKE上创建的Ingress连接的Global Load Balancer。如果您只想限制对特定IP地址的访问(例如:通过VPN连接的用户,在这种情况下为VPN网关的IP地址),那么GCP(尤其是GKE)就没有现成的解决方案。
Nginx和Http标头“ x-forwarded-for”进行抢救
如果您使用的是GKE,则可能是您具有微服务体系结构,并且使用的是API网关,则很可能是Nginx是API网关。所有需要做的就是将nginx配置为仅允许具有以下IP的请求
user.ext.static.ip →客户端的公共IP
app.global.static.ip →分配给Ingress的全局静态IP
nginx conf
location /my_service {
rewrite_by_lua_file validate_ip.lua;
proxy_pass http://my_service
}
validate_ip.lua
local cjson = require "cjson"
local status=""
local headers=ngx.req.get_headers()
local source_ips=headers["x-forwarded-for"]
if source_ips ~= "111.222.333.444, 555.666.777.888" then
status="NOT_ALLOWED"
end
if status ~= "" then
ngx.status = ngx.HTTP_UNAUTHORIZED
ngx.header.content_type = "application/json; charset=utf-8"
ngx.say(cjson.encode({ status = "ERROR",message=status.."YOUR_MESSAGE" }))
return ngx.exit(ngx.HTTP_UNAUTHORIZED)
end
有关更多详细信息,read here