Nginx實(shí)現(xiàn)動態(tài)封禁IP的步驟指南
1、簡述
在日常的生產(chǎn)環(huán)境中,網(wǎng)站可能會遭遇惡意請求、DDoS 攻擊或其他有害的訪問行為。為了應(yīng)對這些情況,動態(tài)封禁 IP 是一項(xiàng)十分重要的安全策略。本篇博客將介紹如何通過 NGINX 實(shí)現(xiàn)動態(tài)封禁 IP,從配置到自動化的實(shí)現(xiàn)步驟。
2、實(shí)現(xiàn)方式
NGINX 本身支持簡單的基于 IP 的訪問控制(如 deny 和 allow 指令),但要實(shí)現(xiàn)動態(tài)封禁,通常結(jié)合以下幾種方案:
- fail2ban:一個常用的自動封禁工具,通過監(jiān)控日志發(fā)現(xiàn)惡意行為并自動修改 NGINX 配置文件。
- nginx 動態(tài)模塊:如 ngx_http_limit_req_module 和 ngx_http_limit_conn_module,用于限制請求頻率和并發(fā)數(shù),結(jié)合腳本實(shí)現(xiàn) IP 封禁。
- 基于 Redis 或數(shù)據(jù)庫的方案:可以通過 Lua 腳本或第三方模塊,從 Redis 或 MySQL 等存儲中動態(tài)加載封禁的 IP 列表。
3、使用 fail2ban 動態(tài)封禁
fail2ban 是一種常見的動態(tài)封禁工具,通過監(jiān)控日志文件中的惡意行為自動更新 NGINX 配置。下面是通過 fail2ban 實(shí)現(xiàn)動態(tài)封禁的步驟。
3.1 安裝 fail2ban
sudo apt-get update sudo apt-get install fail2ban
3.2 配置 NGINX 日志
確保 NGINX 配置中的日志能記錄惡意請求。以下是一個簡單的日志配置:
http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; }
3.3 配置 fail2ban 規(guī)則
創(chuàng)建 NGINX 的過濾規(guī)則,編輯 /etc/fail2ban/filter.d/nginx-http-auth.conf,加入以下規(guī)則來匹配日志中的惡意行為:
[Definition] failregex = ^<HOST> -.*"(GET|POST).*HTTP/.*".* 403 ignoreregex =
3.4 設(shè)置 fail2ban 的 jail 配置
在 /etc/fail2ban/jail.local 文件中,增加對 NGINX 的監(jiān)控配置:
[nginx-http-auth] enabled = true port = http,https filter = nginx-http-auth logpath = /var/log/nginx/access.log maxretry = 5
- logpath:指向 NGINX 的日志文件。
- maxretry:設(shè)置多少次失敗后封禁 IP。
3.5 啟動 fail2ban
sudo service fail2ban restart
這樣,當(dāng)某個 IP 連續(xù)訪問 5 次 403 頁面時,它將被自動封禁。
4、使用 NGINX 的 limit 模塊動態(tài)限制
NGINX 自帶的 ngx_http_limit_req_module 和 ngx_http_limit_conn_module 可以用于動態(tài)限制請求。通過設(shè)置請求頻率和并發(fā)連接數(shù),可以有效抵御惡意爬蟲和 DDoS 攻擊。
4.1 配置請求頻率限制
在 NGINX 配置中加入以下代碼來限制每個 IP 的請求頻率:
http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { location / { limit_req zone=one burst=5; } } }
- limit_req_zone:定義一個共享內(nèi)存區(qū)域,用于記錄請求速率。
- rate=1r/s:每個 IP 限制為每秒最多 1 次請求。
4.2 動態(tài)調(diào)整限制
要用 Redis 和 Lua 實(shí)現(xiàn)動態(tài)封禁惡意 IP 的功能,可以借助 Redis 的計數(shù)和過期特性。在 Redis 中,可以用 Lua 腳本來動態(tài)檢測某個 IP 的請求頻率,一旦超過設(shè)定的閾值,就對該 IP 進(jìn)行封禁。
以下是一個 Lua 腳本的樣例,用于封禁惡意 IP。假設(shè)我們會在 Redis 中記錄每個 IP 的請求次數(shù),并在達(dá)到限制后進(jìn)行封禁。以下 Lua 腳本實(shí)現(xiàn)了上述邏輯,設(shè)定了一個限制:IP 在 60 秒內(nèi)請求 10 次以上會觸發(fā)封禁,封禁持續(xù) 3600 秒(1 小時):
-- Lua 腳本實(shí)現(xiàn)動態(tài)封禁惡意IP local ip = KEYS[1] -- 傳入的 IP 地址 local max_requests = tonumber(ARGV[1]) -- 最大請求次數(shù) local ban_time = tonumber(ARGV[2]) -- 封禁持續(xù)時間 local expire_time = tonumber(ARGV[3]) -- IP 計數(shù)的過期時間 -- 構(gòu)建 Redis 鍵 local ip_key = "ip:" .. ip local ban_key = "ban:" .. ip -- 檢查 IP 是否已封禁 if redis.call("EXISTS", ban_key) == 1 then return {false, "IP 已封禁"} end -- 增加 IP 請求計數(shù) local count = redis.call("INCR", ip_key) -- 如果是首次請求,設(shè)置請求計數(shù)的過期時間 if count == 1 then redis.call("EXPIRE", ip_key, expire_time) end -- 檢查請求次數(shù)是否超過最大請求限制 if count > max_requests then -- 達(dá)到限制,封禁 IP 并設(shè)置封禁時間 redis.call("SET", ban_key, "1") redis.call("EXPIRE", ban_key, ban_time) return {false, "已達(dá)請求限制,IP 已封禁"} end -- 如果請求未超限,返回當(dāng)前請求計數(shù) return {true, count}
要在 Redis 中執(zhí)行這個 Lua 腳本,你可以通過 Redis 客戶端執(zhí)行 EVAL 命令。假設(shè) IP 地址是 192.168.0.1,請求限制為 10 次,封禁時間為 3600 秒,計數(shù)過期時間為 60 秒:
EVAL "<LUA_SCRIPT>" 2 192.168.0.1 10 3600 60
5、總結(jié)
通過以上方法,可以實(shí)現(xiàn) NGINX 下的動態(tài)封禁 IP,從而有效保護(hù)網(wǎng)站免受惡意攻擊。在實(shí)際應(yīng)用中,可以根據(jù)需求選擇 fail2ban 或 NGINX 自帶的模塊,甚至結(jié)合數(shù)據(jù)庫方案實(shí)現(xiàn)更復(fù)雜的動態(tài)封禁機(jī)制。
這篇博客為初學(xué)者提供了 NGINX 實(shí)現(xiàn)動態(tài)封禁 IP 的思路和具體配置示例。你可以根據(jù)業(yè)務(wù)場景靈活調(diào)整參數(shù),提升系統(tǒng)安全性。
到此這篇關(guān)于Nginx實(shí)現(xiàn)動態(tài)封禁IP的步驟指南的文章就介紹到這了,更多相關(guān)Nginx動態(tài)封禁IP內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx Lua 根據(jù)參數(shù)請求轉(zhuǎn)發(fā)的實(shí)現(xiàn)
本文介紹了如何使用Nginx和Lua腳本實(shí)現(xiàn)基于參數(shù)的請求轉(zhuǎn)發(fā),文章詳細(xì)說明了配置方法,并提供了示例代碼,幫助讀者理解如何通過NginxLua模塊根據(jù)請求參數(shù)將流量轉(zhuǎn)發(fā)到不同后端服務(wù),這種方法有助于實(shí)現(xiàn)靈活的負(fù)載均衡和動態(tài)內(nèi)容處理2022-05-05Centos7.x下Nginx安裝及SSL配置與常用命令詳解
這篇文章主要介紹了Centos7.x下Nginx安裝及SSL配置與常用命令詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02nginx配置ssl實(shí)現(xiàn)https訪問(小白文)
安全起見,需要將之前的http接口訪問變成https訪問,所以需要配置SSL證書,本文主要介紹了nginx配置ssl實(shí)現(xiàn)https訪問,具有一定的參考價值,感興趣的可以了解一下2023-09-09使用Nginx反向代理與proxy_cache緩存搭建CDN服務(wù)器的配置方法
linux下通過Nginx反向代理和proxy_cache緩存搭建CDN服務(wù)器加快Web訪問速度的配置方法2013-06-06Windows設(shè)置nginx開機(jī)自啟動的方法
這篇文章主要介紹了Windows設(shè)置nginx開機(jī)自啟動的方法,通過兩種方式實(shí)現(xiàn)nginx的開機(jī)自啟動:winws和window計劃程序,每種方式給大家介紹的非常詳細(xì)需要的朋友可以參考下2022-11-11nginx php-fpm環(huán)境中chroot功能的配置使用方法
這篇文章主要介紹了nginx php-fpm環(huán)境中chroot功能的配置使用方法,此方法是比禁用PHP敏感函數(shù)更好的一個安全防護(hù)手手段,需要的朋友可以參考下2014-05-05Nginx應(yīng)用之Location路由反向代理及重寫策略示例
本篇文章主要介紹了Nginx應(yīng)用之Location路由反向代理及重寫策略示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02Nginx配置React項(xiàng)目Url后直接輸入路由路徑時報404問題的解決
這篇文章主要給大家介紹了關(guān)于Nginx配置React項(xiàng)目Url后面直接輸入路由路徑時報404問題的解決方法,文中通過示例代碼將解決的方法介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11