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

Nginx動(dòng)態(tài)IP黑名單的實(shí)現(xiàn)步驟

 更新時(shí)間:2025年02月16日 15:51:04   作者:0110編程之路  
為了封禁某些爬蟲或者惡意用戶對(duì)服務(wù)器的請(qǐng)求,我們需要建立一個(gè)動(dòng)態(tài)的?IP?黑名單,本文主要介紹了Nginx動(dòng)態(tài)IP黑名單的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下

需求

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

環(huán)境準(zhǔn)備

  • linux version: centos7  / ubuntu 等

  • redis version: 5.0.5

  • nginx version: nginx-openresty

設(shè)計(jì)方案

實(shí)現(xiàn) IP 黑名單的功能有很多途徑:

1、在操作系統(tǒng)層面,配置 iptables,來(lái)攔截指定 IP 的網(wǎng)絡(luò)請(qǐng)求。

  • 優(yōu)點(diǎn):簡(jiǎn)單直接,在服務(wù)器物理層面上進(jìn)行攔截

  • 缺點(diǎn):每次需要手動(dòng)上服務(wù)器修改配置文件,操作繁瑣且不靈活

2、在 Web 服務(wù)器層面,通過(guò) Nginx 自身的 deny 選項(xiàng)或者 lua 插件配置 IP 黑名單。

  • 優(yōu)點(diǎn):可動(dòng)態(tài)實(shí)現(xiàn)封禁 ip,通過(guò)設(shè)置封禁時(shí)間可以做到分布式封禁

  • 缺點(diǎn):需要了解 Lua 腳本和 Nginx 配置,有一定的學(xué)習(xí)成本

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

  • 優(yōu)點(diǎn):通過(guò)編寫代碼來(lái)實(shí)現(xiàn),相對(duì)簡(jiǎn)單且易于維護(hù)。

  • 缺點(diǎn):代碼可能會(huì)變得冗長(zhǎng),而且在高并發(fā)情況下可能影響性能。

為了方便管理和共享黑名單,通過(guò) nginx + lua + redis 的架構(gòu)實(shí)現(xiàn) IP 黑名單的功能

配置 nginx.conf

在需要進(jìn)行限制的 server 的 location 中添加如下配置:

location / {
    # 如果該location 下存在靜態(tài)資源文件可以做一個(gè)判斷      
    #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; # 加上了這條配置,則會(huì)根據(jù) access_limit.lua 的規(guī)則進(jìn)行限流
    alias /usr/local/web/;
    index  index.html index.htm;
}

配置 lua 腳本

/usr/local/lua/access_limit.lua
-- 可以實(shí)現(xiàn)自動(dòng)將訪問(wèn)頻次過(guò)高的IP地址加入黑名單封禁一段時(shí)間

--連接池超時(shí)回收毫秒
local pool_max_idle_time = 10000
--連接池大小
local pool_size = 100
--redis 連接超時(shí)時(shí)間
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時(shí)間(秒)
local ip_block_time= 120
--指定ip訪問(wèn)頻率時(shí)間段(秒)
local ip_time_out = 1
--指定ip訪問(wèn)頻率計(jì)數(shù)最大值(次)
local ip_max_count = 3


--  錯(cuò)誤日志記錄
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)
-- 連接失敗返回服務(wù)器錯(cuò)誤
if not ok then
    close_redis(client)
    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
end
--設(shè)置超時(shí)時(shí)間
client:set_timeout(redis_connection_timeout)

-- 優(yōu)化驗(yàn)證密碼操作 代表連接在連接池使用的次數(shù),如果為0代表未使用,不為0代表復(fù)用 在只有為0時(shí)才進(jìn)行密碼校驗(yàn)
local connCount, err = client:get_reused_times()
-- 新建連接,需要認(rèn)證密碼
if  0 == connCount then
    local ok, err = client:auth(redis_auth)
    if not ok then
        errlog("failed to auth: ", err)
        return
    end
    --從連接池中獲取連接,無(wú)需再次認(rèn)證密碼
elseif err then
    errlog("failed to get reused times: ", err)
    return
end

-- 獲取請(qǐng)求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是否被禁止訪問(wèn),如果存在則返回403錯(cuò)誤代碼
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
--如果超過(guò)單位時(shí)間限制的訪問(wèn)次數(shù),則添加限制訪問(wèn)標(biāo)識(shí),限制時(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)

總結(jié)

以上,便是 Nginx+Lua+Redis 實(shí)現(xiàn)的 IP 黑名單功能,具有如下優(yōu)點(diǎn):

  • 配置簡(jiǎn)單輕量,對(duì)服務(wù)器性能影響小。

  • 多臺(tái)服務(wù)器可以通過(guò)共享 Redis 實(shí)例共享黑名單。

  • 動(dòng)態(tài)配置,可以手工或者通過(guò)某種自動(dòng)化的方式設(shè)置 Redis 中的黑名單

擴(kuò)展

1、IP 黑名單的應(yīng)用場(chǎng)景

IP 黑名單在實(shí)際應(yīng)用中具有廣泛的應(yīng)用場(chǎng)景,主要用于保護(hù)服務(wù)器和應(yīng)用免受惡意攻擊、爬蟲或?yàn)E用行為的影響。下面列舉幾個(gè)常見的應(yīng)用場(chǎng)景:

  • 防止惡意訪問(wèn): 黑名單可以阻止那些試圖通過(guò)暴 力 破 解密碼、SQL 注入、XSS 攻擊等方式進(jìn)行非法訪問(wèn)的 IP 地址。

  • 防止爬蟲和數(shù)據(jù)濫用: 黑名單可以限制那些頻繁訪問(wèn)網(wǎng)站并抓取大量數(shù)據(jù)的爬蟲,以減輕服務(wù)器負(fù)載和保護(hù)數(shù)據(jù)安全。

  • 防止 DDOS 攻擊: 黑名單可以封禁那些發(fā)起大規(guī)模DDoS攻擊的IP地址,保護(hù)服務(wù)器的穩(wěn)定性和安全性。

  • 限制訪問(wèn)頻率: 黑名單可以限制某個(gè)IP在特定時(shí)間段內(nèi)的訪問(wèn)次數(shù),防止惡意用戶進(jìn)行暴 力 破 解、刷票等行為。

