每周一坑-nginx设置白名单ip不生效

然后我领导观察正常日志有个clientip,问是谁的。我说是防火墙ip,这时我们就怀疑是这个防火墙导致怎么配都不行,因为我试过另一台经过阿里云waf的服务器,也是怎么设置都不行。
本来我们想叫防火墙的人帮针对某个目录设置ip白名单,怎么知道他们的产品特水,只能我们搞。于是我们换种思路,打算从xff入手,对应nginx内置变量:$http_x_forwarded_for,而不行的clientip对应nginx内置变量:$remote_addr。
因为有多个白名单ip,所以最终成品是这样(location里面的规则是一条条顺序匹配的,要注意不要第一条规则就匹配上,让它直接跳出来不执行后面的)
location ^~ /windysai/admin { ### 白名单ip set $flag "9"; if ($http_x_forwarded_for ~ "白名单ip1|白名单ip2|白名单ip3") { set $flag "1"; } if ($flag ~ "9") { return 403; } proxy_pass https://服务ip:端口; }
最后投诉下这个小可爱,乱说,也有可能人家写对了,它打不了竖线 “|”。本来多个ip我不会匹配的时候,写了n多个if语句,后来晚上看了视频才知道上面那样写。

以下这两个方法,大家感兴趣可以试下:
1、感觉跟上面的方法有点类似

2、借用Lua模块
引用小可爱的话:
对于复杂的IP地址匹配逻辑,最佳实践是使用Lua脚本。Lua脚本在Nginx中可以提供更高级的功能和灵活性。如果您希望实现IP白名单功能,并能够处理匹配多个IP地址,可以按照以下步骤配置,
在下面配置中,我们使用access_by_lua_block指令来嵌入Lua脚本。该脚本检查$http_x_forwarded_for头部的值是否匹配白名单中的任何IP地址。如果客户端IP不在白名单中,将返回403 Forbidden错误,否则将允许访问。
请确保您在配置文件中修改allowed_ips列表,添加允许访问的IP地址。这样,您就能够灵活地配置多个IP地址的白名单。记得重新加载或重启Nginx以使更改生效。
1 http { 2 # ... 其他配置 ... 3 4 lua_shared_dict ip_whitelist_dict 10m; # 创建一个共享内存区域用于存储白名单IP 5 6 server { 7 listen 80; 8 server_name example.com; 9 10 access_by_lua_block { 11 local allowed_ips = { "X.X.X.X", "Y.Y.Y.Y" } -- 添加允许访问的IP地址到列表中 12 13 local client_ip = ngx.var.http_x_forwarded_for 14 local is_allowed = false 15 16 -- 检查client_ip是否在allowed_ips列表中 17 for _, ip in ipairs(allowed_ips) do 18 if client_ip == ip then 19 is_allowed = true 20 break 21 end 22 end 23 24 if not is_allowed then 25 ngx.status = ngx.HTTP_FORBIDDEN 26 ngx.say("403 Forbidden - You are not allowed to access this resource.") 27 ngx.exit(ngx.HTTP_FORBIDDEN) 28 end 29 } 30 31 location / { 32 # 允许访问的配置 33 34 } 35 } 36 }