在GCP的GKE上限制Kubernetes中的IP访问

vzgqcmou  于 2023-06-21  发布在  Kubernetes
关注(0)|答案(5)|浏览(210)

我在Google Cloud Patform的容器引擎(GKE)和负载均衡器(GLB)上运行kubernetes(k8s)。我想限制访问k8s入口的IP白名单。
这是我可以直接在k8s或GLB中做的事情吗?还是我需要通过代理来运行?

yacmzcpb

yacmzcpb1#

在nginx-ingress中将源IP列入白名单的方法是使用下面的注解。
ingress.kubernetes.io/whitelist-source-range

但不幸的是,Google Cloud Load Balancer不支持AFAIK。

如果你正在使用nginx ingress控制器,你可以使用它。
注解的值可以是逗号分隔的CIDR范围。
关于白名单注解的更多信息。
Issue tracker,了解Google Cloud Load Balancer支持将源IP列入白名单的进展。

dly7yett

dly7yett2#

现在你可以使用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

gojuced7

gojuced73#

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

q9yhzks0

q9yhzks04#

GCP的防火墙规则不能应用于它与在GKE上创建的Ingress连接的全局负载均衡器。如果要将访问限制为仅访问特定的IP地址(例如:用户通过VPN连接,在这种情况下是VPN网关的IP地址),那么在GCP上就没有现成的解决方案,特别是GKE。

Nginx和Http header“x-forwarded-for”来救急

如果你使用的是GKE,那么很可能你有一个微服务架构,并且你使用的是API网关,很可能Nginx就是API网关。所有需要做的就是配置nginx只允许具有以下IP的请求

user.ext.static.ip→客户端公网IP
app.global.static.ip→ Ingress全局静态IP

nginx配置

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

ut6juiuv

ut6juiuv5#

你可以使用CORS,只允许来自前端的IP访问你的微服务。

相关问题