0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

分享一個自動封IP的腳本

阿銘linux ? 來源:阿銘linux ? 2023-05-19 15:15 ? 次閱讀

最近幾天有一個問題一直困擾著我,就是我維護的一個網(wǎng)站最近幾天總是在整點附近出問題,那時候數(shù)據(jù)庫服務器CPU使用率超高,持續(xù)時間1-5分鐘。

ece267a6-f614-11ed-90ce-dac502259ad0.png

然后,我就開始各種查、各種記,出問題的時間點,數(shù)據(jù)庫查詢量很大,我把這些查詢記錄了下來,并做分析,然而并沒有什么特別有規(guī)律的現(xiàn)象,因為這些查詢非常分散,跟正常的查詢一般無二,唯一區(qū)別就是量大。

同時,也去分析了WEB端的訪問日志,截取出問題那幾分鐘的日志進行分析,過去兩天一直都沒有找到規(guī)律,跟數(shù)據(jù)庫一樣,非常分散,跟正常的訪問一樣,只是量大了一些。

我甚至懷疑是不是這臺數(shù)據(jù)庫服務器的硬件出現(xiàn)了問題,畢竟我們用的是騰訊云的機器,云主機存在資源共享的問題。所以,我還提交了工單,讓售后去幫忙查,但無果。

今天,我再次分析日志時,發(fā)現(xiàn)了一些規(guī)律,那就是有三個ip訪問量非常大。

ecead4d6-f614-11ed-90ce-dac502259ad0.png

這是一分鐘內(nèi)的統(tǒng)計數(shù)據(jù),左邊為IP的請求次數(shù),一分鐘一個正常的IP的請求數(shù)怎么可能超過1000次呢?甚至連100次都不應該超過才對。所以,直接把IP封掉。

也許這幾天的問題跟IP訪問量大沒有直接關(guān)系,但既然今天發(fā)現(xiàn)了此問題,那就先解決再說。

考慮到后面還會有類似的IP訪問,那我干脆直接寫一個自動封IP的腳本,IP封了肯定需要自動解封,所以,我的腳本主要邏輯是:

1)每分鐘查一下過去1分鐘的日志,對IP進行分析,將訪問量大于400的給封掉;

2)每隔半小時針對過去半小時以來的被封的IP進行分析,如果不再有數(shù)據(jù)包過來,則解封。 下面是腳本內(nèi)容:

#! /bin/bash
#定義1分鐘以前的時間,用于過濾1分鐘以前的日志
t1=`date -d "-1 min" +%Y:%H:%M`
log=/var/log/nginx/access.log


block_ip()
{
    egrep "$t1:[0-5]+" $log > /tmp/tmp_last_min.log


    #把1分鐘內(nèi)訪問量高于400的ip記錄到一個臨時文件中
#過濾掉白名單IP(81.123.35.171)
awk'{print$1}'/tmp/tmp_last_min.log|grep-v'81.123.35.171'|sort-n|uniq-c|sort-n|awk'$1>400{print$2}'>/tmp/bad_ip.list


    #計算ip的數(shù)量
    n=`wc -l /tmp/bad_ip.list|awk '{print $1}'`


    #當ip數(shù)大于0時,才會用iptables封掉它
    if [ $n -ne 0 ]
    then
        for ip in `cat /tmp/bad_ip.list`
        do
            /usr/sbin/iptables -I INPUT -s $ip -j DROP
        done
        #將這些被封的IP記錄到日志里
        echo "`date` 封掉的IP有:" >> /tmp/block_ip.log
        cat /tmp/bad_ip.list >> /tmp/block_ip.log
    fi
}


unblock_ip()
{
    #首先將包個數(shù)小于5的ip記錄到一個臨時文件里,把它們標記為白名單IP
    /usr/sbin/iptables -nvL INPUT|sed '1d' |awk '$1<5 {print $8}' > /tmp/good_ip.list
    n=`wc -l /tmp/good_ip.list|awk '{print $1}'`
    if [ $n -ne 0 ]
    then
        for ip in `cat /tmp/good_ip.list`
        do
            /usr/sbin/iptables -D INPUT -s $ip -j DROP
        done
        echo "`date` 解封的IP有:" >> /tmp/unblock_ip.log
        cat /tmp/good_ip.list >> /tmp/unblock_ip.log
    fi
    #當解封完白名單IP后,將計數(shù)器清零,進入下一個計數(shù)周期
    /usr/sbin/iptables -Z
}


#取當前時間的分鐘數(shù)
t=`date +%M`


#當分鐘數(shù)為00或者30時(即每隔30分鐘),執(zhí)行解封IP的函數(shù),其他時間只執(zhí)行封IP的函數(shù)
if [ $t == "00" ] || [ $t == "30" ]
then
   unblock_ip
   block_ip
else
   block_ip
fi

然后寫一個每分鐘都執(zhí)行的任務計劃就可以啦。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Web服務器
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    24436

原文標題:分享一個自動封IP的腳本

