ufwを用いて攻撃してくるIPアドレスをブロックする。
概要
- 外部に公開しているサーバは、常に不審な攻撃に晒されます。これは、怪しいIPアドレスからのアクセスをブロックするためのスクリプトです。
- ufwを用いていることが前提です。
- このスクリプトは、/24や/16と、レンジを広げて遮断することができます。
- 広範囲なブロックはポリシーと併せて確認ください。
- また、ufwを扱うため、管理者権限で実行します。
スクリプト内容
#!/bin/bash
while true; do
# IPアドレスを尋ねる
read -p "ブロックしたいIPアドレスを入力してください: " ip_address
# ブロック範囲を尋ねる
read -p "IPアドレスをそのままブロックする場合は0、/24ごとにブロックする場合は1、/16ごとにブロックする場合は2を入力してください(空白エンターは0): " block_option
# 入力が空白の場合はデフォルトで0(IPアドレスそのまま)とする
block_option=${block_option:-0}
# ブロック範囲を計算
case $block_option in
1) block_cidr="/24" ;;
2) block_cidr="/16" ;;
*) block_cidr="" ;;
esac
# ネットワークアドレスに変換
if [[ -n "$block_cidr" ]]; then
if [[ $block_option == "1" ]]; then
# /24で区切る場合
network_address=$(echo $ip_address | cut -d'.' -f1-3)
# CIDR表記の生成 (/24)
cidr_notation="$network_address.0$block_cidr"
elif [[ $block_option == "2" ]]; then
# /16で区切る場合
network_address=$(echo $ip_address | cut -d'.' -f1-2)
# CIDR表記の生成 (/16)
cidr_notation="$network_address.0.0$block_cidr"
fi
else
cidr_notation="$ip_address"
fi
# 設定内容を確認する
echo "以下の内容でブロックを行います:"
echo "IPアドレス: $cidr_notation"
read -p "よろしいですか?(y/n): " confirm
# ユーザーが処理を続行しない場合、スクリプトを終了する
if [[ $confirm != "y" && $confirm != "Y" ]]; then
echo "処理を中止しました。"
exit 0
fi
# ブロックルールをufwに追加
sudo ufw deny from "$cidr_notation"
# エラーがあった場合はエラーメッセージを表示して終了
if [[ $? -ne 0 ]]; then
echo "ERROR: 不正なソースアドレス"
exit 1
fi
echo "ルールを付け加えました。"
# 他のIPをブロックするか尋ねる
read -p "他のIPをブロックしますか?(y/n): " continue_blocking
if [[ $continue_blocking != "y" && $continue_blocking != "Y" ]]; then
break
fi
done
# ufwを再読み込みする
sudo ufw reload
# ブロック状況を確認するか尋ねる
read -p "現在のブロック状況を確認しますか?(y/n): " check_status
if [[ $check_status == "y" || $check_status == "Y" ]]; then
sudo ufw status numbered
fi
# 終了メッセージを出す
echo "IPブロックを終了しました。"
実行例
sudo bash ufw_deny.sh
- ブロックしたいIPアドレスがプロンプトに出てきます。
- IPv4アドレスを指定します。
- そのままか(0)/24(1)ごとブロックするか、/16(2)でブロックするかを質問しますので、0/1/2で答えます。
- 確認をy/nで聞いてきますので、入力をします。
- yならufwに、指定したIPアドレス(NWアドレス)を追加します。
- 別のIPをブロックするかy/nで聞いてきますので、こちらも入力します。
- 現在のブロック状況をy/nで尋ねられます。yならufwのブロック状況を表示してスクリプトが終了します。
- nならufwのブロック状況を表示せずスクリプトが終了します。