Nginx反向代理设置黑名单
作为架构师,你必须掌握 openresty
Openresty设置访问黑名单
1、简单设置nginx配置文件
(py36env) [root@www conf]# ll nginx.conf 配置新的location
location /bklist {
access_by_lua_block {
local blacklist = {
['192.168.1.118'] = true //true黑名单,false白名单
}
if blacklist[ngx.var.remote_addr] then
return ngx.exit(ngx.HTTP_FORBIDDEN)
end
}
content_by_lua_block {
ngx.say(ngx.var.remote_addr)
}
}
(py36env) [root@www conf]# /usr/local/openresty/nginx/sbin/nginx -s reload
(py36env) [root@www ~]# curl 192.168.1.118/bklist -I 访问403拒绝
HTTP/1.1 403 Forbidden
2、通过lua脚本设置访问
设置lua脚本,动态设置黑白名单,拆分ng配置信息,
(py36v) [root@www ~]# cat /usr/local/openresty/nginx/conf/nginx.conf 配置ng
location /bklist {
access_by_lua_file ../luajit/blacklist_v2.lua;
content_by_lua_block {
ngx.say(ngx.var.remote_addr)
}
}
(py36env) [root@www ~]# cat /usr/local/openresty/luajit/blacklist.lua
local blacklist = {
['192.168.1.118'] = false
}
if blacklist[ngx.var.remote_addr] then
return ngx.exit(ngx.HTTP_FORBIDDEN)
end
(py36env) [root@www ~]#
3、通过lua脚本设置访问控制
通过redis实现动态,添加删除白名单。
Nginx配置加载lua文件。
location /bklist {
access_by_lua_file ../luajit/blacklist.lua;
content_by_lua_block {
ngx.say(ngx.var.remote_addr)
}
}
(py36env) [root@www ~]# cat /usr/local/openresty/luajit/blacklist.lua
local blacklist = {
['192.168.1.118'] = false
}
if blacklist[ngx.var.remote_addr] then
return ngx.exit(ngx.HTTP_FORBIDDEN)
访问请求,
(py36env) [root@www ~]# curl 192.168.1.118/bklist
192.168.1.118
(py36env) [root@www ~]# curl 192.168.1.118/bklist -I
HTTP/1.1 200 OK
3、通过lua脚本设置访问控制
(py36env) [root@www ~]# cat /usr/local/openresty/nginx/conf/nginx.conf
location /bklist {
access_by_lua_file ../luajit/blacklist_v2.lua;
content_by_lua_block {
ngx.say(ngx.var.remote_addr)
}
}
(py36env) [root@www ~]# cat /usr/local/openresty/luajit/blacklist_v2.lua
local redis = require "resty.redis"
local red = redis:new()
local ok, err = red:connect('127.0.0.1', 6379)
if not ok then
ngx.log(ngx.INFO, "err:" ..err)
end
local ipaddr = ngx.var.remote_addr
local exists, err = red:sismember("black_list", ipaddr)
if err then
return ngx.exit("interval err..")
end
if exists == 1 then
return ngx.exit(ngx.HTTP_FORBIDEN)
redis操作黑名单key,全程热加载到ng。
Redis Sadd 命令将一个或多个成员元素加入到集合中,已存在集合的成员元素将被忽略。
假如集合 key 不存在,则创建一个只包含添加的元素作成员的集合。
当集合 key 不是集合类型时,返回一个错误。
注意:在 Redis2.4 版本以前, SADD 只接受单个成员值。
(py36env) [root@www ~]# redis-cli
127.0.0.1:6379> SADD black_list 192.168.1.118 #添加成员
127.0.0.1:6379> SADD black_list 192.168.1.102
127.0.0.1:6379> SMEMBERS black_list #查看成员
1) "192.168.1.102"
2) "192.168.1.118"
127.0.0.1:6379> SREM black_list 192.168.1.118 #删除成员
加入黑名单之后,访问变500.
[root@localhost ~]# curl 192.168.1.118/bklist -I
HTTP/1.1 500 Internal Server Error
参考链接:https://www.bilibili.com/video/BV1Ra411Y7hn?spm_id_from=333.337.search-card.all.click&vd_source=641f16f92229b0afdb36cbc42e671cc0