文档章节

nginx+lua+redis deny ip

 玖零後大叔
发布于 2017/08/17 16:36
字数 1037
阅读 72
收藏 0
点赞 0
评论 0

nginx+lua+redis实现ip黑名单

1.安装LuaJIT

LuaJIT LuaJIT即采用C语言写的Lua代码的解释器

http://luajit.org/download/LuaJIT-2.0.5.tar.gz
tar -zxf LuaJIT-2.0.5.tar.gz
cd LuaJIT-2.0.5
make && make install PREFIX=/usr/local/data/lua

vim /etc/ld.so.conf
/usr/local/data/lua/lib     #添加
ldconfig     #运行命令使其生效

2.安装Ngx_lua模块

https://codeload.github.com/simpl/ngx_devel_kit/zip/master     #zip格式
https://codeload.github.com/openresty/lua-nginx-module/zip/master     #zip格式

ngx_devele_kit 一个拓展nginx服务器核心功能的模块,第三方模块开发可以基于它来快速实现 lua-nginx-module lua的nginx模块

export LUAJIT_LIB=/usr/local/data/lua/lib/
export LUAJIT_INC=/usr/local/data/lua/include/luajit-2.0/

需要重新编译nginx

./configure --prefix=/usr/local/data/nginx --user=goforit --group=goforit --prefix=/usr/local/data/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=../ngx_devel_kit --add-module=../lua-nginx-module && make
mv /usr/local/data/nginx/sbin/nginx /usr/local/data/nginx/sbin/nginx.old
cp objs/nginx /usr/local/data/nginx/sbin/nginx
/usr/local/data/nginx/sbin/nginx -t /usr/local/data/nginx/conf/nginx.conf
kill -USR2 `cat /usr/local/data/nginx/logs/nginx.pid`
kill -WINCH `cat /usr/local/data/nginx/logs/nginx.pid.oldbin`
kill -HUP `cat /usr/local/data/nginx/logs/nginx.pid.oldbin`
kill -QUIT `cat /usr/local/data/nginx/logs/nginx.pid.oldbin`

3.测试lua是否生效 修改nginx配置

location ~ /lua {
     default_type 'text/plain';
     content_by_lua 'ngx.say("hello, lua!")';
}

测试访问 http://192.169.100.105/lua 输出,hello,lua!即可

4.安装redis服务启动

yum -y install redis
/etc/init.d/redis start

5.安装lua redis库

下载

https://codeload.github.com/openresty/lua-resty-redis/zip/master

放到/usr/local/nginx/lua下即可 nginx.conf添加

lua_package_path "/usr/local/data/nginx/lua/lua-resty-redis/lib/?.lua;;";

重载nginx即可

6.配置nginx限制IP地址 nginx.conf添加

lua_shared_dict ip_blacklist 1m;
server{}中添加
locaiont ~ \.php {
               ...
               ...
               ...
               access_by_lua_file /usr/local/data/nginx/conf/lua/ip_blacklist.lua;     #配置文件在下面
                default_type 'text/html';
                #content_by_lua 'ngx.say("hello,lua!")';
}
vim ip_blacklist.lua
-- a quick LUA access script for nginx to check IP addresses against an
-- `ip_blacklist` set in Redis, and if a match is found send a HTTP 403.
--
-- allows for a common blacklist to be shared between a bunch of nginx
-- web servers using a remote redis instance. lookups are cached for a
-- configurable period of time.
--
-- block an ip:
--   redis-cli SADD ip_blacklist 10.1.1.1
-- remove an ip:
--   redis-cli SREM ip_blacklist 10.1.1.1
--
-- also requires lua-resty-redis from:
--   https://github.com/agentzh/lua-resty-redis
--
-- your nginx http context should contain something similar to the
-- below: (assumes resty/redis.lua exists in /etc/nginx/lua/)
--
--   lua_package_path "/etc/nginx/lua/?.lua;;";
--   lua_shared_dict ip_blacklist 1m;
--
-- you can then use the below (adjust path where necessary) to check
-- against the blacklist in a http, server, location, if context:
--
-- access_by_lua_file /etc/nginx/lua/ip_blacklist.lua;
--
-- from https://gist.github.com/chrisboulton/6043871
-- modify by Ceelog

local redis_host    = "192.169.100."
local redis_port    = 6379
local redis_pass    = "Redis2016"

-- connection timeout for redis in ms. don't set this too high!
local redis_connection_timeout = 100

-- check a set with this key for blacklist entries
local redis_key     = "ip_blacklist"

-- cache lookups for this many seconds
local cache_ttl     = 60

-- end configuration

local ip                = ngx.var.remote_addr
local ip_blacklist 		= ngx.shared.ip_blacklist
local last_update_time 	= ip_blacklist:get("last_update_time");

