मेरे सर्वर पर SSH के माध्यम से अवैध रूप से पहुँचने की कोशिश करने वाले किस देश से हैं!
नमस्ते, मैं अक्षम हूँ। मैंने Vultr के FreeBSD सर्वर को सार्वजनिक किया है, और मैं यह जानने के लिए उत्सुक था कि SSH के माध्यम से पहुँचने की कोशिश करने वाले लोग कौन हैं। वैसे, FreeBSD के मामले में, यह आपके डोमेन पर "security run output" के रूप में जानकारी भेजता है, जिससे आपको पता चलता है कि क्या प्रयास किए गए हैं।

कुछ ऐसा। तो, आइए geoip का उपयोग करके देखें कि ये लोग, जो कोशिश कर रहे हैं, किस देश के ग्लोबल IP पते से हैं। वैसे, geoiplookup कमांड को इस प्रकार इंस्टॉल किया जा सकता है:
sudo pacman -S geoip
कमांड यह है:
$ geoiplookup IPアドレス
GeoIP Country Edition: RU, Russian Federation
बैश में टेक्स्ट को फॉर्मेट करना
तो, सबसे पहले, हम मूल डेटा "security run output" स्ट्रिंग को अपने ThinkPad पर लाएंगे और फिर उसे फॉर्मेट करेंगे।
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 का उपयोग करके, मैंने अंतिम रिकॉर्ड में केवल IP पते को निकाला, sort और uniq का उपयोग करके डुप्लिकेट IP हटाए, और इसे 'grepip' नामक फ़ाइल में लिखा। और फिर, आइए बैश में इस IP के लिए 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, एक उपयोगी Python लाइब्रेरी का उपयोग करके चार्ट प्रदर्शित करेंगे। इंस्टॉलेशन और कोड
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 से अधिक के असंभव पोर्ट नंबरों पर इतने सारे प्रयास हो रहे हैं...? तो, आज के लिए बस इतना ही। फिर मिलेंगे।