在網絡安全日益受到重視的今天,如何有效防范惡意流量和攻擊成為了每個網站管理員必須面對的問題。惡意流量不僅會影響網站的正常運行,還可能導致服務器崩潰,給網站帶來不可估量的損失。為了應對這一問題,我們特別推出了一款實用的Bash腳本,能夠自動封禁請求量異常的IP,并在半小時后恢復正常時解除封禁。下面,讓我們一起來詳細了解一下這個腳本的工作原理和使用方法吧!
腳本概述
這款腳本通過分析Web訪問日志,自動找出請求量異常的IP地址,并利用iptables進行封禁。當IP在半小時后恢復正常時,腳本會自動解除封禁。這樣,既能有效防范惡意流量,又能避免誤封正常用戶的IP。
完整腳本:
#!/bin/bash ################################################################################ ####
#根據web訪問日志,封禁請求量異常的IP,如IP在半小時后恢復正常,則解除封禁 ################################################################################ ####
logfile=/data/log/access.log
#顯示一分鐘前的小時和分鐘
d1=`date -d "-1 minute" +%H%M`
d2=`date +%M`
ipt=/sbin/iptables
ips=/tmp/ips.txt
block()
{
#將一分鐘前的日志全部過濾出來并提取IP以及統計訪問次數
grep '$d1:' $logfile|awk '{print $1}'|sort -n|uniq -c|sort -n > $ips #利用for循環將次數超過100的IP依次遍歷出來并予以封禁
for i in `awk '$1>100 {print $2}' $ips`
do
$ipt -I INPUT -p tcp --dport 80 -s $i -j REJECT
echo "`date +%F-%T` $i" >> /tmp/badip.log
done
}
unblock()
{ #將封禁后所產生的pkts數量小于10的IP依次遍歷予以解封
for a in `$ipt -nvL INPUT --line-numbers |grep '0.0.0.0/0'|awk '$2<10 {print
$1}'|sort -nr`
do
$ipt -D INPUT $a
done
$ipt -Z
}
#當時間在00分以及30分時執行解封函數
if [ $d2 -eq "00" ] || [ $d2 -eq "30" ]
then #要先解再封,因為剛剛封禁時產生的pkts數量很少 unblock
block
else
block
fi
腳本詳解
-
設置日志文件路徑和工具路
logfile=/data/log/access.log
ipt=/sbin/iptables
ips=/tmp/ips.txt
這里我們設置了Web訪問日志文件的路徑、iptables工具的路徑以及一個臨時文件用于存儲提取出的IP地址和訪問次數。
-
提取并封禁異常IP
在block
函數中,腳本首先通過grep
和awk
命令提取出一分鐘前的日志中的IP地址,并統計每個IP的訪問次數。然后,利用awk
命令篩選出訪問次數超過100的IP地址,并通過iptables進行封禁。???????
block()
{
grep '$d1:' $logfile|awk '{print $1}'|sort -n|uniq -c|sort -n > $ips
for i in `awk '$1>100 {print $2}' $ips`
do
$ipt -I INPUT -p tcp --dport 80 -s $i -j REJECT
echo "`date +%F-%T` $i" >> /tmp/badip.log
done
}
這段代碼的工作原理如下:
-
使用
grep
命令從日志文件中提取出包含特定時間戳的行。 -
通過
awk
命令提取IP地址,并使用sort
和uniq
命令進行排序和去重。 -
再次使用
awk
命令篩選出訪問次數超過100的IP地址。 -
利用iptables的
-I INPUT
命令將這些IP地址添加到INPUT鏈的開頭,并設置REJECT策略,阻止這些IP地址的訪問請求。 -
將被封禁的IP地址和時間戳記錄到
/tmp/badip.log
文件中,以便后續跟蹤和審查。
-
解封恢復正常的IP
在unblock
函數中,腳本通過iptables查看當前INPUT鏈的規則,找出那些被封禁后產生的數據包數量小于10的IP地址,并予以解封。???????
unblock()
{
for a in `$ipt -nvL INPUT --line-numbers |grep '0.0.0.0/0'|awk '$2<10 {print $1}'|sort -nr`
do
$ipt -D INPUT $a
done
$ipt -Z
}
這段代碼的工作原理如下:
-
使用
iptables -nvL INPUT --line-numbers
命令查看INPUT鏈的詳細規則和行號。 -
通過
grep
命令篩選出目標地址為0.0.0.0/0的規則,即那些被封禁的IP地址。 -
使用
awk
命令提取出數據包數量小于10的規則的行號。 -
利用iptables的
-D INPUT
命令將這些規則從INPUT鏈中刪除,從而解封對應的IP地址。 -
最后,使用
iptables -Z
命令將iptables的計數器清零。
-
定時執行解封和封禁操作
腳本的最后部分是一個條件判斷語句,用于在特定的時間(每小時的00分和30分)執行解封操作,并在其他時間執行封禁操作。這樣可以確保被封禁的IP地址在半小時后恢復正常訪問。
使用方法
-
將以上腳本保存為一個文件(例如:
block_unblock_ips.sh
)。 -
為腳本添加執行權限:
chmod +x block_unblock_ips.sh
。 -
將腳本添加到cron定時任務中,以便每小時自動執行。例如,在crontab文件中添加以下行:
0,30 * * * * /path/to/block_unblock_ips.sh
。這將確保腳本在每小時的00分和30分執行一次。 -
根據需要調整腳本中的日志文件路徑、iptables路徑以及其他相關配置。
-
運行腳本并觀察其效果。如果發現誤封或漏封的情況,可以適當調整訪問次數的閾值或其他相關參數。
結語
這款自動封禁和解封異常IP的腳本為網站管理員提供了一個有效的工具來應對惡意流量和攻擊。通過合理的配置和使用,可以大大降低惡意流量對網站的影響,提高網站的安全性和穩定性。希望這款腳本能成為您網站安全防護的有力武器!