最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nginx結合Openresty通過Lua+Redis實現動態(tài)封禁IP

 更新時間:2023年11月28日 10:28:23   作者:樂辭  
為了封禁某些爬蟲或者惡意用戶對服務器的請求,我們需要建立一個動態(tài)的 IP 黑名單,本文主要介紹了Nginx結合Openresty通過Lua+Redis實現動態(tài)封禁IP,感興趣的可以了解一下

需求

為了封禁某些爬蟲或者惡意用戶對服務器的請求,我們需要建立一個動態(tài)的 IP 黑名單。對于黑名單中的 IP ,我們將拒絕提供服務。并且可以設置封禁失效時間

環(huán)境準備

  • linux version: centos7 / ubuntu 等
  • redis version: 5.0.5
  • nginx version: nginx-openresty

設計方案

實現 IP 黑名單的功能有很多途徑:
1、在操作系統(tǒng)層面,配置 iptables,來攔截指定 IP 的網絡請求。

  • 優(yōu)點:簡單直接,在服務器物理層面上進行攔截
  • 缺點:每次需要手動上服務器修改配置文件,操作繁瑣且不靈活

2、在 Web 服務器層面,通過 Nginx 自身的 deny 選項或者 lua 插件配置 IP 黑名單。

  • 優(yōu)點:可動態(tài)實現封禁 ip,通過設置封禁時間可以做到分布式封禁
  • 缺點:需要了解 Lua 腳本和 Nginx 配置,有一定的學習成本

3、在應用層面,在處理請求之前檢查客戶端的 IP 地址是否在黑名單中。

  • 優(yōu)點:通過編寫代碼來實現,相對簡單且易于維護。
  • 缺點:代碼可能會變得冗長,而且在高并發(fā)情況下可能影響性能。

為了方便管理和共享黑名單,通過 nginx + lua + redis 的架構實現 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; # 加上了這條配置,則會根據 access_limit.lua 的規(guī)則進行限流
    alias /usr/local/web/;
    index  index.html index.htm;
}

配置 lua 腳本

/usr/local/lua/access_limit.lua

-- 可以實現自動將訪問頻次過高的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訪問頻率計數最大值(次)
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)化驗證密碼操作 代表連接在連接池使用的次數,如果為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
--如果超過單位時間限制的訪問次數,則添加限制訪問標識,限制時間為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 實現的 IP 黑名單功能,具有如下優(yōu)點:

  • 配置簡單輕量,對服務器性能影響小。
  • 多臺服務器可以通過共享 Redis 實例共享黑名單。
  • 動態(tài)配置,可以手工或者通過某種自動化的方式設置 Redis 中的黑名單

擴展

1、IP 黑名單的應用場景

IP 黑名單在實際應用中具有廣泛的應用場景,主要用于保護服務器和應用免受惡意攻擊、爬蟲或濫用行為的影響。下面列舉幾個常見的應用場景:

  • 防止惡意訪問:黑名單可以阻止那些試圖通過暴力破解密碼、SQL 注入、XSS 攻擊等方式進行非法訪問的 IP 地址。
  • 防止爬蟲和數據濫用:黑名單可以限制那些頻繁訪問網站并抓取大量數據的爬蟲,以減輕服務器負載和保護數據安全。
  • 防止 DDOS 攻擊:黑名單可以封禁那些發(fā)起大規(guī)模DDoS攻擊的IP地址,保護服務器的穩(wěn)定性和安全性。
  • 限制訪問頻率:黑名單可以限制某個IP在特定時間段內的訪問次數,防止惡意用戶進行暴力破解、刷票等行為。

2、高級功能和改進

除了基本的 IP 黑名單功能外,還可以進行一些高級功能和改進,以提升安全性和用戶體驗:

  • 異常檢測和自動封禁:通過分析訪問日志和行為模式,可以實現異常檢測功能,并自動將異常行為的 IP 地址封禁,提高安全性。
  • 白名單機制:除了黑名單,還可以引入白名單機制,允許某些 IP 地址繞過黑名單限制,確保合法用戶的正常訪問。
  • 驗證碼驗證:對于頻繁訪問或異常行為的 IP,可以要求其進行驗證碼驗證,以進一步防止惡意行為。
  • 數據統(tǒng)計和分析:將黑名單相關的數據進行統(tǒng)計和分析,例如記錄封禁 IP 的次數、持續(xù)時間等信息,以便后續(xù)優(yōu)化和調整策略。

