我现在正在使用带有nginx容器的GKE(kubernetes)来代理不同的服务。我的目标是阻止一些国家。我曾经使用过nginx及其有用的geoip模块来做到这一点,但截至目前,kubernetes并没有将真正的客户ip转发到容器,因此我无法使用它。
在kubernetes实际转发真实IP之前过滤掉各国的最简单/最便宜的解决方案是什么?
答案 0 :(得分:1)
首先在GKE上如果你正在使用nginx入口控制器,你应该关闭默认的GCE控制器:https://github.com/kubernetes/contrib/blob/master/ingress/controllers/gce/BETA_LIMITATIONS.md#disabling-glbc,否则他们会打架。
kubernetes不会将真实的客户IP转发到容器
只有当您使用NodePort和/或LoadBalancer类型的服务进行kube-proxy时才会出现这种情况。使用nginx入口控制器你正在运行hostPort,所以它实际上是隐藏源ip的docker守护进程。我认为docker的更高版本默认为iptables模式,它再次显示源ip。
同时你可以通过运行nginx控制器来获取源ip,如:https://gist.github.com/bprashanth/a4b06004a0f9c19f9bd41a1dcd0da0c8
然而,这使用主机网络,而不是最好的选择。插入后,您可以使用代理协议获取src ip:https://github.com/kubernetes/contrib/tree/master/ingress/controllers/nginx#proxy-protocol
另外(如果您还没有意识到)nginx控制器默认启用geoip模块:https://github.com/kubernetes/contrib/tree/master/ingress/controllers/nginx#nginx-status-page
如果您需要更多帮助,请打开一个问题。
编辑:代理协议可通过目前处于alpha状态的ssl代理进行:https://cloud.google.com/compute/docs/load-balancing/tcp-ssl/#proxy_protocol_for_retaining_client_connection_information
答案 1 :(得分:1)
您可以使用自定义nginx图像并使用地图创建过滤器
// this in http section
map $geoip_country_code $allowed_country {
default yes;
UY no;
CL no;
}
和
// this inside some location where you want to apply the filter
if ($allowed_country = no) {
return 403;
}