Nginx動態(tài)IP黑名單的實現(xiàn)步驟
需求
為了封禁某些爬蟲或者惡意用戶對服務器的請求,我們需要建立一個動態(tài)的 IP 黑名單。對于黑名單中的 IP ,我們將拒絕提供服務。并且可以設置封禁失效時間
環(huán)境準備
linux version: centos7 / ubuntu 等
redis version: 5.0.5
nginx version: nginx-openresty
設計方案
實現(xiàn) IP 黑名單的功能有很多途徑:
1、在操作系統(tǒng)層面,配置 iptables,來攔截指定 IP 的網(wǎng)絡請求。
優(yōu)點:簡單直接,在服務器物理層面上進行攔截
缺點:每次需要手動上服務器修改配置文件,操作繁瑣且不靈活
2、在 Web 服務器層面,通過 Nginx 自身的 deny 選項或者 lua 插件配置 IP 黑名單。
優(yōu)點:可動態(tài)實現(xiàn)封禁 ip,通過設置封禁時間可以做到分布式封禁
缺點:需要了解 Lua 腳本和 Nginx 配置,有一定的學習成本
3、在應用層面,在處理請求之前檢查客戶端的 IP 地址是否在黑名單中。
優(yōu)點:通過編寫代碼來實現(xiàn),相對簡單且易于維護。
缺點:代碼可能會變得冗長,而且在高并發(fā)情況下可能影響性能。
為了方便管理和共享黑名單,通過 nginx + lua + redis 的架構實現(xiàn) IP 黑名單的功能
配置 nginx.conf
在需要進行限制的 server 的 location 中添加如下配置:
location / { # 如果該location 下存在靜態(tài)資源文件可以做一個判斷 #if ($request_uri ~ .*\.(html|htm|jpg|js|css)) { # access_by_lua_file /usr/local/lua/access_limit.lua; #} access_by_lua_file /usr/local/lua/access_limit.lua; # 加上了這條配置,則會根據(jù) access_limit.lua 的規(guī)則進行限流 alias /usr/local/web/; index index.html index.htm; }
配置 lua 腳本
/usr/local/lua/access_limit.lua -- 可以實現(xiàn)自動將訪問頻次過高的IP地址加入黑名單封禁一段時間 --連接池超時回收毫秒 local pool_max_idle_time = 10000 --連接池大小 local pool_size = 100 --redis 連接超時時間 local redis_connection_timeout = 100 --redis host local redis_host = "your redis host ip" --redis port local redis_port = "your redis port" --redis auth local redis_auth = "your redis authpassword"; --封禁IP時間(秒) local ip_block_time= 120 --指定ip訪問頻率時間段(秒) local ip_time_out = 1 --指定ip訪問頻率計數(shù)最大值(次) local ip_max_count = 3 -- 錯誤日志記錄 local function errlog(msg, ex) ngx.log(ngx.ERR, msg, ex) end -- 釋放連接池 local function close_redis(red) if not red then return end local ok, err = red:set_keepalive(pool_max_idle_time, pool_size) if not ok then ngx.say("redis connct err:",err) return red:close() end end --連接redis local redis = require "resty.redis" local client = redis:new() local ok, err = client:connect(redis_host, redis_port) -- 連接失敗返回服務器錯誤 if not ok then close_redis(client) ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end --設置超時時間 client:set_timeout(redis_connection_timeout) -- 優(yōu)化驗證密碼操作 代表連接在連接池使用的次數(shù),如果為0代表未使用,不為0代表復用 在只有為0時才進行密碼校驗 local connCount, err = client:get_reused_times() -- 新建連接,需要認證密碼 if 0 == connCount then local ok, err = client:auth(redis_auth) if not ok then errlog("failed to auth: ", err) return end --從連接池中獲取連接,無需再次認證密碼 elseif err then errlog("failed to get reused times: ", err) return end -- 獲取請求ip local function getIp() local clientIP = ngx.req.get_headers()["X-Real-IP"] if clientIP == nil then clientIP = ngx.req.get_headers()["x_forwarded_for"] end if clientIP == nil then clientIP = ngx.var.remote_addr end return clientIP end local cliendIp = getIp(); local incrKey = "limit:count:"..cliendIp local blockKey = "limit:block:"..cliendIp --查詢ip是否被禁止訪問,如果存在則返回403錯誤代碼 local is_block,err = client:get(blockKey) if tonumber(is_block) == 1 then ngx.exit(ngx.HTTP_FORBIDDEN) close_redis(client) end local ip_count, err = client:incr(incrKey) if tonumber(ip_count) == 1 then client:expire(incrKey,ip_time_out) end --如果超過單位時間限制的訪問次數(shù),則添加限制訪問標識,限制時間為ip_block_time if tonumber(ip_count) > tonumber(ip_max_count) then client:set(blockKey,1) client:expire(blockKey,ip_block_time) end close_redis(client)
總結
以上,便是 Nginx+Lua+Redis 實現(xiàn)的 IP 黑名單功能,具有如下優(yōu)點:
配置簡單輕量,對服務器性能影響小。
多臺服務器可以通過共享 Redis 實例共享黑名單。
動態(tài)配置,可以手工或者通過某種自動化的方式設置 Redis 中的黑名單
擴展
1、IP 黑名單的應用場景
IP 黑名單在實際應用中具有廣泛的應用場景,主要用于保護服務器和應用免受惡意攻擊、爬蟲或濫用行為的影響。下面列舉幾個常見的應用場景:
防止惡意訪問: 黑名單可以阻止那些試圖通過暴 力 破 解密碼、SQL 注入、XSS 攻擊等方式進行非法訪問的 IP 地址。
防止爬蟲和數(shù)據(jù)濫用: 黑名單可以限制那些頻繁訪問網(wǎng)站并抓取大量數(shù)據(jù)的爬蟲,以減輕服務器負載和保護數(shù)據(jù)安全。
防止 DDOS 攻擊: 黑名單可以封禁那些發(fā)起大規(guī)模DDoS攻擊的IP地址,保護服務器的穩(wěn)定性和安全性。
限制訪問頻率: 黑名單可以限制某個IP在特定時間段內的訪問次數(shù),防止惡意用戶進行暴 力 破 解、刷票等行為。
2、高級功能和改進
除了基本的 IP 黑名單功能外,還可以進行一些高級功能和改進,以提升安全性和用戶體驗:
異常檢測和自動封禁: 通過分析訪問日志和行為模式,可以實現(xiàn)異常檢測功能,并自動將異常行為的 IP 地址封禁,提高安全性。
白名單機制: 除了黑名單,還可以引入白名單機制,允許某些 IP 地址繞過黑名單限制,確保合法用戶的正常訪問。
驗證碼驗證: 對于頻繁訪問或異常行為的 IP,可以要求其進行驗證碼驗證,以進一步防止惡意行為。
數(shù)據(jù)統(tǒng)計和分析: 將黑名單相關的數(shù)據(jù)進行統(tǒng)計和分析,例如記錄封禁 IP 的次數(shù)、持續(xù)時間等信息,以便后續(xù)優(yōu)化和調整策略。
通過不斷改進和優(yōu)化 IP 黑名單功能,可以更好地保護服務器和應用的安全。
到此這篇關于Nginx動態(tài)IP黑名單的實現(xiàn)步驟的文章就介紹到這了,更多相關Nginx動態(tài)IP黑名單內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Nginx設置HttpOnly Secure SameSite參數(shù)解決Cookie信息丟失
本文主要介紹了Nginx中Cookie缺少SameSite屬性的問題,并詳細解釋了HttpOnly、Secure和SameSite屬性的作用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-11-11Nginx服務器中l(wèi)ocation配置的一些基本要點解析
這篇文章主要介紹了Nginx服務器中l(wèi)ocation配置的一些基本要點解析,特別對管理以及查找匹配作出了詳細的講解,需要的朋友可以參考下2015-12-12kubernetes啟用PHP+Nginx網(wǎng)頁環(huán)境教程
這篇文章主要介紹了kubernetes啟用PHP+Nginx網(wǎng)頁環(huán)境教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10前端部署項目后nginx轉發(fā)接口404(頁面正常)詳解
一個網(wǎng)站項目,肯定是避免不了404頁面的,下面這篇文章主要給大家介紹了關于前端部署項目后nginx轉發(fā)接口404(頁面正常)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-06-06Nginx?403?forbidden錯誤的五種原因及詳細解決方法
這篇文章主要給大家介紹了關于Nginx?403?forbidden錯誤的五種原因及詳細解決方法,相信很多人對403 forbidden是什么意思有了大致的了解,那么當我們遇到403 forbidden怎么解決呢,需要的朋友可以參考下2023-08-08nginx-proxy-manager初次登錄報錯502?bad?gateway解決
這篇文章主要給大家介紹了關于nginx-proxy-manager初次登錄報錯502?bad?gateway的解決辦法,502?Bad?Gateway服務器作為網(wǎng)關或者代理時,為了完成請求訪問下一個服務器,但該服務器返回了非法的應答,需要的朋友可以參考下2024-04-04深入分析nginx+php-fpm服務HTTP狀態(tài)碼502
這篇文章主要介紹了深入分析nginx+php-fpm服務HTTP狀態(tài)碼502,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-07-07