fail2ban でbanしたIPが有効なものでないか確認する

VPSを使って、WEBを公開すると不正なアクセスが大量にありfail2ban等のソフトを使用して防御する必要がある。(ありがとうfail2ban)
ただし、有効なIPをbanしてしまっていないかは気になるところ。
Gemini を使って、対象IPをチェックするツールを、python で作ってもらった。
banしたIPは増えていくので、差分のチェックができるようにしてあります。

日本以外からのアクセスは基本的には無視(日本語のサイト前提なので)。
日本のIPは、プロバイダ名と都市を出力する。AWSなどで乗っ取られているIPもありそうなので最後は、ログを詳細に確認して感覚での判断になると思います。
以下のコードのIPはたまたまbanしていたIPです。以下実行すると1件だけ出力されます。

import subprocess
import time
import json

#### ReadMe ######
# IP_Base にfail2ban の出力を入れる
# IP_OLD は、前回の出力(既にNGとして良いことを検証済み)を入れる
# 差分について、チェックし、日本のIPについては出処を詳細に出力する


# IPアドレスのリスト
IP_BASE = [
"157.254.237.17",
"171.243.86.21",
"13.112.209.189",
"165.232.144.26"
]

# 削除したいIPアドレスのリスト
IP_OLD = [
"157.254.237.17",
"171.243.86.21",
"165.232.144.26"
]

# APIのURL
API_URL = "https://ipinfo.io/"

# セットに変換することで、高速な検索が可能になる
IP_OLD_SET = set(IP_OLD)

# IP_OLDに存在しないIPアドレスのみを抽出
IP_LIST = [ip for ip in IP_BASE if ip not in IP_OLD_SET]

# 結果を出力
other_count = 0

for ip in IP_LIST:

    response=subprocess.check_output(["curl", "-s", f"{API_URL}{ip}/json"]).decode()
     # JSON形式の情報をパース
    data = json.loads(response)
    if data["country"] == "JP":
        # 出力
        print( f"{data['ip']}  プロバイダ:{data['org']}  CITY:{data['city']}")
    else:
        other_count += 1

    # 公開サーバの負荷を考慮してスリープする
    time.sleep(2)

print("-------------")
print(f"JP以外: {other_count}個")

有効なIPをbanしている場合は、以下のページを参考にunbanする。

https://blog.knaga.click/2024/01/fail2ban-%e3%81%a7%e3%82%84%e3%81%a3%e3%81%a6%e3%81%97%e3%81%be%e3%81%a3%e3%81%9f%e3%82%89/

Xserver が お友達紹介割引 で申込みが可能になります。

コメント

タイトルとURLをコピーしました