Geo是geographic的缩写,意思是地理的,GeoIP即为IP地理位置数据库,可以根据IP获得地理位置信息。GeoLite2是GeoIP2的免费版本,与GeoIP2数据库相比准确性较差。 GeoIP库可以根据IP地址(支持IPv4 和 IPv6), 定位该IP所在的 洲、经纬度、国家、省市、ASN 等信息。
背景信息:
某用户由于某些原因,需要在ACK上使用geoip2来限制国家级别的ip访问限制,如只允许中国访问,ingress 已经默认集成了geoip,但是geoip已经很久不维护了,信息不准确,因此促使了本篇文档的产生
1,下载geoip2的库文件(这个是我当时测试找的三方地址,仅供参考)
https://github.com/P3TERX/GeoLite.mmdb
2,开启geoip2,需要在configmap里面设置
坑点1:
这里走文件的方式去使用新的数据库,生产环境走volume去挂载,注意了,需要三个文件 如ASN,city,country都放进去
坑点2:
注意缩进,yaml的缩进差一个括号都不行
use-geoip2: "true" http-snippet: geoip2 /etc/nginx/geoip/GeoLite2-Country.mmdb { $geoip2_data_country_iso_code country iso_code; } map $geoip2_data_country_iso_code$is_ch_country { default no; CN yes; } use-geoip2: "true" http-snippet: geoip2 /etc/nginx/geoip/GeoLite2-Country.mmdb { $geoip2_data_country_iso_code country iso_code; } map $geoip2_data_country_iso_code$is_ch_country { default no; 默认所有国家都不允许访问 CN yes; 中国打开,即只有中国的ip能访问 }
3,设置ingress的geoip设置
/
# cat geoip.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/server-snippet: | if ($is_ch_country= no) { return 403; 如果不是中国的ip,返回403 } name: my-geo namespace: default spec: rules: - host: mygeo.cf406d8459c2c4f63855b2165c77601cb.cn-beijing.alicontainer.com http: paths: - backend: serviceName: my-geo servicePort: 80 path: / pathType: ImplementationSpecific
4,设置完成后,ingress controller pod内的配置变化
module的加载
http段的geoip库加载
server段的判断条件
5,海内外访问测试:
国内:
国外:
return 444的时候,nginx识别不了,就给reset了,但是改成403就可以返回403了
关闭geo判断,试试海外是否ok了
可以访问了
PS:
必须是4层的lb +local模式的流量策略才能获取真实ip,这个geoip依赖的是建联ip,如果前端有7层代理如经过CDN WAF 等,geoip的判断可能存在失效问题。