通过OpenResty实现Nginx动态拉黑IP

运维 系统运维
OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

[[355881]]

 前面提到过,nginx在项目中的作用。其实还有很多高级模块功能,例如今天我们利用OpenResty来防止一些IP恶意攻击。

OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

官方地址:http://openresty.org/cn/

环境搭建

本文使用centos 7进行操作,安装nginx,本处安装nginx并非是openresty前提,只是为了演示openresty安装后,访问地址会将nginx变成openresty

wget下载

  1. wget http://nginx.org/download/nginx-1.19.5.tar.gz 

 通过OpenResty实现nginx动态拉黑IP

 解压并执行安装命令

  1. tar -zxvf nginx-1.19.5.tar.gz #解压 
  2. cd nginx-1.19.5 #进入目录 
  3. ./configure #配置 
  4. make #编译 
  5. make install #安装 
  6. cd /usr/local/nginx/sbin #切换到nginx命令目录 
  7. ./nginx #启动nginx 

 访问地址


安装openresty,先下载openresty,

  1. wget https://openresty.org/download/openresty-1.19.3.1.tar.gz 
  2. (此版本最终一直无法加载一些lua脚本,最终使用openresty-1.15.8.3版本成功) 

(此版本最终一直无法加载一些lua脚本,最终使用openresty-1.15.8.3版本成功)

 解压&安装 

  1. tar -zxvf openresty-1.19.3.1.tar.gz 
  2. cd openresty-1.19.3.1 
  3. yum install pcre-devel openssl-devel gcc curl  
  4. ./configure 
  5. make 
  6. make install 

 执行完后,我们启动openresty中得nginx,注意,切换到openresty安装得路径

  1. /usr/local/openresty/nginx/sbin 

启动后,访问,发现nginx变成了openresty

通过OpenResty实现nginx动态拉黑IP

配置nginx.conf

测试lua功能


通过OpenResty实现nginx动态拉黑IP

 可以看到已经可以使用lua脚本,下面我们将redis sdk引用进来

通过OpenResty实现nginx动态拉黑IP

 配置请求路径访问lua脚本(本处只是做一个demo,如果对所有路径进行访问限制,可以拦截/,然后lua验证通过后,进行请求转发)

通过OpenResty实现nginx动态拉黑IP

lua脚本

  1. # Lua 
  2. local function close_redis(redcli) 
  3.     if not redcli then 
  4.         return 
  5.     end 
  6.     --释放连接(连接池实现) 
  7.     local pool_max_idle_time = 10000 --毫秒 
  8.     local pool_size = 100 --连接池大小 
  9.     local ok, err = redcli:set_keepalive(pool_max_idle_time, pool_size) 
  10.  
  11.     if not ok then 
  12.         ngx_log(ngx_ERR, "set redis keepalive error : ", err) 
  13.     end 
  14. end 
  15.  
  16. -- 连接redis 
  17. local redis = require('resty.redis'
  18. local redcli = redis.new() 
  19. redcli:set_timeout(1000) 
  20.  
  21. local ip = "127.0.0.1"  ---修改变量 
  22. local port = "6379" ---修改变量 
  23. local ok, err = redcli:connect(ip,port) 
  24. if not ok then 
  25.     return close_redis(redcli) 
  26. end 
  27.  
  28. local clientIP = ngx.var.remote_addr 
  29.  
  30. -- increKey为请求频率,blackKey黑名单key 
  31. local incrKey = "user:"..clientIP..":request:frequency" 
  32. local blackKey = "user:"..clientIP..":black:list" 
  33.  
  34. local is_black,err = redcli:get(blackKey) 
  35.  
  36. if tonumber(is_black) == 1 then 
  37.     ngx.exit(403) 
  38.     close_redis(redcli) 
  39. end 
  40.  
  41. inc  = redcli:incr(incrKey) 
  42.  
  43. ngx.say(inc) 
  44.  
  45. if inc < 2 then 
  46.    inc = redcli:expire(incrKey,1) 
  47. end 
  48.  
  49. if inc > 2 then --每秒2次以上访问即视为非法,会阻止30s的访问 
  50.     redcli:set(blackKey,1) 
  51.     redcli:expire(blackKey,30) 
  52. end 
  53.  
  54. close_redis(redcli) 

 启动nginx后,请求一直报错 


  1. 2020/12/01 19:13:53 [error] 2101#0: *2 lua entry thread aborted: runtime error: /usr/local/openresty/nginx/lua/access_by_redis.lua:29: attempt to call field 'get_headers' (a nil value) 
  2. stack traceback: 
  3. coroutine 0: 
  4.         /usr/local/openresty/nginx/lua/access_by_redis.lua: in main chunk, client: 192.168.49.1, server: localhost, request: "GET /test1 HTTP/1.1", host: "192.168.49.131" 

 这个问题困扰了我很久(凡是不要一上来就最新版本,吐血说明)

windows版本的openresty并没有出现此问题,liunux一直都有问题,最终降低了openresty版本,实验成功,openresty-1.15.8.3版本

正常请求

通过OpenResty实现nginx动态拉黑IP

异常请求


最后openresty的运行周期图如下,可以从整体上了解openresty


 

责任编辑:姜华 来源: 今日头条
相关推荐

2021-05-10 10:50:53

NginxIPLinux

2019-09-18 10:39:08

负载均衡反向代理TCP

2015-04-29 16:34:38

博科/网络转型

2009-01-03 14:54:40

ibmdwXML

2016-08-23 14:37:21

2009-12-30 10:19:42

2011-02-22 09:04:57

DebianBonding双网卡单IP

2019-09-24 08:44:09

OpenrestyAPI网关

2022-02-15 14:22:46

灰度发布互联网业务

2016-11-28 09:19:27

2023-10-13 18:15:06

2009-08-03 14:14:27

2016-02-15 15:17:56

2021-07-31 11:40:55

Openresty开源

2021-07-13 22:39:46

比特币加密货币勒索软件

2019-12-04 16:10:43

微信拉黑

2022-02-18 08:28:49

域名公网IP

2021-06-16 07:05:02

gRPC 网关HTTP

2022-10-10 08:17:50

JavaIP地址

2022-03-16 07:59:54

项目语言包JSON 文件
点赞
收藏

51CTO技术栈公众号