最近公司部署到阿里金融云的系统遭受CC攻击,网络访问安全控制仅靠阿里云防火墙保障,在接入层及应用层并未做限流。

攻击者拥有大量的IP代理,只要合理控制每个IP的请求速率(以不触发防火墙拦截为限),仍给后端服务带来了很大的压力。

起缘:

存在一个检查某手机号是否已注册接口。(用户注册或重置密码时提示用户是否已存在)

/mobilePhone/existent?mobilePhone=13261748254

攻击者通过穷举调用,借此刺探出系统已注册的手机号列表。

接入层限流:

在接入层Nginx限制每个IP的并发请求数为10,每秒钟最大请求数为10。需要支持白名单IP,在白名单范围内的,不需要限速。

IP:由于Nginx隐藏在阿里云各种网络设备的后端,所以使用\(remote_addr是取不到客户的真实IP的。
一个思路是通过\)x_forwarded_for,取得代理链上所有的IP,然后解析出客户端IP。

其实阿里云前端的网络设备会把客户的终端地址通过HTTP头x_real_ip传递过来,所以只需要$http_x_real_ip即可取得客户的真实IP。

在nginx的http节点增加以下配置:

map $http_x_real_ip $limit {
default $http_x_real_ip; #self IP
"127.0.0.1" "";
}
limit_conn_zone $limit zone=ipc:20m;
limit_req_zone $limit zone=ipr:20m rate=10r/s;

在location节点增加以下配置:

limit_conn ipc 10;
limit_req zone=ipr burst=5 nodelay;

limit_conn和limit_req命令的详细使用请参考:

http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#limit_conn_zone_req

注意:

要修改zone名时,nginx -s reload是不会生效的,此时需要重启Nginx。

nginx -t测试通过,但nginx -s reload不生效时,请查看nginx的error日志,默认地址:/usr/local/nginx/logs/error.log

测试

使用Jmeter等压力测试工具,分别在白名单IP和非白名单IP下发起大量请求,默认被拦截请求响应码是503,日志为error

后续:

判断某手机号是否已注册交互增加图片验证码,防止机器暴力调用。

最新文章

  1. [转]const 与 readonly知多少
  2. php+mysql预查询prepare 与普通查询的性能对比
  3. Bash注释
  4. git命令之git tag 给当前分支打标签
  5. Error:Execution failed for task ':app:transformClassesWithInstantRunForDebug'. > java.lang.ClassNotFoundException: io.realm.RealmObject
  6. 浅析MongoDB数据库的海量数据存储应用
  7. JavaScript substring() 方法
  8. linux系统识别和挂载文件系统
  9. Android开发之极光推送基本步骤
  10. c++野指针 之 实战篇
  11. tnvm 安装模块不能找到关联模块问题
  12. Oracle12c多租户管理用户、角色、权限
  13. Fastify 系列教程一(路由和日志)
  14. MathJax使用指南
  15. jQuery 作业三个按钮
  16. 接口请求json解析问题
  17. c/c++指针常见错误
  18. zookeeper集群,每个服务器上的数据是相同的,每一个服务器均可以对外提供读和写的服务,这点和redis是相同的,即对客户端来讲每个服务器都是平等的。
  19. (2.0)Smali系列学习之Smali语法
  20. python 自动化之路 day 19 Django基础[二]

热门文章

  1. Android应用开发编译框架流程与IDE及Gradle概要
  2. [SQL 高级查询运算符的用法 UNION (ALL),EXCEPT(ALL),INTERSECT(ALL) ]
  3. mysql timestamp为0值时,python读取后的对象为None
  4. leetcode探索中级算法
  5. Hadoop : MapReduce中的Shuffle和Sort分析
  6. Systemd 指令
  7. 【转载】如何在 Kaggle 首战中进入前 10%
  8. [译]AngularJS 1.3.0 开发者指南(一) -- 介绍 (转)
  9. Web jsp开发学习——dbcp jsp连接MySQL出现中文乱码解决
  10. JSP 简单标签extends SimpleTagSupport