コンテンツへスキップ

ブログのスパム攻撃とか変なアクセスが気になるので、日本とgoogle以外のIPをブロックするスクリプトを作りました。
テスト環境でうまくいっているみたいなので、アップ
ipblker

#!/bin/bash
#ssコマンドで15個までのIPを取得します。
ip=`/usr/sbin/ss -t | awk -F : '{print$2}' | awk '{print$2}' | grep -v Peer | sort | uniq | head -n 15`
echo "$ip"
echo "$ip" > /root/ipblk/ip_listold

#whitelistに記録されているIPを除外しip_listoldとして吐き出します。
for i in `cat /root/ipblk/whitelist`
do
cat /root/ipblk/ip_listold | grep -v "$i" > /root/ipblk/ip_listold1
cat /root/ipblk/ip_listold1 > /root/ipblk/ip_listold
cat /root/ipblk/ip_listold
cat /root/ipblk/ip_listold | wc -l
echo ""
echo "$i"
echo ""
done

#ip_listoldから日本とgoogleのIPをwhitelistに追加します
#それ以外をブロックし、blacklistに追加します
ipl=`cat /root/ipblk/ip_listold`
for i in `echo "$ipl"`
do

curl -kfsS https://ipinfo.io/"$i"/country >> /root/ipblk/ip_country
if [[ "$?" -eq 0 ]]; then
  echo "終了コードは0です 1"
   if [[ `tail -n 1 /root/ipblk/ip_country` = JP ]]; then
      echo "nonblock_JP"
      echo "$i"
      echo "$i" >> /root/ipblk/whitelist
      continue
   else
     echo 日本ではない
    fi
elif [[ "$?" -ne 0 ]]; then
  echo "終了コードは0以外です 1"
  continue
fi

curl -kfsS https://ipinfo.io/"$i"/ | grep org | awk '{print$3}' >> /root/ipblk/ip_org
if [[ "$?" -eq 0 ]]; then
  echo "終了コードは0です 2"
   if [[ `tail -n 1 /root/ipblk/ip_org` = "Google" ]] && [[ `host "$i" | awk -F . '{print$7}'` = "googlebot" ]]; then
      echo "nonblock_Google"
      echo "$ip"
      echo "$ip" >> /root/ipblk/whitelist
       continue
   else
      echo googleではない
   fi

  elif [[ "$?" -ne 0 ]]; then
      echo "終了コードは0以外です 2"
  continue
fi

curl -kfsS https://ipinfo.io/"$i"/ip >> /root/ipblk/ip_ip
if [[ "$?" -eq 0 ]]; then
  echo "終了コードは0です 3"
   if [[ `tail -n 1 /root/ipblk/ip_ip` = "127.0.0.1" ]]; then
      echo "nonblock_loopback"
      continue
   else
      echo `tail -n 1 /root/ipblk/ip_country`
      echo /sbin/iptables -I INPUT -s $i -j DROP
      echo iptables -I INPUT -s $i -j DROP >> /root/ipblk/blacklist
   fi
  elif [[ "$?" -ne 0 ]]; then
      echo "終了コードは0以外です 3"
      echo 127.0.0.1ではない
  continue
fi

done

と、 ipinfo.io 様からIPの情報を取得しています。
後半の行でIPをブロックしますが、
テストを兼ねてechoを付けていますので、
実際に実行される場合は、echoを外してください。

echo iptables -I INPUT -s $i -j DROP
iptables -I INPUT -s $i -j DROP

次に上記のスクリプトをcronに設置します。

cd /var/spool/cron/crontabs/
vim root
*/1 * * * * /root/ipblk/ipblker

エラー通知のみ受信したい場合
*/1 * * * * /root/ipblk/ipblker 1> /dev/null

全ての通知を受信しない場合
*/1 * * * * /root/ipblk/ipblker >/dev/null 2>$1

cronのログ自体を確認したい場合

vim /etc/rsyslog.d/50-default.conf

#cron.*                          /var/log/cron.log
コメントされている場合外してあげます。
cron.*                          /var/log/cron.log


テスト用としてcronを1分に一回と設定していますが、
ipinfo.ioの1日に取得できるIPは無料だと1000回までなので、
それを超えない設定にします。
今回の場合、1回につき最大IPを15個まで取得できるように設定しているので、
30分に一回、ipblkerを実行します。

*/30 * * * * /root/ipblk/ipblker 1> /dev/null

何かエラー通知あれば、確認して調整していく予定です。

VPSのubuntu20.04にてメールサーバーを立てた後に、thunderbirdのメール設定でPOPサーバーの認証方式で「暗号化されたパスワード認証」に設定すると接続ができなかった。原因を調べてみたら、cram-md5でSMTP認証が廃止されたとの記事がちらほら。とはいえ、VPSなので自分で、cram-md5を設定した上でメールの設定を試してみたらところ、下記エラーログを吐いた。
auth: Fatal: CRAM-MD5 mechanism can't be supported with given passdbs
少なくともubuntu20.04ではCRAM-MD5のサポートをしていないようだ。
結局「通常のパスワード認証」でもポートがTLSの数値なら問題ないとのことなので、このままメールを使おうと思う。
参考
https://goope.jp/info/maintenance/?id=619