2、高級(jí)功能和改進(jìn)

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

  • 異常檢測(cè)和自動(dòng)封禁: 通過(guò)分析訪問(wèn)日志和行為模式,可以實(shí)現(xiàn)異常檢測(cè)功能,并自動(dòng)將異常行為的 IP 地址封禁,提高安全性。

  • 白名單機(jī)制: 除了黑名單,還可以引入白名單機(jī)制,允許某些 IP 地址繞過(guò)黑名單限制,確保合法用戶的正常訪問(wèn)。

  • 驗(yàn)證碼驗(yàn)證: 對(duì)于頻繁訪問(wèn)或異常行為的 IP,可以要求其進(jìn)行驗(yàn)證碼驗(yàn)證,以進(jìn)一步防止惡意行為。

  • 數(shù)據(jù)統(tǒng)計(jì)和分析: 將黑名單相關(guān)的數(shù)據(jù)進(jìn)行統(tǒng)計(jì)和分析,例如記錄封禁 IP 的次數(shù)、持續(xù)時(shí)間等信息,以便后續(xù)優(yōu)化和調(diào)整策略。

通過(guò)不斷改進(jìn)和優(yōu)化 IP 黑名單功能,可以更好地保護(hù)服務(wù)器和應(yīng)用的安全。

到此這篇關(guān)于Nginx動(dòng)態(tài)IP黑名單的實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)Nginx動(dòng)態(tài)IP黑名單內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Nginx禁止指定UA訪問(wèn)的方法

    Nginx禁止指定UA訪問(wèn)的方法

    這篇文章主要介紹了Nginx禁止指定UA訪問(wèn)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Nginx的try_files指令使用實(shí)例

    Nginx的try_files指令使用實(shí)例

    這篇文章主要介紹了Nginx的try_files指令使用實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • Nginx前端頁(yè)面刷新后出現(xiàn)404的原因與解決方案

    Nginx前端頁(yè)面刷新后出現(xiàn)404的原因與解決方案

    這篇文章主要來(lái)為大家詳細(xì)介紹一下Nginx前端頁(yè)面刷新后出現(xiàn)404 Not Found的原因與對(duì)應(yīng)的解決方案,有需要的小伙伴可以根據(jù)情況參考一下
    2025-03-03
  • nginx實(shí)現(xiàn)動(dòng)靜分離的方法示例

    nginx實(shí)現(xiàn)動(dòng)靜分離的方法示例

    Nginx的靜態(tài)處理能力很強(qiáng),但是動(dòng)態(tài)處理能力不足,因此,在企業(yè)中常用動(dòng)靜分離技術(shù),本文就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下
    2021-11-11
  • Nginx源碼安裝的方法步驟

    Nginx源碼安裝的方法步驟

    這篇文章主要介紹了Nginx源碼安裝的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • nginx配置keepalive長(zhǎng)連接的實(shí)現(xiàn)方法

    nginx配置keepalive長(zhǎng)連接的實(shí)現(xiàn)方法

    長(zhǎng)連接允許客戶端在同一個(gè)TCP連接上發(fā)送多個(gè)請(qǐng)求,以減少連接握手的開銷,提高網(wǎng)站性能,本文主要介紹了nginx配置keepalive長(zhǎng)連接的實(shí)現(xiàn)方法,感興趣的可以了解一下
    2023-08-08
  • 詳解ngx_cache_purge _proxy_cache指令使用

    詳解ngx_cache_purge _proxy_cache指令使用

    本文主要介紹了詳解ngx_cache_purge _proxy_cache指令使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 在Nginx上配置多個(gè)站點(diǎn)的方法

    在Nginx上配置多個(gè)站點(diǎn)的方法

    這篇文章主要介紹了在Nginx上配置多個(gè)站點(diǎn)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • nginx中的日志切割詳解

    nginx中的日志切割詳解

    Nginx日志切割是定期將訪問(wèn)日志和錯(cuò)誤日志分割成多個(gè)文件,以優(yōu)化性能、便于管理和分析,常見的實(shí)現(xiàn)方法包括使用logrotate工具和編寫自定義腳本,解決常見的問(wèn)題如Nginx不再寫入新日志和權(quán)限問(wèn)題,需要確保正確的信號(hào)發(fā)送和權(quán)限設(shè)置
    2025-11-11
  • nginx配置location方法總結(jié)

    nginx配置location方法總結(jié)

    這篇文章主要介紹了nginx配置location方法總結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01

最新評(píng)論

大安市| 浦北县| 银川市| 五家渠市| 望奎县| 伽师县| 淄博市| 托克逊县| 营山县| 姚安县| 玛曲县| 信阳市| 英德市| 遂昌县| 商丘市| 盖州市| 射阳县| 双桥区| 沙坪坝区| 长治市| 岗巴县| 汉寿县| 清水河县| 太白县| 临安市| 洪洞县| 合肥市| 临澧县| 阆中市| 都兰县| 雅安市| 蒲城县| 博罗县| 延安市| 水城县| 泸西县| 泰宁县| 通许县| 波密县| 平南县| 龙陵县|