nginx動態(tài)添加訪問白名單的方法
本文實(shí)現(xiàn)的功能是:網(wǎng)站啟用訪問白名單,對于不在白名單中又需要訪問的客戶,只需打開一個不公開的網(wǎng)址,然后自動獲得2小時(shí)的訪問權(quán)限,時(shí)間達(dá)到后自動刪除訪問權(quán)限
實(shí)現(xiàn)此功能需要以下幾個步驟:
- nginx啟用訪問白名單
- 客戶打開指定網(wǎng)址自動添加訪問白名單
- 為網(wǎng)址添加簡單的認(rèn)證
- 每兩個小時(shí)自動恢復(fù)默認(rèn)白名單,刪除臨時(shí)IP訪問權(quán)限
一、nginx配置訪問白名單
這個就比較簡單了,簡單貼一下配置:
............nginx.conf...........
geo $remote_addr $ip_whitelist { default 0; include ip_white.conf; }
............server段............
location / { if ($ip_whitelist = 1) { break; } return 403; }
啟用白名單的IP寫在ip_white.conf文件中,格式為: 8.8.8.8 1;,只需將IP按照格式寫入ip_white.conf中即可獲得訪問權(quán)限。
二、使用LUA自動添加白名單
nginx需配合lua模塊才能實(shí)現(xiàn)這個功能,新建一個location,客戶訪問這個location時(shí),使用lua拿到客戶IP并調(diào)用shell腳本寫入ip_white.conf中,寫入后自動reload nginx使配置生效,lua代碼:
location /addip { content_by_lua ' CLIENT_IP = ngx.req.get_headers()["X_real_ip"] if CLIENT_IP == nil then CLIENT_IP = ngx.req.get_headers()["X_Forwarded_For"] end if CLIENT_IP == nil then CLIENT_IP = ngx.var.remote_addr end if CLIENT_IP == nil then CLIENT_IP = "unknown" end ngx.header.content_type = "text/html;charset=UTF-8"; ngx.say("你的IP : "..CLIENT_IP.."<br/>"); os.execute("/opt/ngx_add.sh "..CLIENT_IP.."") ngx.say("添加白名單完成,有效時(shí)間最長為2小時(shí)"); '; }
/opt/ngx_add.sh shell腳本內(nèi)容:
#!/bin/bash ngx_conf=/usr/local/nginx/conf/52os.net/ip_white.conf ngx_back=/usr/local/nginx/conf/52os.net/ip_white.conf.default result=`cat $ngx_conf |grep $1` case $1 in rec) rm -rf $ngx_conf cp $ngx_back $ngx_conf /usr/local/nginx/sbin/nginx -s reload ;; *) if [ -z "$result" ] then echo "#####add by web #####" >>$ngx_conf echo "$1 1;" >> $ngx_conf /usr/local/nginx/sbin/nginx -s reload else exit 0 fi ;; esac
該腳本有兩個功能:
- 自動加IP并reload nginx
- 恢復(fù)默認(rèn)的ip_white.conf文件,配合定時(shí)任務(wù)可以取消非默認(rèn)IP的訪問權(quán)限
nginx主進(jìn)程使用root運(yùn)行,shell腳本reload nginx需設(shè)置粘滯位:
chown root.root /usr/local/nginx/sbin/nginx chmod 4755 /usr/local/nginx/sbin/nginx
nginx啟用lua模塊見nginx啟用lua模塊
三、添加簡單的認(rèn)證
使用base auth 添加簡單的用戶名密碼認(rèn)證,防止非授權(quán)訪問,生成密碼文件:
printf "52os.net:$(openssl passwd -crypt 123456)\n" >>/usr/local/nginx/conf/pass
賬號:52os.net
密碼:123456
在剛剛的location中加入:
location /addip { auth_basic "nginx auto addIP for 52os.net"; auth_basic_user_file /usr/local/nginx/conf/pass; autoindex on;
......Lua代碼略......
四、自動恢復(fù)默認(rèn)IP白名單
通過web獲得訪問權(quán)限的IP,設(shè)置訪問有效期為兩小時(shí),我是通過每兩小時(shí)恢復(fù)一次默認(rèn)的IP白名單文件實(shí)現(xiàn)。把ip_white.conf文件復(fù)制一份作為默認(rèn)的白名單模版:
cp /usr/local/nginx/conf/52os.net/ip_white.conf /usr/local/nginx/conf/52os.net/ip_white.conf.default
使用定時(shí)任務(wù)每兩小時(shí)通用上面的shell腳本來恢復(fù),定時(shí)任務(wù)為:
1 */2 * * * root /opt/ngx_add.sh rec
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
OpenResty中實(shí)現(xiàn)按QPS、時(shí)間范圍、來源IP進(jìn)行限流的方法
OpenResty是一個基于Nginx與Lua的高性能Web平臺,它通過LuaJIT在Nginx中運(yùn)行高效的Lua腳本和模塊,可以用來處理復(fù)雜的網(wǎng)絡(luò)請求,并且支持各種流量控制和限制的功能,這篇文章主要介紹了OpenResty中實(shí)現(xiàn)按QPS、時(shí)間范圍、來源IP進(jìn)行限流,需要的朋友可以參考下2024-02-02Nginx 反向代理與負(fù)載均衡運(yùn)行小結(jié)
Nginx還支持對后端服務(wù)器進(jìn)行健康檢查,當(dāng)某個服務(wù)器不可用時(shí),Nginx會自動將流量重定向到其他可用的服務(wù)器,這篇文章給大家分享Nginx 反向代理與負(fù)載均衡是如何運(yùn)行的,感興趣的朋友一起看看吧2024-03-03使用Nginx?+?Keepalived?實(shí)現(xiàn)高可用?Web?負(fù)載均衡筆記(虛擬機(jī))
這篇文章主要介紹了使用Nginx?+?Keepalived?實(shí)現(xiàn)高可用?Web?負(fù)載均衡筆記,需要的朋友可以參考下2023-08-08nginx 負(fù)載均衡的三種參數(shù)設(shè)置
這篇文章主要介紹了nginx 負(fù)載均衡的三種參數(shù)設(shè)置,需要的朋友可以參考下2017-07-07Nginx將http轉(zhuǎn)換成https的詳細(xì)過程
相信大家在現(xiàn)有項(xiàng)目里都會通過https訪問,這篇文章主要給大家介紹了關(guān)于Nginx將http轉(zhuǎn)換成https的詳細(xì)過程,文中將實(shí)現(xiàn)的方法介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05nginx:413 Request Entity Too Large的處理辦法--修改 PHP上傳文件大小
在用 phpMyAdmin 進(jìn)行 sql 數(shù)據(jù)庫導(dǎo)入的時(shí)候,經(jīng)常需要上傳比較大的 sql 數(shù)據(jù)文件,而這時(shí)會常碰見 nginx報(bào)錯:413 Request Entity Too Large。解決此問題,根據(jù)上傳數(shù)據(jù)文件的大小進(jìn)行修改處理2014-06-06