先日、Rejected IP Log Analysis (IP/ホスト名検索)というサイトをひっそり立ち上げました。今のところやっているのは自宅の公開サーバー(service.test.p-fox.jp)にアタックしてくる方々を収集するというものです。その中でも少し気になったものがありました。
頻繁にポートスキャンを行ってくるサーバー
どんな用件があるのか全く分かりませんが、海外サーバーから毎回毎回IPアドレスを変えて、頻繁にポートスキャンが行われます。別に開けて困るポートはないのですが、あまりにしつこいとこちらとしても気味が悪いものです。試しにCSVに落としてみたところ、すさまじい記録でした。
- hosted-by.pfcloud[.]io:3715回
- hosting-by.4cloud[.]mobi:1148回
ダントツの一位はpfcloud.ioさんです。おめでとうございます。何も嬉しくありませんが・・・。というわけで詳しく調べてみます。Cloudflare先生によると、pfcloudはドイツに拠点を置くホスティングサーバーのようです。AbuseIPDBでは見事なまでに真っ赤っかです。このようなサービスから接続されても何も嬉しくありません。ルーター側で明示的にルーティング設定したところ、30秒間隔で違うIPアドレスから延々とポートスキャンが行われます。別に困るわけではないのですが、しつこいです幾らなんでも。
ウェブサイト自体は普通のホスティングサービスそのものですが、検索するとやはり悪用されているらしく、TELNETやSSHにポートスキャンとログイン施行を仕掛けてきたり、フィッシングメール配信したり、Webシェルを送ってくるようです。原因で推察されるのは脆弱なサイト放置してWebシェル置かれてBOT化したとかその手合いですが、あまりに量が多すぎて手に負えません。残念ですがCIDRでブロックすることにしました。
IPアドレスの割り当てを受けている業者さんのようなので、Cloudflare Radarで割り当てIPアドレスを確認します。結構な数の割り当てを受けているようなので、これをそのままRTX1200のブロックリストに放り投げます。最終的にアタックの多かったこのあたりにご退場いただきました。
ip filter 50000 reject 3.148.147.222 * * * *
ip filter 50001 reject 1.206.197.55 * * * *
ip filter 50002 reject 199.45.154.131 * * * *
ip filter 50003 reject 116.58.254.0/24 * * * *
ip filter 50004 reject 79.124.62.0/24 * * * *
ip filter 50005 reject 176.65.148.0/24 * * * *
ip filter 50006 reject 204.76.203.0/24 * * * *
ip filter 50007 reject 5.189.160.0/20 * * * *
ip filter 50008 reject 94.74.191.0/24 * * * *
ip filter 50009 reject 176.65.149.0/24 * * * *
ip filter 50010 reject 176.65.151.0/24 * * * *
ip filter 50011 reject 176.65.132.0/24 * * * *
ip filter 50012 reject 45.135.193.0/24 * * * *
ip filter 50013 reject 45.135.194.0/24 * * * *
ip filter 50014 reject 45.153.34.0/24 * * * *
ip filter 50015 reject 45.156.87.0/24 * * * *
これでこのIPアドレスからのアクセスはルーティング段階でお断りすることになりました。もう二度と接続できません。
おまけ:IPアドレスからCIDRを作るpython
そのほか変なパケット投げてくる奴がいるので、IPアドレス放り込んだらCIDRに変換してくれるスクリプトを。使い方は簡単です。IPアドレス渡して範囲(基本は24)を渡せばCIDR変換してくれます。
#!/usr/bin/python
import ipaddress
import sys
def ip_to_cidr(ip_address, prefix_length):
"""
IPアドレスとプレフィックス長から、対応するCIDRネットワークアドレスを計算します。
Args:
ip_address (str): 変換したいIPアドレス (例: '94.74.191.158')
prefix_length (int): ネットワークプレフィックス長 (例: 24)
Returns:
str: CIDR表記のネットワークアドレス、またはエラーメッセージ
"""
try:
# IPアドレスとプレフィックス長を結合してネットワーク文字列を作成
network_str = f"{ip_address}/{prefix_length}"
# ip_networkオブジェクトを作成。
# strict=Falseにすることで、入力IPがネットワークアドレスでなくても受け入れます。
network = ipaddress.ip_network(network_str, strict=False)
# ネットワークアドレスをCIDR表記の文字列として返します
return str(network)
except ValueError as e:
# IPアドレスやプレフィックス長が無効な場合のエラー処理
return f"エラー: 無効な入力です。 {e}"
if __name__ == "__main__":
# コマンドライン引数 (IPアドレスとプレフィックス長) のチェック
if len(sys.argv) < 3:
print("使い方: python ip2cidr.py <IPアドレス> <プレフィックス長>")
print("例 (94.74.191.158を/24で変換): python ip2cidr.py 94.74.191.158 24")
sys.exit(1)
ip_input = sys.argv[1]
prefix_input = sys.argv[2]
# プレフィックス長を整数に変換
try:
prefix_int = int(prefix_input)
except ValueError:
print(f"エラー: プレフィックス長 '{prefix_input}' は数値である必要があります。")
sys.exit(1)
# CIDR変換を実行
cidr_result = ip_to_cidr(ip_input, prefix_int)
if cidr_result.startswith("エラー"):
print(cidr_result)
else:
print(f"入力IPアドレス: {ip_input}")
print(f"プレフィックス長: /{prefix_int}")
print("-" * 30)
print(f"CIDRネットワーク: {cidr_result}")例
$ ./.local/bin/ip2cidr 79.124.58.246 24
入力IPアドレス: 79.124.58.246
プレフィックス長: /24
------------------------------
CIDRネットワーク: 79.124.58.0/24