-- only update ip_blacklist from Redis once every cache_ttl seconds:
if last_update_time == nil or last_update_time < ( ngx.now() - cache_ttl ) then

  local redis = require "resty.redis";
  local red = redis:new();

  red:set_timeout(redis_connection_timeout);

  local ok, err = red:connect(redis_host, redis_port);
  local ok2, err2 = red:auth(redis_pass)
  red:select(1)
  if not ok then
    ngx.log(ngx.DEBUG, "Redis connection error while retrieving ip_blacklist: " .. err);
  else
    local new_ip_blacklist, err = red:smembers(redis_key);
    if err then
      ngx.log(ngx.DEBUG, "Redis read error while retrieving ip_blacklist: " .. err);
    else
      -- replace the locally stored ip_blacklist with the updated values:
      ip_blacklist:flush_all();
      for index, banned_ip in ipairs(new_ip_blacklist) do
        ip_blacklist:set(banned_ip, true);
      end

      -- update time
      ip_blacklist:set("last_update_time", ngx.now());
    end
  end
end

if ip_blacklist:get(ip) then
  ngx.log(ngx.DEBUG, "Banned IP detected and refused access: " .. ip);
  return ngx.exit(ngx.HTTP_FORBIDDEN);
end

在redis里添加IP地址测试

SADD ip_blacklist 192.168.100.1     #添加地址
SREM ip_blacklist 192.168.100.1     #删除地址
SMEMBERS ip_blacklist     #查看所有地址

reload nginx 测试即可 会发现访问状态是403

参考文章:

http://www.cnblogs.com/tinywan/p/6534151.html

http://blog.csdn.net/hj7jay/article/details/62037065

https://my.oschina.net/sakmon/blog/393917

遇到错误: 1.错误

/usr/local/data/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory

解决:

vim /etc/ld.so.conf
     /usr/local/data/lua/lib     #添加
     ldconfig     #即可

2.报错

2017/08/16 17:00:25 [error] 3795#0: *64 lua entry thread aborted: runtime error: /usr/local/nginx/conf/lua/ip_blacklist.lua:51: module 'resty.redis' not found:
    no field package.preload['resty.redis']
    no file '/usr/local/nginx/lua/lua-resty-redis/lib/resty/redis.lua'
    no file './resty/redis.lua'
    no file '/usr/local/share/luajit-2.0.5/resty/redis.lua'
    no file '/usr/local/share/lua/5.1/resty/redis.lua'
    no file '/usr/local/share/lua/5.1/resty/redis/init.lua'
    no file './resty/redis.so'
    no file '/usr/local/lib/lua/5.1/resty/redis.so'
    no file '/usr/local/lib/lua/5.1/loadall.so'
    no file './resty.so'
    no file '/usr/local/lib/lua/5.1/resty.so'
    no file '/usr/local/lib/lua/5.1/loadall.so'
stack traceback:
coroutine 0:
    [C]: in function 'require'
    /usr/local/nginx/conf/lua/ip_blacklist.lua:51: in function </usr/local/nginx/conf/lua/ip_blacklist.lua:1>, client: 192.169.100.1, server: mytest.com, request: "GET /ipblacklist HTTP/1.1", host: "192.169.100.105"

解决: 缺少相关库 下载

 https://codeload.github.com/openresty/lua-resty-redis/zip/master
 放到/usr/local/nginx/lua下即可
 nginx.conf添加
 lua_package_path "/usr/local/data/nginx/lua/lua-resty-redis/lib/?.lua;;";

重载nginx即可

本文转载自:

共有 人打赏支持
粉丝 1
博文 126
码字总数 31691
作品 0
浦东
运维
【Nginx探究系列三】nginx+lua+redis构建高并发应用

1.nginx+lua+redis构建高并发应用 https://www.ttlsa.com/nginx/nginx-lua-redis/ 2. nginx+lua+redis自动识别封解禁频繁访问IP: http://outofmemory.cn/code-snippet/35653/nginx-lua-red......

开源中国首席撸码官
2016/03/14
247
0
Nginx 通过 Lua + Redis 实现动态封禁 IP

1。背景 为了禁止一些爬虫或恶意用户请求的服务器,我们需要创建一个动态IP黑名单。对于黑名单内的IP,拒绝提供服务。 两。建筑 实现IP黑名单的方法有很多种。 1,在操作系统层面,配置iptab...

楠木楠
04/18
0
0
华为核心交换机acl 允许个别IP访问与取消ACL脚本

acl number 3212 rule 1 permit ip source 192.168.212.0 0.0.1.255 destination 192.168.70.166 0 rule 2 permit ip source 192.168.212.0 0.0.1.255 destination 192.168.100.18 0 rule 69......

empe_lee
07/02
0
0
交换机配置vlan 访问控制列表

