设为首页 收藏本站
查看: 847|回复: 0

[经验分享] nginx+lua+redis自动识别封解禁频繁访问IP

[复制链接]

尚未签到

发表于 2016-12-20 10:49:15 | 显示全部楼层 |阅读模式
  在站点遇到攻击且无明显攻击特征,造成站点访问慢,nginx不断返回502等错误时,可利用nginx+lua+redis实现在指定的时间段 内,若单IP的请求量达到指定的数量后对该IP进行封禁,nginx返回403禁止访问。利用redis的expire命令设置封禁IP的过期时间达到在 指定的封禁时间后实行自动解封的目的。
  一、安装环境:


  • CentOS x64 release 6.4(Final)
  • Nginx-1.4.1
  • Redis 2.6.14
  • LuaJIT-2.0.2
  二、安装步骤:
  1、安装LuaJIT-2.0.2

wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz
tar -xzvf LuaJIT-2.0.2.tar.gz
cd LuaJIT-2.0.2
make && make install
  注:64位系统安装完成后或许还需要将/usr/local/lib/libluajit-5.1.so.2建立软连接到/lib64/ /libluajit-5.1.so.2,否则在后面nginx启动时会提示找不到依赖库。
  2、安装Redis 2.6.14

wget http://redis.googlecode.com/files/redis-2.6.14.tar.gz
tar -xzvf redis-2.6.14.tar.gz
cd redis-2.6.14
make && make install
  3、安装Nginx-1.4.1

wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.tar.gz
wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz
wget https://codeload.github.com/agentzh/echo-nginx-module/tar.gz/v0.45
wget https://codeload.github.com/chaoslawful/lua-nginx-module/tar.gz/v0.8.3
wget https://codeload.github.com/agentzh/redis2-nginx-module/tar.gz/v0.10
wget http://nginx.org/download/nginx-1.4.1.tar.gz
tar -xzvf pcre-8.21.tar.gz
tar -xzvf openssl-1.0.1e.tar.gz
tar -xzvf echo-nginx-module-0.45.tar.gz
tar -xzvf lua-nginx-module-0.8.3.tar.gz
tar -xzvf redis2-nginx-module-0.10.tar.gz
tar -xzvf nginx-1.4.1.tar.gz
cd nginx-1.4.1./configure --prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/nginx \
--user=www \
--group=www \
--with-poll_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_image_filter_module \
--with-http_geoip_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-pcre=/home/pcre-8.21 \
--with-openssl=/home/openssl-1.0.1e \
--add-module=/home /echo-nginx-module-0.45 \
--add-module=/home /lua-nginx-module-0.8.3 \
--add-module=/home /redis2-nginx-module-0.10
make
make install
  4、下载nginx中lua使用redis需要的依赖包redis.lua到nginx安装目录
  https://codeload.github.com/agentzh/lua-resty-redis/tar.gz/v0.15
  5、将控制访问lua脚本access.lua放到nginx安装目录的conf目录下

ip_bind_time =300--封禁IP时间  
ip_time_out =60--指定ip访问频率时间段  
connect_count =100--指定ip访问频率计数最大值--连接redis  
local redis =require"resty.redis"local cache = redis.new()local ok , err = cache.connect(cache,"127.0.0.1","6379")  
cache:set_timeout(60000)--如果连接失败,跳转到脚本结尾ifnot ok thengoto A  
end--查询ip是否在封禁段内,若在则返回403错误代码--因封禁时间会大于ip记录时间,故此处不对ip时间key和计数key做处理  
is_bind , err = cache:get("bind_"..ngx.var.remote_addr)if is_bind ==1then  
ngx.exit(403)goto A  
end  
start_time , err = cache:get("time_"..ngx.var.remote_addr)  
ip_count , err = cache:get("count_"..ngx.var.remote_addr)--如果ip记录时间大于指定时间间隔或者记录时间或者不存在ip时间key则重置时间key和计数key  
--如果ip时间key小于时间间隔,则ip计数+1,且如果ip计数大于ip频率计数,则设置ip的封禁key为1--同时设置封禁key的过期时间为封禁ip的时间if start_time == ngx.nullor os.time()- start_time > ip_time_out then  
res , err = cache:set("time_"..ngx.var.remote_addr , os.time())  
res , err = cache:set("count_"..ngx.var.remote_addr ,1)else  
ip_count = ip_count +1  
res , err = cache:incr("count_"..ngx.var.remote_addr)if ip_count >= connect_count then  
res , err = cache:set("bind_"..ngx.var.remote_addr,1)  
res , err = cache:expire("bind_",ip_bind_time)endend--结尾标记::A::local ok, err = cache:close()
  6、在nginx.conf文件的http段引入redis.lua包,加入代码:

lua_package_path"/usr/local/nginx/redis.lua;;";
  7、在nginx.conf中需要控制访问的站点location段中加入访问控制代码:

access_by_lua_file/usr/local/nginx/conf/access.lua
  现在可以启动redis和nginx进行测试了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-316897-1-1.html 上篇帖子: nginx+lua+redis自动识别封解禁频繁访问IP 下篇帖子: nginx+lua+redis自动识别封解禁频繁访问IP
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表