有哪些可能的国家过滤方式?

时间:2016-06-30 06:15:21

标签: geolocation kubernetes google-kubernetes-engine

我现在正在使用带有nginx容器的GKE(kubernetes)来代理不同的服务。我的目标是阻止一些国家。我曾经使用过nginx及其有用的geoip模块来做到这一点,但截至目前,kubernetes并没有将真正的客户ip转发到容器,因此我无法使用它。

在kubernetes实际转发真实IP之前过滤掉各国的最简单/最便宜的解决方案是什么?

  • 外部服务?
  • 简单的谷歌服务器,只有nginx,过滤国家,转发到kubernetes(在价格和可靠性方面不是很好)?
  • 修改kube-proxy(我在这里和那里看到过,但看起来有点奇怪)?
  • 前端geoip过滤(嗯,到目前为止更糟糕的想法)?
谢谢你!

2 个答案:

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