通過不斷改進和優(yōu)化 IP 黑名單功能,可以更好地保護服務器和應用的安全。

到此這篇關于Nginx結合Openresty通過Lua+Redis實現動態(tài)封禁IP的文章就介紹到這了,更多相關Nginx 動態(tài)封禁IP內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Nginx地址重定向的實現

    Nginx地址重定向的實現

    重定向 是將一個域名或地址指向另一個的方法,本文主要介紹了Nginx地址重定向的實現,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • 永中文檔在線轉換預覽基于nginx配置部署方案

    永中文檔在線轉換預覽基于nginx配置部署方案

    這篇文章主要為大家介紹了永中文檔在線轉換預覽基于nginx配置部署方案的實現,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 使用nginx+二級域名+https支持

    使用nginx+二級域名+https支持

    這篇文章主要介紹了使用nginx+二級域名+https支持,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Nginx部署SSL證書的過程

    Nginx部署SSL證書的過程

    SSL證書是數字證書的一種,類似于駕駛證、護照和營業(yè)執(zhí)照的電子副本,這篇文章主要介紹了Nginx部署SSL證書的相關知識,需要的朋友可以參考下
    2022-10-10
  • 詳解NGINX如何統(tǒng)計網站的PV、UV、獨立IP

    詳解NGINX如何統(tǒng)計網站的PV、UV、獨立IP

    做網站的都知道,平常經常要查詢下網站PV、UV等網站的訪問數據,這篇文章主要介紹了詳解NGINX如何統(tǒng)計網站的PV、UV、獨立IP ,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Nginx 反向代理配置避坑指南(proxy_pass 斜杠、502排查、CORS、文件上傳)

    Nginx 反向代理配置避坑指南(proxy_pass 斜杠、502排查、CORS、文件上傳)

    本文系統(tǒng)總結了Docker環(huán)境下Nginx反向代理配置的10個常見問題及解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-03-03
  • WebApi部署多服務器配置Nginx負載均衡的教程

    WebApi部署多服務器配置Nginx負載均衡的教程

    這篇文章主要介紹了WebApi部署多服務器配置Nginx負載均衡 ,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • CentOS 6.7下nginx SSL證書部署的方法

    CentOS 6.7下nginx SSL證書部署的方法

    這篇文章主要介紹了在CentOS 6.7下nginx SSL證書部署的方法,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • Nginx 禁止IP訪問 只允許域名訪問

    Nginx 禁止IP訪問 只允許域名訪問

    今天要在Nginx上設置禁止通過IP訪問服務器,只能通過域名訪問,這樣做是為了避免別人把未備案的域名解析到自己的服務器IP而導致服務器被斷網,從網絡上搜到以下解決方案
    2016-09-09
  • nginx 配置代理服務地址最后多加反斜杠和不加反斜杠的區(qū)別小結

    nginx 配置代理服務地址最后多加反斜杠和不加反斜杠的區(qū)別小結

    在使用Nginx配置代理服務時,地址最后是否添加反斜杠(/)會對代理的URL處理產生影響,下面就來具體介紹一下,感興趣的可以了解一下
    2024-08-08

最新評論

郴州市| 青川县| 鹤山市| 会泽县| 舟山市| 凤城市| 铁力市| 英德市| 凤山县| 邯郸县| 宜兰县| 阿巴嘎旗| 庆城县| 嘉荫县| 西乌| 湖州市| 金溪县| 桑植县| 根河市| 太谷县| 满洲里市| 贡嘎县| 景德镇市| 四会市| 邓州市| 明光市| 南宫市| 元阳县| 沽源县| 新疆| 冷水江市| 比如县| 石柱| 乌拉特前旗| 云浮市| 永寿县| 建水县| 文安县| 乌兰察布市| 格尔木市| 北宁市|