是谁在尝试通过SSH非法访问我的服务器,他们来自哪个国家!
大家好,我是无能。我公开了我的Vultr FreeBSD服务器,我很好奇那些试图通过SSH连接的人到底是谁。顺便说一下,在FreeBSD的情况下,它会以“security run output”的形式发送到我的域名,告诉我发生了哪些尝试。

就是这样。所以,让我们使用geoip来看看这些试图进行尝试的人的全球IP地址来自哪个国家。顺便说一下,geoiplookup命令可以按如下方式安装:
sudo pacman -S geoip
命令是这个
$ geoiplookup IPアドレス
GeoIP Country Edition: RU, Russian Federation
使用bash进行文本格式化
那么首先,我们将原始数据“security run output”字符串带到我的ThinkPad(或其他任何地方),然后进行格式化。
cat vultr | grep -oP "from.*port" | awk '{print $(NF-1)}' | sort | uniq > grepip
在上述情况下,我们从名为vultr的“security run output”描述中,使用grep的-o选项匹配值,并使用-P选项的Perl正则表达式,提取包含从“from”到“port”字符串的描述。
会变成如下字符串的样子:
from IPアドレス port
此时不使用awk的原因是,如果以空格作为分隔符,当密码错误或服务器上根本不存在目标用户时,错误输出会发生变化,因此我提取了从“from”到“port”的字符串以捕获所有情况。接下来,我使用awk提取了最后一个记录中的IP地址,通过sort和uniq删除了重复的IP,并将其写入名为grepip的文件中。然后,让我们使用bash对这些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清晰地显示图表
嗯,虽然在字符串上可以看懂,但当数量增多时会变得难以阅读,所以我们希望以图表形式显示,对吧?
此外,如果将其脚本化,也可以作为cron作业生成。因此,我们将使用方便的Python库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以上这种不太可能的端口号呢……?那么,今天就到这里。下次再见。