আমার সার্ভারে SSH এর মাধ্যমে অবৈধভাবে অ্যাক্সেস করার চেষ্টা করছে কারা!
নমস্কার, আমি মুনো। আমি একটি Vultr FreeBSD সার্ভার প্রকাশ্যে রেখেছি, এবং আমি কৌতূহলী যে কারা SSH সংযোগের চেষ্টা করছে। প্রসঙ্গত, FreeBSD এর ক্ষেত্রে, এটি আপনার ডোমেইনে একটি "security run output" পাঠায়, যা আপনাকে যেকোনো প্রচেষ্টা সম্পর্কে অবহিত করে। 
এইরকম। তাহলে, চলুন geoip ব্যবহার করে দেখি এই সংযোগের চেষ্টা করা ব্যক্তিরা কোন দেশের গ্লোবাল আইপি ঠিকানা থেকে আসছে। প্রসঙ্গত, geoiplookup কমান্ডটি নিম্নোক্তভাবে ইনস্টল করা যেতে পারে:
sudo pacman -S geoip
কমান্ডটি এটি
$ geoiplookup IPアドレス
GeoIP Country Edition: RU, Russian Federation
bash দিয়ে টেক্সট ফরম্যাটিং
তাহলে প্রথমে, মূল ডেটা "security run output" এর স্ট্রিংটি আমার থিঙ্কপ্যাডে (বা যেকোনো মেশিনে) নিয়ে আসি এবং তারপর এটি ফরম্যাট করি।
cat vultr | grep -oP "from.*port" | awk '{print $(NF-1)}' | sort | uniq > grepip
উপরের ক্ষেত্রে, "vultr" নামক "security run output" এর বর্ণনা থেকে, আমরা grep এর -o দিয়ে ম্যাচিং এবং -P দিয়ে পার্ল রেগুলার এক্সপ্রেশন ব্যবহার করে "from" স্ট্রিং থেকে "port" পর্যন্ত থাকা বর্ণনাগুলি বের করি।
এটি নিম্নলিখিত স্ট্রিং এর মতো দেখাবে:
from IPアドレス port
এই পর্যায়ে awk ব্যবহার না করার কারণ হল, যদি স্পেসকে ডিলিমিটার হিসেবে ব্যবহার করা হয়, তাহলে পাসওয়ার্ড ভুল হলে এবং আমার সার্ভারে টার্গেট ইউজার না থাকলে এরর আউটপুট ভিন্ন হবে, তাই সবকিছু ধরার জন্য আমি "from" থেকে "port" পর্যন্ত স্ট্রিংটি বের করেছি। এরপর, আমি awk ব্যবহার করে শেষ রেকর্ডের শুধুমাত্র আইপি ঠিকানাটি বের করি, sort এবং uniq দিয়ে ডুপ্লিকেট আইপিগুলি সরিয়ে ফেলি, এবং তারপর এটি grepip নামক একটি ফাইলে লিখি। এরপর, bash ব্যবহার করে এই আইপিগুলির উপর geoiplookup চালানোর পর দেশ অনুযায়ী একটি হালকা গণনা করা যাক।
$ cat country.sh
#!/bin/bash
# IPアドレスのファイル
INPUT="grepip"
# 出力ファイル
OUTPUT="countries.log"
# 初期化
> $OUTPUT
# 各IPアドレスに対してgeoiplookupを実行し、国情報を取得
while IFS= read -r ip; do
geoiplookup "$ip" | awk -F: '{print $2}' >> $OUTPUT
done < "$INPUT"
# 国情報を集計して表示
sort $OUTPUT | uniq -c | sort -tr
এখন, এক্সিকিউশন পারমিশন দিন।
chmod +x ./country.sh
শুধু এটি এক্সিকিউট করুন।
$ ./country.sh
1 BE, Belgium
1 BG, Bulgaria
1 BR, Brazil
1 CH, Switzerland
1 HK, Hong Kong
1 HU, Hungary
1 IR, Iran, Islamic Republic of
1 IT, Italy
1 LT, Lithuania
1 MT, Malta
1 MX, Mexico
1 MY, Malaysia
1 NO, Norway
1 PA, Panama
1 PE, Peru
1 SE, Sweden
1 SK, Slovakia
1 TH, Thailand
1 TM, Turkmenistan
1 TZ, Tanzania, United Republic of
1 UZ, Uzbekistan
1 ZA, South Africa
2 RO, Romania
2 UA, Ukraine
3 PL, Poland
6 GB, United Kingdom
7 VN, Vietnam
8 CA, Canada
8 ID, Indonesia
9 RU, Russian Federation
9 SG, Singapore
10 FR, France
10 KR, Korea, Republic of
11 DE, Germany
11 NL, Netherlands
16 CN, China
18 IN, India
43 US, United States
হুম, বুঝলাম...
Matplotlib দিয়ে সহজে চার্ট প্রদর্শন
আচ্ছা, টেক্সট থেকে আমরা বুঝতে পারছি, কিন্তু সংখ্যা বেশি হলে এটি পড়তে অসুবিধা হয়, তাই আমরা এটিকে চার্ট হিসাবে প্রদর্শন করতে চাই, তাই না?
এছাড়াও, যদি আমরা এটিকে স্ক্রিপ্ট করি, তাহলে এটি একটি ক্রন জব হিসাবে তৈরি করা যেতে পারে। সুতরাং, আসুন একটি সুবিধাজনক পাইথন লাইব্রেরি Matplotlib ব্যবহার করে চার্ট প্রদর্শন করি। ইনস্টলেশন এবং কোড:
pip install matplotlib
cat AreYouFrom.py
#!/usr/bin/python3
import matplotlib.pyplot as plt
import collections
# ファイルを読み込み、国ごとにアクセス数を集計
country_counts = collections.Counter()
with open('countries.txt', 'r') as file:
for line in file:
# 国情報を取得
country = line.strip().split(",")[1]
country_counts[country] += 1
# データをソート
countries, counts = zip(*country_counts.most_common())
# グラフを作成
plt.figure(figsize=(10, 6))
plt.bar(countries, counts, color='skyblue')
plt.xlabel('Country')
plt.ylabel('Accesses')
plt.title('Accesses by Country')
plt.xticks(rotation=90)
plt.tight_layout()
# pngファイルとして画像出力
plt.savefig('accesses.png')
এটি চার্ট আউটপুট এবং ইমেজ আউটপুট সক্ষম করে।
chmod +x AreYouFrom.py
(কী একটা ফাইলের নাম, যেন মিডল স্কুলের ইংরেজি!)