比如说先的场景: Vlan 1: 10.99.11.0/255.255.255.0 Vlan 99: 10.99.99.0/255.255.255.0 需求是 让 vlan 99的用户不能访问 vlan1中的某一个IP : 以前用了下面所有的代码: ==============...

科技小能手
2017/11/12
0
0
二层网络安全防范笔记

此文参考思科网络安全部分书箱所作笔记,当然此笔记只是二层网络安全防范里的一部分,需要根据自身的实际环境回以实施以保证网络安全。 MAC攻击与防范: 攻击:MAC Address泛洪攻击,可利用某...

arckyli
2017/09/20
0
0
边界路由器安全设定笔记

R1(conf)# no cdp run #在边界路由器上关闭CDP协议,防止非法用户通过CDP检测内部网络 R1(conf)# no service tcp-small-service #echo 17; chargen 19; daytime 13; R1(conf)# no service ud......

arckyli
2017/09/22
0
0
Nginx学习之九:实践学习指南

Nginx基础 1. nginx安装 2. nginx 编译参数详解 3. nginx安装配置+清缓存模块安装 4. nginx+PHP 5.5 5. nginx配置虚拟主机 6. nginx location配置 7. nginx root&alias文件路径配置 8. ngxht...

boonya
2014/07/09
0
0
shell 自动检查SSH暴力破解IP并阻断攻击

#!/bin/bash local_ip="192.168.0.25" #过滤本地IP secure_file=/var/log/secure hosts_deny=/etc/hosts.deny hosts_secure=/etc/hosts.secure secure () { grep "Failed password for root......

ZhiZhiMao
2017/06/14
0
0
ACL技术 扩展ACL

实验目的:实现ACL的功能 实验原理:通过创建ACL中的条件,在调用ACL的时候,就可以通过ACL条件实现对数据的筛选。 实验步骤: 第一步: 配置PC机基本信息 192.168.1.1 255.255.255.0 没有网...

与科技同行
2017/11/18
0
0
锐捷S5750 (生产环境)

AYC1#-S5750#show version System description : Ruijie 10G Routing Switch(S5750-24GT/8SFP-E) By Ruijie Networks System start time : 2016-01-04 15:38:27 System uptime : 8891:20:1:2......

古老
2017/05/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

(转)SQL语句的执行顺序

(7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> (5) GROUP BY <group_by_list> (......

Avner
10分钟前
0
0
1.14 救援模式

确保开机启动时连接镜像文件,如果是真机服务器,就需要:U盘或光盘镜像启动进入BIOS 不同主板进入bios按键不同,一般是F12或Esc 光标:移动到Boot(开机启动项) 减号移动:光标选中行,按-...

小丑鱼00
17分钟前
0
0
ES11-全文检索

高级别全文检索通常用于在全文本字段(如电子邮件正文)上运行全文检索。 他们了解如何分析被查询的字段,并在执行之前将每个字段的分析器(或search_analyzer)应用于查询字符串。 1.term查...

贾峰uk
20分钟前
0
0
java 复制对象有哪些方式

java 复制对象有哪些方式 Apache的 Common beanutils库 org.apache.commons.beanutils.BeanUtils.copyProperties(dest,origin); Springframework 的BeanUtil 依赖: <dependency> ......

黄威
36分钟前
1
0
jstack的简单使用

公司测试反应, 一个java应用的机器, 即使不做交易, cpu始终是30%多, 于是想到了jstack, 实践步骤记录一下: 1, 找出java应用的进程号 ps -ef|grep 应用名|grep -v grep 2, 找出pid下的cpu占用...

零二一七
43分钟前
1
0
崛起于Springboot2.X之项目war打包部署(18)

将springboot项目打包步骤: 1、启动类 extends SpringBootServletInitializer 2、启动类添加覆盖方法 @Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder......

木九天
52分钟前
2
0
导入CSV文件就行数据整理分析

#-*-coding:utf-8-*-import csv,os,re,mathlocalPath=input("请输入所有群文件的根目录:") #所有QQ群文件的物理根目录路径def info(): info_dic=[] dirList=os.listdi...

Kefy
58分钟前
5
0
CoreText进阶(六)-内容大小计算和自动布局

CoreText进阶(六)-内容大小计算和自动布局 其它文章: CoreText 入门(一)-文本绘制 CoreText入门(二)-绘制图片 CoreText进阶(三)-事件处理 CoreText进阶(四)-文字行数限制和显示更...

aron1992
59分钟前
1
0
一个Unity高人的博客,涉猎范围很广,深度也很深。

https://blog.csdn.net/ecidevilin/article/list/

爽歪歪ES
今天
0
0
Spring Cloud Config-Git后端

EnvironmentRepository的默认实现使用Git后端,这对于管理升级和物理环境以及审核更改非常方便。要更改存储库的位置,可以在Config Server中设置“spring.cloud.config.server.git.uri”配置...

itcloud
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部