文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    介紹10Python自動腳本

    在這個自動化時代,我們有很多重復無聊的工作要做。想想這些你不再需要一次又一次地做的無聊的事情,讓它自動化,讓你的生活更輕松。那么在本文中,我將向您介紹 10 Python
    發(fā)表于 10-17 09:27 ?948次閱讀

    10殺手級的Python自動腳本

    今天浩道跟大家分享10日常工作中用到的python自動腳本。讓你感受番python簡單強大之處!
    發(fā)表于 11-28 11:07 ?691次閱讀

    python腳本如何根據(jù)公網(wǎng)IP自動獲取地址和天氣信息?

    python腳本如何根據(jù)公網(wǎng)IP自動獲取地址和天氣信息?
    發(fā)表于 12-28 07:14

    自動化重啟服務腳本

    腳本可以每分鐘執(zhí)行次,腳本執(zhí)行時截取上分鐘的日志,可以計算總?cè)罩拘袛?shù),和出現(xiàn)502的行數(shù),計算比例,這里我給大家定
    的頭像 發(fā)表于 11-22 10:12 ?1279次閱讀

    10殺手級的Python自動腳本分享

    重復性任務總是耗時且無聊,想想你想要張地裁剪 100 張照片或 Fetch API、糾正拼寫和語法等工作,所有這些任務都很耗時,為什么不自動化它們呢?在今天的文章中,我將與你分
    的頭像 發(fā)表于 01-06 15:34 ?766次閱讀

    分享10實用的Python自動腳本

    重復性任務總是耗時且無聊,想想你想要張地裁剪 100 張照片或 Fetch API、糾正拼寫和語法等工作,所有這些任務都很耗時,為什么不自動化它們呢?在今天的文章中,我將與你分
    的頭像 發(fā)表于 01-21 15:58 ?1348次閱讀

    網(wǎng)站總被攻擊?寫個自動封禁IP腳本給你

    個人網(wǎng)站總被攻擊?寫個自動封禁IP腳本給你!
    的頭像 發(fā)表于 01-29 11:44 ?1130次閱讀

    通過腳本搞懂fork、source和exec

    Source模式下,子shell執(zhí)行時獲取的環(huán)境變量會會影響到父shell。與fork的區(qū)別在于,不會額外打開sub-shell來執(zhí)行被調(diào)用的腳本,而是在同一個shell中執(zhí)行。所
    的頭像 發(fā)表于 02-03 16:05 ?1772次閱讀

    ip腳本進化的解決辦法

    上次給大家分享過IP腳本。我搞那個腳本的目的是為了把訪問量太大的IP地址給封掉,然后每隔半
    的頭像 發(fā)表于 06-11 17:03 ?701次閱讀
    封<b class='flag-5'>ip</b><b class='flag-5'>腳本</b>進化的解決辦法

    keil自動化編譯腳本

    這是 keil 的自動化編譯腳本,可被其他腳本或程序調(diào)用,接收參數(shù)并按參數(shù)編譯 keil 工程,而不必打開 keil 軟件,實現(xiàn)程序上的
    的頭像 發(fā)表于 10-16 17:04 ?1946次閱讀
    keil<b class='flag-5'>自動</b>化編譯<b class='flag-5'>腳本</b>

    如何使用腳本完成CRC和填充值的自動完成

    恩智浦的MPC架構(gòu)的微控制器使用的開發(fā)環(huán)境IDE是S32DS ,該IDE使用的GNU GCC工具鏈沒有提供對編譯結(jié)果的CRC校驗和自動生成工具,所以需要我們制作腳本
    的頭像 發(fā)表于 10-21 09:50 ?1062次閱讀
    如何使用<b class='flag-5'>腳本</b>完成CRC和填充值的<b class='flag-5'>自動</b>完成

    怎么用Python構(gòu)建自動發(fā)送郵件的腳本

    ? 類似的應用場景還有很多,不僅僅是在股票策略提醒上,比如定時向某些人發(fā)送郵件;網(wǎng)站宕機了,實時發(fā)送郵件提醒;網(wǎng)站負載過高,發(fā)送郵件提醒......等等。 下面就來講講怎么用Python構(gòu)建自動發(fā)送郵件的
    的頭像 發(fā)表于 10-21 14:47 ?777次閱讀
    怎么用Python構(gòu)建<b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>自動</b>發(fā)送郵件的<b class='flag-5'>腳本</b>

    怎么用Python構(gòu)建自動發(fā)送郵件的腳本

    呢? 類似的應用場景還有很多,不僅僅是在股票策略提醒上,比如定時向某些人發(fā)送郵件;網(wǎng)站宕機了,實時發(fā)送郵件提醒;網(wǎng)站負載過高,發(fā)送郵件提醒......等等。 下面就來講講怎么用Python構(gòu)建自動發(fā)送郵件的
    的頭像 發(fā)表于 10-31 16:36 ?563次閱讀
    怎么用Python構(gòu)建<b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>自動</b>發(fā)送郵件的<b class='flag-5'>腳本</b>

    編寫點名器腳本

    目的:編寫腳本,可以將準別好的名字合集的.txt傳入腳本,然后每次隨機顯示一個人的姓名
    的頭像 發(fā)表于 11-06 12:41 ?599次閱讀
    編寫<b class='flag-5'>一</b><b class='flag-5'>個</b>點名器<b class='flag-5'>腳本</b>

    簡單的Shiro RCE檢測和利用腳本

    簡單的Shiro RCE檢測和利用腳本。
    的頭像 發(fā)表于 01-09 09:46 ?663次閱讀