限制在KCP中使用IP访问GCP的GKE

时间:2017-12-19 18:48:04

标签: kubernetes google-cloud-platform google-kubernetes-engine

我在Google Cloud Patform的容器引擎(GKE)和负载均衡器(GLB)之上运行kubernetes(k8s)。我想将k8s入口的访问权限限制为IP白名单。

这是我可以直接用k8s或GLB做的事情,还是我需要通过代理运行它来为我做这件事?

5 个答案:

答案 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-rangehttps://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)

您可以使用Cloud Armor,添加策略,创建允许/拒绝规则,然后只需将k8s LB附加到目标中即可。

enter image description here

enter image description here

答案 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