公網服務器必備--ssh auto deny
問題?
公網上的服務器被一群無聊的人做密碼爆破(我曾經也是其中的一員??).
雖然大概率是不會被突破的,但是還是小心為上,所以這一期來看看怎么自動化封ip
不啰嗦直接跳到 ssh 自動封禁
找日志
首先我們需要找具體是什么服務正在被爆破,目前最多的是ssh服務,因為一般服務器都會開啟ssh來讓你遠程登陸,當然如果有遠程桌面需求的話xrdc/vnc服務可能也會開起來
我們以ssh為例:
ssh的守護進程是sshd,由systemd管理(大部分服務都是systemd管理的,xrdc/vnc也是)
一般而言可以通過journalctl來查看日志
journalctl -u sshd
或者你連接來普羅米修斯之類的監控軟件可以用他們來監控日志
可以看到日志的特征如下

可以看到我截圖的這里就有人在嘗試密碼 (Failed開頭的)
然后我們需要找到對應服務的日志文件,以便分析日志文件來過來ip地址
劇透一下 ubuntu22 的sshd的日志記錄在 /var/log/auth.log
找到包含Failed的行,過濾出ip地址,以及ip錯誤的次數
cat /var/log/auth.log|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}'
封ip
linux上面有一個/etc/hosts.deny文件,可以用來封ip
我們只需要找到上面日志中的ip,然后校驗ip是否已經被封,如果沒有,則將ip寫入這個文件
為什么要判斷ip是否已經被封禁
我們會每隔一段時間讀取一下日志文件,封禁有問題的ip,所以以前封禁過的ip還是會捕捉到
ssh 自動封禁
這里就直接給出腳本
cat /var/log/auth|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /black.list
for i in `cat /black.list`
do
IP=`echo $i |awk -F= '{print $1}'`
NUM=`echo $i|awk -F= '{print $2}'`
echo $IP=$NUM
if [ $NUM -gt 10 ]; then
grep $IP /etc/hosts.deny > /dev/null
if [ $? -gt 0 ];then
echo "sshd:$IP:deny" >> /etc/hosts.deny
fi
fi
done
其中black.list是一個臨時文件,隨便放哪兒都可以
自動執行腳本
使用crontab -e 打開cron 的編輯器,在最后添加如下
0 */1 * * * sh /腳本絕對路徑.sh
這表示1小時執行一次

浙公網安備 33010602011771號