Skip to main content

ufwを用いて攻撃してくるIPアドレスをブロックする。

概要

  1. 外部に公開しているサーバは、常に不審な攻撃に晒されます。これは、怪しいIPアドレスからのアクセスをブロックするためのスクリプトです。
  2. ufwを用いていることが前提です。
  3. このスクリプトは、/24や/16と、レンジを広げて遮断することができます。
  4. 広範囲なブロックはポリシーと併せて確認ください。
  5. また、ufwを扱うため、管理者権限で実行します。

スクリプト内容

  • ufw_deny.sh
#!/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
  1. ブロックしたいIPアドレスがプロンプトに出てきます。
  2. IPv4アドレスを指定します。
  3. そのままか(0)/24(1)ごとブロックするか、/16(2)でブロックするかを質問しますので、0/1/2で答えます。
  4. 確認をy/nで聞いてきますので、入力をします。
  5. yならufwに、指定したIPアドレス(NWアドレス)を追加します。
  6. 別のIPをブロックするかy/nで聞いてきますので、こちらも入力します。
  7. 現在のブロック状況をy/nで尋ねられます。yならufwのブロック状況を表示してスクリプトが終了します。
  8. nならufwのブロック状況を表示せずスクリプトが終了します。