当前位置:网站首页>Kong实现禁止国外IP访问
Kong实现禁止国外IP访问
2022-08-11 04:51:00 【爱在南信】
一.需求背景
最近公司观察到某些国外IP或者非中国大陆IP有扫描访问记录,出于业务安全考虑,公司的业务只对中国大陆进行开展,所以需要禁止国外IP访问,增加系统安全性.同时也避免某些黑产通过国外代理IP的方式来攻击到公司的业务.
查询一些网上的资料,大部分人使用nginx_geoip2_module这个nginx的模块.再通过下载免费的geoiplite2这个IP库,配置只允许zh_cn中国的IP才能访问否则返回403禁止访问资源. 其他的一些解决方案也是一样的思路, 下载离线IP库,拿到客户端IP查询拿到IP的归属地,例如国家、城市、省份等等.最后决定是否允许这个IP能否访问资源.
刚开始也想用这个方案,但是现状有点尴尬. 我们之前业务部署的系统是Centos6.3, 都老掉牙的系统,重新编译nginx加入这个geoip2模块具有风险,别为了加这个IP访问把正常业务搞挂了,得不偿失. 并且考虑到一个问题就是, 这个geoiplite2免费库针对国内IP的准确率也不是特别高,怕上线IP误伤率过高,最后放弃了这个方案.
二.自定义Kong插件
幸运的是我们的所有流量都是先经过一个Nginx作为总的流量入口, 后面负载均衡进入Kong集群, 前端的这个Nginx其实没干具体事情. 既然前端Nginx不能做, 那么我们想到在Kong这边通过插件的形式来实现也是完美的.
与前面思路一样, 考虑到geoiplite2这个IP库准确率不是那么高,找了几个IP库,最后锁定
ip2region这个项目的IP库.Github地址: https://github.com/lionsoul2014/ip2region
为什么选择ip2region?
1.ip库相对精准
2.查询速度快,支持很多语言的SDK.重点是支持Lua(哈哈,要不然写插件就不开心了).测试了一下,通过把库load到内存的模式,再进行查询. 测试结果一个IP的查询在10微秒左右. 性能是可以接受的,如果性能损耗太大,Kong作为网关入口会造成大量的性能损耗,拖垮业务也是有可能的.
那么现在就很简单了. 思路就是通过Lua编写Kong插件, 拿到客户端的IP地址, 通过ip2region查询到IP的归属地信息,拿到country限定为"中国"、province例如可以排除港澳台, 或者内网IP如192.168.x.x\10.x.x.x等相关IP则允许通过,否则响应403禁止访问即可.
不知道怎么编写Kong插件的,可以参考我之前的博客: 2022最新Kong插件开发教程
过程中还是遇到了一些问题, 例如ip2region提供的lua客户端SDK只支持至少Lua5.3版本开始,因为我看到源码有使用到 << 、>>、&、|等相关位运算符, 但是我们的Kong用的Lua是5.1的,不支持位运算符....,后来通过安装bit2的lua库, 把用到位运算符的地方使用bit32的函数换掉,大功告成!为了验证这样有没有问题, 我使用官方的bench_test测试了几百万的IP输出所有IP的归属地,两者一样,这样确保了是OK的.
三.效果展示
网站全球访问状态测试: http://www.webkaka.com/UrlCheck.aspx
非中国大陆IP访问全部403禁止.

Kong加载到的新插件页面:

Kong配置插件页面:
四.开源地址
找了很多Kong插件,没找到合适的Kong插件来实现这个功能.我把实现的源码进行了开源,有需要的朋友可以参考一下.
项目地址: https://github.com/dream-mo/kong-plugin-ip-region-restriction
边栏推荐
- 「转」“搜索”的原理,架构,实现,实践,面试不用再怕了
- -填涂颜色-
- 0 Basic software test for career change, self-study for 3 months, 12k*13 salary offer
- 破解事务性工作瓶颈,君子签电子合同释放HR“源动力”!
- [Server installation Redis] Centos7 offline installation of redis
- Switch---Spanning Tree---Three-layer Architecture Summary
- 交换机和路由器技术-25-OSPF多区域配置
- To break the bottleneck of transactional work, the gentleman signs the electronic contract to release the "source power" of HR!
- 洛谷P1196 银河英雄传说
- CAD2020 打开错误报告 e06d7363h Exception at 13644F69h
猜你喜欢

Embedded Sharing Collection 33

交换机和路由器技术-24-OSPF单区域配置

Three 】 【 yolov7 series of actual combat from 0 to build training data sets

"239 Sliding Window Maximum Value" on the 16th day of LeetCode brushing

To break the bottleneck of transactional work, the gentleman signs the electronic contract to release the "source power" of HR!

Provincial level of Echart maps, as well as all prefecture-level download and use

自研能力再获认可,腾讯云数据库入选 Forrester Translytical 报告

I wrote some code in my resume, but I still can't pass the interview

ALSA音频架构 -- aplay播放流程分析

交换机和路由器技术-35-NAT转PAT
随机推荐
jwsManager服务接口实现类-jni实现
论文笔记:Bag of Tricks for Long-Tailed Visual Recognition with Deep Convolutional Neural Networks
交换机和路由器技术-27-OSPF路由重分发
Selenium自动化测试框架工作原理你明白了吗?
[Actual combat scene] Mall-discount event design plan
Switch---Spanning Tree---Three-layer Architecture Summary
干货:服务器网卡组技术原理与实践
快速使用UE4制作”大场景游戏“
Jetson Orin platform 4-16 channel GMSL2/GSML1 camera acquisition kit recommended
Research on a Consensus Mechanism-Based Anti-Runaway Scheme for Digital Trunking Terminals
Object Creation and Display Transformation
校园兼职平台项目反思
Redis: Solve the problem of modifying the same key with distributed high concurrency
交换机和路由器技术-34-动态NAT
CAN/以太网转换器 CAN与以太网互联互通
Summary of c language fprintf, fscanf, sscanf and sprintf function knowledge points
How to add icons to web pages?
【Web3 系列开发教程——创建你的第一个 NFT(9)】如何在手机钱包里查看你的 NFT
About data paging display
[Note] Is the value of BatchSize the bigger the better?