点赞
评论
收藏
分享
举报
使用 keyval 模块为 nginx 反向代理配置动态黑名单
发表于2022-09-16 16:52

浏览 611

nginx上开发的http keyval模块和stream keyval模块,给用户提供了通过动态API配置键值对(key-value pair)的能力。键值对代表的是存储能力,可以存储key-value形式的数据。那么,如何使用keyval模块提供的这种能力呢?下面就介绍一下在nginx反向代理的应用场景中,使用keyval模块动态配置黑名单的方法。

首先,在nginx.conf配置文件中添加下面的配置,将nginx作为www.baidu.com的反向代理,同时配置blacklist的相关指令。

http {
    #其他配置...
               
    keyval_zone zone=blacklist:10type=ip state=/var/lib/nginx/state/blacklist.kv timeout=10m;
    keyval $remote_addr $deny zone=blacklist;

    server {
        listen       80;
        server_name  localhost;
                   
        if ($deny ~* "deny") {
            return 403;
        }
                  
        location /
        {
            proxy_pass      https://www.baidu.com;
        }
    }
               
    #其他配置...
}

接下来,通过动态API来配置黑名单,在操作的过程中可以看到黑名单生效。开始时,黑名单是空的。

curl -s http://127.0.0.1/api/7/http/keyvals/blacklist
{}

此时,在浏览器中能够通过nginxIP地址访问到www.baidu.com

现在,添加一个黑名单配置项,将客户端IP地址加入黑名单。

curl -X POST -d '{"192.168.1.100":"deny"}' -s http://127.0.0.1/api/7/http/keyvals/blacklist
curl -s http://127.0.0.1/api/7/http/keyvals/blacklist
{"192.168.1.100":"deny"}

此时,通过nginx做反向代理访问www.baidu.com会被禁止:

再通过动态API修改黑名单,使之前的黑名单配置项失效,允许户端访问:

curl -X PATCH -d '{"192.168.1.100:"pass"}' -s http://127.0.0.1/api/7/http/keyvals/blacklist
curl -s http://127.0.0.1/api/7/http/keyvals/blacklist
{"192.168.1.100":"pass"}

此时,客户端浏览器又能够通过nginx访问到www.baidu.com

上面的例子展示了keyval模块结合动态API提供的动态配置能力。但这不是keyval模块唯一的应用,在nginx上还有更多的场景可以使用keyval存储的键值对数据。


已修改于2023-03-08 02:27
本作品系原创
创作不易,留下一份鼓励
NgxPupil

暂无个人介绍

关注



写下您的评论
发表评论
全部评论(0)

按点赞数排序

按时间排序

关于作者
NgxPupil
这家伙很懒还未留下介绍~
1
文章
0
问答
0
粉丝
相关文章
nginx默认不自带stream模块操作系统版本:CentOSLinuxrelease7.3.1611(Core) nginx版本:1.13.3nginx从1.9.0版本开始,新增了ngx_stream_core_module模块,使nginx支持四层负载均衡。默认编译的时候该模块并未编译进去,需要编译的时候添加--with-stream,使其支持stream代理。一、查看nginx是否有stream模块nginx-Vconfigurearguments:--prefix=/opt/elap/embedded--conf-path=/opt/elap/conf/nginx/nginx.conf--http-log-path=/var/log/elap/nginx/access.log--error-log-path=/var/log/elap/nginx/error.log--with-http_ssl_module--with-http_stub_status_module--with-ipv6--with-debug--with-ld-opt=-L
点赞 1
浏览 1.8k
之前写了篇文章用openresty实现了一个动态路由,虽然说是动态的,但是实际上还是需要将upstream在配置文件中写好,还是相当于静态的。最近工作中有这方面的需求,upstream是完全动态,由客户端来指定,开始的时候有一些错误,最后通过resolver指定dns服务来完成,具体流程如下。1.开始踩坑nginx的配置如下:worker_processes1; events{ worker_connections1024; } http{ server{ listen8001; server_namelocalhost; location/{ set$upstream_host$http_upstream_host; echo$http_upstream_host; proxy_passhttp://$upstream_host;
点赞 1
浏览 1.3k
同源及跨域问题解决1.同源策略什么叫同源?URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示他们同源。相反,只要协议,域名,端口有任何一个的不同,就被当作是跨域。 同源策略  Same-Origin-Policy(SOP)浏览器采用同源策略,禁止页面加载或执行与自身来源不同的域的任何脚本。换句话说浏览器禁止的是来自不同源的"document"或脚本,对当前"document"读取或设置某些属性。情景:比如一个恶意网站的页面通过iframe嵌入了银行的登录页面(二者不同源),如果没有同源限制,恶意网页上的javascript脚本就可以在用户登录银行的时候获取用户名和密码。 浏览器中有哪些不受同源限制呢?、、、这些包含 src 属性的标签可以加载跨域资源。但浏览器限制了JavaScript的权限使其不能读、写加载的内容。 2.跨域跨域是指从一个域的网页去请求另一个域的资源。比如从http://www.baidu.com/ 页面去请求 http://www.google.c
点赞 0
浏览 473