দেদেডন! মনে হচ্ছে মার্কিন যুক্তরাষ্ট্র থেকে সবচেয়ে বেশি চেষ্টা করা হচ্ছে।
SSH এর জন্য চেষ্টা করা পোর্ট অনুযায়ী সমষ্টি
এখন, অ্যাক্সেসের জন্য চেষ্টা করা পোর্ট অনুযায়ী পরীক্ষা করা যাক।
এর মাধ্যমে, আমি শুধুমাত্র পোর্টগুলি grep করতে পেরেছি।
cat vultr | grep -oP "port [123456789].*ssh2$" | grep -oP "[123456789].* "
এটি ports.txt হিসাবে আউটপুট করুন।
তবে, যেহেতু সমস্ত পোর্ট নম্বর ভিন্ন, তাই প্লট আউটপুটের সময় সেগুলিকে ব্লক অনুযায়ী আলাদা করা যাক।
$ cat AreYouPort.py
#!/usr/bin/python3
import matplotlib.pyplot as plt
from collections import Counter
# ポート番号をファイルから読み込む
with open('ports.txt', 'r') as file:
ports = [int(line.strip()) for line in file]
# ポート番号の頻度分布を計算
counter = Counter(ports)
blocks = {}
for port, count in counter.items():
block = (port // 10000) * 10000
if block not in blocks:
blocks[block] = 0
blocks[block] += count
# グラフを作成
x = list(blocks.keys())
y = list(blocks.values())
plt.figure(figsize=(12, 6))
plt.bar(x, y, width=6000, color='skyblue', edgecolor='black')
plt.xlabel('Port Number')
plt.ylabel('Frequency')
plt.title('Port Numbers by Frequency')
plt.xticks(x, [f'{i}-{i+9999}' for i in x], rotation=45)
plt.grid(True, axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
# PNGファイルに保存
plt.savefig('port_numbers.png')
এবং তারপর...
কেন 30,000 এর বেশি অসম্ভব পোর্ট নম্বরে এত বেশি চেষ্টা করা হচ্ছে...? ঠিক আছে, আজ এই পর্যন্তই। আবার দেখা হবে।