やけにサイトが重かったりメールが送信できなかったりしたときにサーバー内の接続状況を確認すると、同じIPから大量の接続があったりしますよね。そのようなときはIPをブロックしますが、IPによってはブロックできないことってありますよね。
私の場合、毎回IPの情報を確認してからブロックしています。しかしIPの数によっては大変なので今回はシェルスクリプトで一回で作業を済ますコードを書いてみました。
コードを書く際に至って、https://ipinfo.io を借りています。1日1000件まではIPの情報を取得できるらしい。
ipblocker.sh
#/bin/bash
ip=`ss -t | awk -F : '{print$2}' | awk '{print$2}' | grep -v Peer | sort | uniq`
for i in `echo $ip`
do
cn=`curl https://ipinfo.io/"$i" | grep country | awk '{print$2}'`
echo $i
echo $cn
if [ "$cn" = "\"JP\"," ]; then
echo "nonblock_JP"
elif [ `curl https://ipinfo.io/"$i" | grep org | awk '{print$3}'` = "Google" ]; then
echo "nonblock_Google"
elif [ `curl https://ipinfo.io/"$i" | grep ip | awk '{print$2}'` = "\"127.0.0.1\"," ]; then
echo "nonblock_loopback"
else
echo "iptables -I INPUT -s $i -j DROP"
iptables -I INPUT -s $i -j DROP
fi
done
コードの内容としては、ss コマンドでIPを取得してから、
日本とGoogle、ループバックに関するIP以外だったらブロックする内容になっています。
ブロックした内容は iptables -nL とかで確認してみてください。