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

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

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

分享一個(gè)自動(dòng)封IP的腳本

阿銘linux ? 來(lái)源:阿銘linux ? 2023-05-19 15:15 ? 次閱讀

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

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

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

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

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

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

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

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

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

考慮到后面還會(huì)有類似的IP訪問(wèn),那我干脆直接寫(xiě)一個(gè)自動(dòng)封IP的腳本,IP封了肯定需要自動(dòng)解封,所以,我的腳本主要邏輯是:

1)每分鐘查一下過(guò)去1分鐘的日志,對(duì)IP進(jìn)行分析,將訪問(wèn)量大于400的給封掉;

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

#! /bin/bash
#定義1分鐘以前的時(shí)間,用于過(guò)濾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)訪問(wèn)量高于400的ip記錄到一個(gè)臨時(shí)文件中
#過(guò)濾掉白名單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


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


    #當(dāng)ip數(shù)大于0時(shí),才會(huì)用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()
{
    #首先將包個(gè)數(shù)小于5的ip記錄到一個(gè)臨時(shí)文件里,把它們標(biāo)記為白名單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
    #當(dāng)解封完白名單IP后,將計(jì)數(shù)器清零,進(jìn)入下一個(gè)計(jì)數(shù)周期
    /usr/sbin/iptables -Z
}


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


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

然后寫(xiě)一個(gè)每分鐘都執(zhí)行的任務(wù)計(jì)劃就可以啦。





審核編輯:劉清

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

    關(guān)注

    0

    文章

    137

    瀏覽量

    24356

原文標(biāo)題:分享一個(gè)自動(dòng)封IP的腳本

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    介紹10個(gè)Python自動(dòng)腳本

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

    10個(gè)殺手級(jí)的Python自動(dòng)腳本

    今天浩道跟大家分享10個(gè)日常工作中用到的python自動(dòng)腳本。讓你感受番python簡(jiǎn)單強(qiáng)大之處!
    發(fā)表于 11-28 11:07 ?665次閱讀

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

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

    寫(xiě)個(gè)自動(dòng)化重啟服務(wù)腳本

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

    10個(gè)殺手級(jí)的Python自動(dòng)腳本分享

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

    分享10個(gè)實(shí)用的Python自動(dòng)腳本

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

    網(wǎng)站總被攻擊?寫(xiě)個(gè)自動(dòng)封禁IP腳本給你

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

    通過(guò)個(gè)腳本搞懂fork、source和exec

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

    ip腳本進(jìn)化的解決辦法

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

    keil自動(dòng)化編譯腳本

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

    如何使用腳本完成CRC和填充值的自動(dòng)完成

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

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

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

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

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

    編寫(xiě)個(gè)點(diǎn)名器腳本

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

    個(gè)簡(jiǎn)單的Shiro RCE檢測(cè)和利用腳本

    個(gè)簡(jiǎn)單的Shiro RCE檢測(cè)和利用腳本
    的頭像 發(fā)表于 01-09 09:46 ?571次閱讀